PolarDB-for-PostgreSQL 基于Ceph共享存储的部署指南
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设备创建后,接下来需要:
- 在所有节点上映射RBD设备
- 使用PolarFS格式化设备
- 部署PolarDB-for-PostgreSQL
这些步骤将在后续文档中详细介绍。
常见问题
-
mon is allowing insecure global_id reclaim
执行ceph config set mon auth_allow_insecure_global_id_reclaim false
解决 -
RBD映射失败
需要关闭内核不支持的RBD特性:rbd feature disable <pool>/<image> object-map fast-diff deep-flatten
-
OSD激活失败
检查磁盘是否可用,确保没有其他进程占用磁盘
通过以上步骤,我们成功搭建了一个三节点的Ceph集群,并创建了可供PolarDB-for-PostgreSQL使用的RBD块设备。这种架构为数据库提供了高可用、高性能的共享存储解决方案。
PolarDB-for-PostgreSQL 项目地址: https://gitcode.com/gh_mirrors/pol/PolarDB-for-PostgreSQL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考