Deploy on Ceph Shared Storage

DANGER

Translation needed.

Ceph 是一个统一的分布式存储系统,由于它可以提供较好的性能、可靠性和可扩展性,被广泛的应用在存储领域。以下是在 ceph 分布式集群上部署 PolarDB-FileSystem 以及 PolarDB-for-PostgreSQL 的教程。

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

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

WARNING

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

环境准备

  1. - 使用的虚拟机环境如下:
  2. ```
  3. IP hostname
  4. 192.168.1.173 ceph001
  5. 192.168.1.174 ceph002
  6. 192.168.1.175 ceph003
  7. ```
  8. - 安装docker
  9. > 说明:本教程使用阿里云镜像站提供的docker包。
  10. - 安装docker依赖包:
  11. ```
  12. yum install -y yum-utils device-mapper-persistent-data lvm2
  13. ```
  14. - 安装并启动docker
  15. ```
  16. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  17. yum makecache
  18. yum install -y docker-ce
  19. systemctl start docker
  20. systemctl enable docker
  21. ```
  22. - 检查是否安装成功:
  23. ```
  24. docker run hello-world
  25. ```
  26. - 配置ssh免密登录
  27. - 密钥的生成与拷贝:
  28. ```
  29. ssh-keygen
  30. ssh-copy-id -i /root/.ssh/id_rsa.pub root@ceph001
  31. ssh-copy-id -i /root/.ssh/id_rsa.pub root@ceph002
  32. ssh-copy-id -i /root/.ssh/id_rsa.pub root@ceph003
  33. ```
  34. - 检查是否配置成功
  35. ```
  36. ssh root@ceph003
  37. ```
  38. - 下载ceph daemon
  39. ```bash
  40. docker pull ceph/daemon
  41. ```

mon 部署

  1. - ceph001mon进程启动
  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
  11. ```
  12. **注意:根据实际网络环境修改IP、子网掩码位数。**
  • 查看容器状态

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

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

    1. docker exec mon01 ceph config set mon auth_allow_insecure_global_id_reclaim false
  • 生成必须的keyring

    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. -v /var/lib/ceph/:/var/lib/ceph/ \
    6. -e MON_IP=192.168.1.174 \
    7. -e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
    8. --security-opt seccomp=unconfined \
    9. --name=mon02 \
    10. ceph/daemon mon
    11. docker run -d \
    12. --net=host \
    13. --privileged=true \
    14. -v /etc/ceph:/etc/ceph \
    15. -v /var/lib/ceph/:/var/lib/ceph/ \
    16. -e MON_IP=1192.168.1.175 \
    17. -e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
    18. --security-opt seccomp=unconfined \
    19. --name=mon03 \
    20. 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. mon: 3 daemons, quorum ceph001,ceph002, ceph003 (age 35s)
    7. mgr: no daemons active
    8. osd: 0 osds: 0 up, 0 in
    9. data:
    10. pools: 0 pools, 0 pgs
    11. objects: 0 objects, 0 B
    12. usage: 0 B used, 0 B / 0 B avail
    13. pgs:

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

osd 部署

  1. - osd准备阶段:
  2. >本环境的虚拟机只有一个/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
  12. ```
  13. **注意:以上命令在三个节点都是一样的,只需要根据磁盘名称进行修改调整即可。**
  • osd激活阶段:

    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_ACT IVATE \
    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。

  • 查看集群状态

    1. docker exec mon01 ceph -s
    2. cluster:
    3. id: e430d054-dda8-43f1-9cda-c0881b782e17
    4. health: HEALTH_WARN
    5. no active mgr
    6. services:
    7. mon: 3 daemons, quorum ceph001,ceph002, ceph003 (age 44m)
    8. mgr: no daemons active
    9. osd: 3 osds: 3 up (since 7m), 3 in (since 13m)
    10. data:
    11. pools: 0 pools, 0 pgs
    12. objects: 0 objects, 0 B
    13. usage: 0 B used, 0 B / 0 B avail
    14. pgs:

    ```

mgr、mds、rgw 部署

  1. - 以下命令均在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. -v /etc/ceph:/etc/ceph \
  13. -e CEPHFS_CREATE=1 \
  14. --name=ceph-mds-0 \
  15. ceph/daemon mds
  16. docker run -d --net=host \
  17. --privileged=true \
  18. --security-opt seccomp=unconfined \
  19. -v /var/lib/ceph/:/var/lib/ceph/ \
  20. -v /etc/ceph:/etc/ceph \
  21. --name=ceph-rgw-0 \
  22. ceph/daemon rgw
  23. ```
  • 查看集群状态

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

    ```

rbd 块设备创建

  1. >以下命令均在容器mon01中进行。
  2. - 存储池的创建:
  1. docker exec -it mon01 bash
  2. ceph osd pool create rbd_polar
  3. ```
  • 创建镜像文件并查看信息

    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. rbd map rbd_polar/image02
    2. rbd: sysfs write failed
    3. 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".
    4. In some cases useful info is found in syslog - try "dmesg | tail".
    5. 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
    9. rbd1 251:16 0 500G 0 disk

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

PolarDB-FileSystem 安装部署

  1. >请参考 方式3:搭建基于NBD共享存储 PolarDB-FileSystem安装部署

PolarDB-for-PostgreSQL 内核安装部署

  1. >请参考 方式3:搭建基于NBD共享存储 PolarDB-for-PostgreSQL内核安装部署

Edit this page on GitHub Deploy on Ceph Shared Storage - 图1

Contributors: 北侠