实例部署:基于 Ceph 共享存储

    ceph 搭建需要 2 台及以上的物理机/虚拟机实现存储共享与数据备份,本教程以 3 台虚拟机机环境为例,介绍基于 ceph 共享存储的实例构建方法。大体如下:

    1. 获取在同一网段的虚拟机三台,互相之间配置 ssh 免密登录,用作 ceph 密钥与配置信息的同步;
    2. 在主节点启动 mon 进程,查看状态,并复制配置文件至其余各个节点,完成 mon 启动;
    3. 在三个环境中启动 osd 进程配置存储盘,并在主节点环境启动 mgr 进程、rgw 进程;
    4. 创建存储池与 rbd 块设备镜像,并对创建好的镜像在各个节点进行映射即可实现块设备的共享;
    5. 对块设备进行 PolarFS 的格式化与 PolarDB 的部署。

    注意

    操作系统版本要求 CentOS 7.5 及以上。以下步骤在 CentOS 7.5 上通过测试。

    使用的虚拟机环境如下:

    提示

    本教程使用阿里云镜像站提供的 docker 包。

    安装 docker 依赖包

    安装并启动 docker

    1. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    2. yum makecache
    3. yum install -y docker-ce
    4. systemctl start docker
    5. systemctl enable docker

    检查是否安装成功

    1. docker run hello-world

    配置 ssh 免密登录

    密钥的生成与拷贝

    1. ssh-keygen
    2. ssh-copy-id -i /root/.ssh/id_rsa.pub root@ceph001
    3. ssh-copy-id -i /root/.ssh/id_rsa.pub root@ceph002
    4. ssh-copy-id -i /root/.ssh/id_rsa.pub root@ceph003

    检查是否配置成功

    1. ssh root@ceph003

    下载 ceph daemon

    1. docker pull ceph/daemon

    mon 部署

    ceph001 上 mon 进程启动

    1. docker run -d \
    2. --net=host \
    3. --privileged=true \
    4. -v /etc/ceph:/etc/ceph \
    5. -v /var/lib/ceph/:/var/lib/ceph/ \
    6. -e MON_IP=192.168.1.173 \
    7. -e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
    8. --security-opt seccomp=unconfined \
    9. --name=mon01 \
    10. ceph/daemon mon

    注意

    根据实际网络环境修改 IP、子网掩码位数。

    查看容器状态

    注意

    如果遇到 mon is allowing insecure global_id reclaim 的报错,使用以下命令解决。

    1. docker exec mon01 ceph config set mon auth_allow_insecure_global_id_reclaim false
    1. docker exec mon01 ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
    2. docker exec mon01 ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring

    配置文件同步

    1. ssh root@ceph002 mkdir -p /var/lib/ceph
    2. scp -r /etc/ceph root@ceph002:/etc
    3. scp -r /var/lib/ceph/bootstrap* root@ceph002:/var/lib/ceph
    4. ssh root@ceph003 mkdir -p /var/lib/ceph
    5. scp -r /etc/ceph root@ceph003:/etc
    6. scp -r /var/lib/ceph/bootstrap* root@ceph003:/var/lib/ceph

    在 ceph002 与 ceph003 中启动 mon

    1. docker run -d \
    2. --net=host \
    3. --privileged=true \
    4. -v /etc/ceph:/etc/ceph \
    5. -e MON_IP=192.168.1.174 \
    6. -e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
    7. --security-opt seccomp=unconfined \
    8. --name=mon02 \
    9. ceph/daemon mon
    10. docker run -d \
    11. --net=host \
    12. --privileged=true \
    13. -v /etc/ceph:/etc/ceph \
    14. -v /var/lib/ceph/:/var/lib/ceph/ \
    15. -e MON_IP=1192.168.1.175 \
    16. -e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
    17. --security-opt seccomp=unconfined \
    18. --name=mon03 \
    19. ceph/daemon mon

    查看当前集群状态

    1. $ docker exec mon01 ceph -s
    2. cluster:
    3. id: 937ccded-3483-4245-9f61-e6ef0dbd85ca
    4. health: HEALTH_OK
    5. services:
    6. mgr: no daemons active
    7. osd: 0 osds: 0 up, 0 in
    8. data:
    9. pools: 0 pools, 0 pgs
    10. objects: 0 objects, 0 B
    11. usage: 0 B used, 0 B / 0 B avail
    12. pgs:

    从 mon 节点信息查看是否有添加在另外两个节点创建的 mon 添加进来。

    osd 准备阶段

    提示

    本环境的虚拟机只有一个 /dev/vdb 磁盘可用,因此为每个虚拟机只创建了一个 osd 节点。

    1. docker run --rm --privileged=true --net=host --ipc=host \
    2. --security-opt seccomp=unconfined \
    3. -v /run/lock/lvm:/run/lock/lvm:z \
    4. -v /var/run/udev/:/var/run/udev/:z \
    5. -v /dev:/dev -v /etc/ceph:/etc/ceph:z \
    6. -v /run/lvm/:/run/lvm/ \
    7. -v /var/lib/ceph/:/var/lib/ceph/:z \
    8. -v /var/log/ceph/:/var/log/ceph/:z \
    9. --entrypoint=ceph-volume \
    10. docker.io/ceph/daemon \
    11. --cluster ceph lvm prepare --bluestore --data /dev/vdb

    注意

    以上命令在三个节点都是一样的,只需要根据磁盘名称进行修改调整即可。

    1. docker run -d --privileged=true --net=host --pid=host --ipc=host \
    2. --security-opt seccomp=unconfined \
    3. -v /dev:/dev \
    4. -v /etc/localtime:/etc/ localtime:ro \
    5. -v /var/lib/ceph:/var/lib/ceph:z \
    6. -v /etc/ceph:/etc/ceph:z \
    7. -v /var/run/ceph:/var/run/ceph:z \
    8. -v /var/run/udev/:/var/run/udev/ \
    9. -v /var/log/ceph:/var/log/ceph:z \
    10. -v /run/lvm/:/run/lvm/ \
    11. -e CLUSTER=ceph \
    12. -e CEPH_DAEMON=OSD_CEPH_VOLUME_ACTIVATE \
    13. -e CONTAINER_IMAGE=docker.io/ceph/daemon \
    14. -e OSD_ID=0 \
    15. --name=ceph-osd-0 \
    16. docker.io/ceph/daemon

    注意

    各个节点需要修改 OSD_ID 与 name 属性,OSD_ID 是从编号 0 递增的,其余节点为 OSD_ID=1、OSD_ID=2。

    查看集群状态

    mgr、mds、rgw 部署

    以下命令均在 ceph001 进行:

    1. docker run -d --net=host \
    2. --privileged=true \
    3. --security-opt seccomp=unconfined \
    4. -v /etc/ceph:/etc/ceph \
    5. -v /var/lib/ceph/:/var/lib/ceph/ \
    6. --name=ceph-mgr-0 \
    7. ceph/daemon mgr
    8. docker run -d --net=host \
    9. --privileged=true \
    10. --security-opt seccomp=unconfined \
    11. -v /var/lib/ceph/:/var/lib/ceph/ \
    12. -e CEPHFS_CREATE=1 \
    13. --name=ceph-mds-0 \
    14. ceph/daemon mds
    15. docker run -d --net=host \
    16. --privileged=true \
    17. --security-opt seccomp=unconfined \
    18. -v /var/lib/ceph/:/var/lib/ceph/ \
    19. -v /etc/ceph:/etc/ceph \
    20. --name=ceph-rgw-0 \
    21. ceph/daemon rgw

    查看集群状态:

    1. cluster:
    2. id: e430d054-dda8-43f1-9cda-c0881b782e17
    3. health: HEALTH_OK
    4. services:
    5. mon: 3 daemons, quorum ceph001,ceph002,ceph003 (age 92m)
    6. mgr: ceph001(active, since 25m)
    7. mds: 1/1 daemons up
    8. osd: 3 osds: 3 up (since 54m), 3 in (since 60m)
    9. rgw: 1 daemon active (1 hosts, 1 zones)
    10. data:
    11. volumes: 1/1 healthy
    12. pools: 7 pools, 145 pgs
    13. objects: 243 objects, 7.2 KiB
    14. usage: 50 MiB used, 2.9 TiB / 2.9 TiB avail
    15. pgs: 145 active+clean

    提示

    存储池的创建

    1. docker exec -it mon01 bash
    2. ceph osd pool create rbd_polar

    创建镜像文件并查看信息

    1. rbd create --size 512000 rbd_polar/image02
    2. rbd info rbd_polar/image02
    3. rbd image 'image02':
    4. size 500 GiB in 128000 objects
    5. order 22 (4 MiB objects)
    6. snapshot_count: 0
    7. id: 13b97b252c5d
    8. block_name_prefix: rbd_data.13b97b252c5d
    9. format: 2
    10. features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    11. op_features:
    12. flags:
    13. create_timestamp: Thu Oct 28 06:18:07 2021
    14. access_timestamp: Thu Oct 28 06:18:07 2021
    15. modify_timestamp: Thu Oct 28 06:18:07 2021

    映射镜像文件

    1. modprobe rbd # 加载内核模块,在主机上执行
    2. rbd map rbd_polar/image02
    3. rbd: sysfs write failed
    4. RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rbd_polar/image02 object-map fast-diff deep-flatten".
    5. In some cases useful info is found in syslog - try "dmesg | tail".
    6. rbd: map failed: (6) No such device or address

    注意

    某些特性内核不支持,需要关闭才可以映射成功。如下进行:关闭 rbd 不支持特性,重新映射镜像,并查看映射列表。

    1. rbd feature disable rbd_polar/image02 object-map fast-diff deep-flatten
    2. rbd map rbd_polar/image02
    3. rbd device list
    4. id pool namespace image snap device
    5. 0 rbd_polar image01 - /dev/ rbd0
    6. 1 rbd_polar image02 - /dev/ rbd1

    提示

    此处我已经先映射了一个 image01,所以有两条信息。

    回到容器外,进行操作。查看系统中的块设备:

    1. lsblk
    2. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    3. vda 253:0 0 500G 0 disk
    4. └─vda1 253:1 0 500G 0 part /
    5. vdb 253:16 0 1000G 0 disk
    6. └─ceph--7eefe77f--c618--4477--a1ed--b4f44520dfc 2-osd--block--bced3ff1--42b9--43e1--8f63--e853b ce41435
    7. 252:0 0 1000G 0 lvm
    8. rbd0 251:0 0 100G 0 disk

    注意

    块设备镜像需要在各个节点都进行映射才可以在本地环境中通过 lsblk 命令查看到,否则不显示。ceph002 与 ceph003 上映射命令与上述一致。

    PolarDB FileSystem 安装部署

    请参考 实例部署:基于 NDB 共享存储 > PolarDB FileSystem 安装部署

    请参考