PolarDB-for-PostgreSQL 基于Ceph共享存储的部署指南

PolarDB-for-PostgreSQL 基于Ceph共享存储的部署指南

PolarDB-for-PostgreSQL PolarDB-for-PostgreSQL 项目地址: https://gitcode.com/gh_mirrors/pol/PolarDB-for-PostgreSQL

前言

PolarDB-for-PostgreSQL是阿里云开源的一款云原生数据库系统,它采用了存储计算分离架构,其中存储层需要依赖共享存储系统。本文将详细介绍如何使用Ceph分布式存储系统作为PolarDB-for-PostgreSQL的共享存储后端。

Ceph存储系统简介

Ceph是一个高度可扩展的分布式存储系统,具有以下特点:

  • 统一的存储架构:支持块存储、文件系统和对象存储
  • 高可靠性:数据自动复制和恢复
  • 高性能:支持线性扩展
  • 自我修复:自动检测和修复数据损坏

这些特性使其非常适合作为PolarDB-for-PostgreSQL的底层存储系统。

环境准备

硬件要求

建议使用3台及以上物理机/虚拟机搭建Ceph集群,本教程以3节点为例:

| IP地址 | 主机名 | |-------------|--------| | 192.168.1.173 | ceph001 | | 192.168.1.174 | ceph002 | | 192.168.1.175 | ceph003 |

软件要求

  • 操作系统:CentOS 7.5及以上版本
  • Docker:用于运行Ceph容器化组件

基础环境配置

1. 安装Docker
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加Docker仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache

# 安装并启动Docker
yum install -y docker-ce
systemctl start docker
systemctl enable docker

# 验证安装
docker run hello-world
2. 配置SSH免密登录
# 生成SSH密钥
ssh-keygen

# 将公钥拷贝到各节点
ssh-copy-id root@ceph001
ssh-copy-id root@ceph002
ssh-copy-id root@ceph003

# 验证配置
ssh root@ceph003
3. 拉取Ceph镜像
docker pull ceph/daemon

Ceph集群部署

Monitor节点部署

Monitor(mon)是Ceph集群的管理节点,负责维护集群状态。

在ceph001上启动第一个mon节点
docker run -d \
    --net=host \
    --privileged=true \
    -v /etc/ceph:/etc/ceph \
    -v /var/lib/ceph/:/var/lib/ceph/ \
    -e MON_IP=192.168.1.173 \
    -e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
    --security-opt seccomp=unconfined \
    --name=mon01 \
    ceph/daemon mon
检查集群状态
docker exec mon01 ceph -s

如果出现安全警告,执行以下命令解决:

docker exec mon01 ceph config set mon auth_allow_insecure_global_id_reclaim false
生成必要的keyring文件
docker exec mon01 ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
docker exec mon01 ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
同步配置到其他节点
# 同步到ceph002
scp -r /etc/ceph root@ceph002:/etc
scp -r /var/lib/ceph/bootstrap* root@ceph002:/var/lib/ceph

# 同步到ceph003
scp -r /etc/ceph root@ceph003:/etc
scp -r /var/lib/ceph/bootstrap* root@ceph003:/var/lib/ceph
在其他节点启动mon服务
# 在ceph002上启动
docker run -d \
    --net=host \
    --privileged=true \
    -v /etc/ceph:/etc/ceph \
    -v /var/lib/ceph/:/var/lib/ceph/ \
    -e MON_IP=192.168.1.174 \
    -e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
    --security-opt seccomp=unconfined \
    --name=mon02 \
    ceph/daemon mon

# 在ceph003上启动
docker run -d \
    --net=host \
    --privileged=true \
    -v /etc/ceph:/etc/ceph \
    -v /var/lib/ceph/:/var/lib/ceph/ \
    -e MON_IP=192.168.1.175 \
    -e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
    --security-opt seccomp=unconfined \
    --name=mon03 \
    ceph/daemon mon

OSD节点部署

OSD(Object Storage Daemon)是Ceph中实际存储数据的服务。

OSD准备阶段

在每个节点上执行以下命令准备OSD:

docker run --rm --privileged=true --net=host --ipc=host \
    --security-opt seccomp=unconfined \
    -v /run/lock/lvm:/run/lock/lvm:z \
    -v /var/run/udev/:/var/run/udev/:z \
    -v /dev:/dev -v /etc/ceph:/etc/ceph:z \
    -v /run/lvm/:/run/lvm/ \
    -v /var/lib/ceph/:/var/lib/ceph/:z \
    -v /var/log/ceph/:/var/log/ceph/:z \
    --entrypoint=ceph-volume \
    docker.io/ceph/daemon \
    --cluster ceph lvm prepare --bluestore --data /dev/vdb
OSD激活阶段

在每个节点上激活OSD:

# 在ceph001上激活第一个OSD
docker run -d --privileged=true --net=host --pid=host --ipc=host \
    --security-opt seccomp=unconfined \
    -v /dev:/dev \
    -v /etc/localtime:/etc/localtime:ro \
    -v /var/lib/ceph:/var/lib/ceph:z \
    -v /etc/ceph:/etc/ceph:z \
    -v /var/run/ceph:/var/run/ceph:z \
    -v /var/run/udev/:/var/run/udev/ \
    -v /var/log/ceph:/var/log/ceph:z \
    -v /run/lvm/:/run/lvm/ \
    -e CLUSTER=ceph \
    -e CEPH_DAEMON=OSD_CEPH_VOLUME_ACTIVATE \
    -e CONTAINER_IMAGE=docker.io/ceph/daemon \
    -e OSD_ID=0 \
    --name=ceph-osd-0 \
    docker.io/ceph/daemon

# 在ceph002上激活第二个OSD(OSD_ID=1)
# 在ceph003上激活第三个OSD(OSD_ID=2)

部署其他服务

Manager服务(mgr)
docker run -d --net=host \
    --privileged=true \
    --security-opt seccomp=unconfined \
    -v /etc/ceph:/etc/ceph \
    -v /var/lib/ceph/:/var/lib/ceph/ \
    --name=ceph-mgr-0 \
    ceph/daemon mgr
Metadata服务(mds)
docker run -d --net=host \
    --privileged=true \
    --security-opt seccomp=unconfined \
    -v /var/lib/ceph/:/var/lib/ceph/ \
    -v /etc/ceph:/etc/ceph \
    -e CEPHFS_CREATE=1 \
    --name=ceph-mds-0 \
    ceph/daemon mds
对象网关服务(rgw)
docker run -d --net=host \
    --privileged=true \
    --security-opt seccomp=unconfined \
    -v /var/lib/ceph/:/var/lib/ceph/ \
    -v /etc/ceph:/etc/ceph \
    --name=ceph-rgw-0 \
    ceph/daemon rgw

创建RBD块设备

RBD(RADOS Block Device)是Ceph提供的块存储服务,将作为PolarDB-for-PostgreSQL的底层存储。

创建存储池

docker exec -it mon01 bash
ceph osd pool create rbd_polar

创建RBD镜像

rbd create --size 512000 rbd_polar/image02
rbd info rbd_polar/image02

映射RBD镜像

# 加载内核模块
modprobe rbd

# 关闭不支持的特性
rbd feature disable rbd_polar/image02 object-map fast-diff deep-flatten

# 映射镜像
rbd map rbd_polar/image02

# 查看映射的设备
rbd device list
lsblk

后续步骤

完成Ceph集群部署和RBD设备创建后,接下来需要:

  1. 在所有节点上映射RBD设备
  2. 使用PolarFS格式化设备
  3. 部署PolarDB-for-PostgreSQL

这些步骤将在后续文档中详细介绍。

常见问题

  1. mon is allowing insecure global_id reclaim
    执行ceph config set mon auth_allow_insecure_global_id_reclaim false解决

  2. RBD映射失败
    需要关闭内核不支持的RBD特性:rbd feature disable <pool>/<image> object-map fast-diff deep-flatten

  3. OSD激活失败
    检查磁盘是否可用,确保没有其他进程占用磁盘

通过以上步骤,我们成功搭建了一个三节点的Ceph集群,并创建了可供PolarDB-for-PostgreSQL使用的RBD块设备。这种架构为数据库提供了高可用、高性能的共享存储解决方案。

PolarDB-for-PostgreSQL PolarDB-for-PostgreSQL 项目地址: https://gitcode.com/gh_mirrors/pol/PolarDB-for-PostgreSQL

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沈菱嫱Marie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值