当前 Ceph 集群搭建部署的方式主要有两种,一种是 CephAnsible ,另一种为 Cephadm ,由于目前社区推荐使用 Cephadm 进行部署,因此这里介绍通过 Cephadm 部署 Ceph Crimson 集群。通过 Cephadm 搭建集群需要用到 Ceph 的容器镜像,之后会将 Mon/Mgr/OSD 等组件运行在容器环境中,因为我们需要获取到 Ceph 的容器镜像,官方提供了一些 Ceph 的容器: https://quay.io/repository/ceph/ceph ,有些时候我们可能会对 Ceph 代码进行自定义修改,这时候就需要自定义的 Ceph 镜像,为此官方提供了基于 CentOS Stream 9 的容器打包脚本,我们可通过该脚本构建自定义的 Ceph 容器镜像。

操作步骤如下:

  1. 编译打包:编译 Ceph 并产出 RPM 安装包,之后搭建 Web 服务器提供 RPM 安装包的访问下载地址;
  2. 容器构建:基于上一步产出的 RPM 安装包,构建 Cephadm 依赖的 Ceph 镜像;
  3. 集群部署:基于上一步构建的 Ceph 镜像,开始部署集群;

一、编译打包

由于最终编译打包生成的 RPM 包需要安装在 CentOS Stream 9 的环境中,因此我们需要基于该环境进行编译打包,这里推荐使用 bugwz/ceph-images 中提供的 CentOS Stream 9 的编译打包环境。

编译打包的详细步骤如下:

  1. 构建 CentOS Stream 9 编译打包环境:基于 bugwz/ceph-image 中提供的 Dockerfile 进行构建;
  2. 执行编译打包:基于上一步构建的编译打包环境执行编译、RPM 打包等操作;
  3. 搭建 Web 服务器环境:提供对上一步打包的 RPM 的访问下载服务;

1.1、构建 CentOS Stream 9 编译打包环境

操作如下:

# 构建 Ceph 开发环境,最终生成一个 ceph-dev:centos9-stream-v19.2.1 的镜像
git clone https://github.com/bugwz/ceph-image.git
cd ./ceph-image/squid/centos-9-stream/dev
./run.sh

1.2、执行编译打包

操作如下:

# 进入开发环境
podman run -d --name ceph-build ceph-dev:centos9-stream-v19.2.1 /bin/bash -c "while true; do sleep 1; done"
podman exec -it ceph-build /bin/bash

# 编译
cd /root/ceph
git checkout -f v19.2.1
git submodule update --init --recursive
export FOR_MAKE_CHECK=true
/root/ceph/install-deps.sh
/root/ceph/do_cmake.sh
cd /root/ceph/build/
ninja -j "$(expr $(nproc) / 2)"


# 编译 crimson
cd /root/ceph
git checkout -f v19.2.1
git submodule update --init --recursive
export FOR_MAKE_CHECK=true
export WITH_SEASTAR=true
/root/ceph/install-deps.sh
/root/ceph/do_cmake.sh -DWITH_SEASTAR=ON
cd /root/ceph/build/
ninja -j "$(expr $(nproc) / 2)"


# 构建 RPM
cd /root/ceph
git checkout -f v19.2.1
git submodule update --init --recursive
/root/ceph/make-dist
mkdir -p /root/ceph/rpmbuild/SOURCES
cp /root/ceph/ceph-*.tar.bz2 /root/ceph/rpmbuild/SOURCES
rpmbuild -ba --clean --rmsource --rmspec \
--define="_topdir /root/ceph/rpmbuild" \
--define="_rpmdir /root/ceph/rpmbuild/RPMS" \
--define="_builddir /root/ceph/rpmbuild/BUILD" \
--define="_sourcedir /root/ceph/rpmbuild/SOURCES" \
--define="_specdir /root/ceph/rpmbuild/SPECS" \
--define="_srcrpmdir /root/ceph/rpmbuild/SRPMS" \
--define="_unpackaged_files_terminate_build 0" \
ceph.spec --without selinux
createrepo /root/ceph/rpmbuild/RPMS/x86_64/
createrepo /root/ceph/rpmbuild/RPMS/noarch/


# 构建 crimson RPM
cd /root/ceph
git checkout -f v19.2.1
git submodule update --init --recursive
/root/ceph/make-dist
mkdir -p /root/ceph/rpmbuild/SOURCES
cp /root/ceph/ceph-*.tar.bz2 /root/ceph/rpmbuild/SOURCES
rpmbuild -ba --with seastar --clean --rmsource --rmspec \
--define="_topdir /root/ceph/rpmbuild" \
--define="_rpmdir /root/ceph/rpmbuild/RPMS" \
--define="_builddir /root/ceph/rpmbuild/BUILD" \
--define="_sourcedir /root/ceph/rpmbuild/SOURCES" \
--define="_specdir /root/ceph/rpmbuild/SPECS" \
--define="_srcrpmdir /root/ceph/rpmbuild/SRPMS" \
--define="_unpackaged_files_terminate_build 0" \
ceph.spec --without selinux
createrepo /root/ceph/rpmbuild/RPMS/x86_64/
createrepo /root/ceph/rpmbuild/RPMS/noarch/

1.3、搭建 Web 服务器环境

以下操作继续位于 1.2 中提到的名为 ceph-build 的容器中执行。

操作如下:

# 创建 CentOS 源所需要的 repo 文件
# 该文件完整路径为 /root/ceph/rpmbuild/ceph.repo
# 该文件内容如下,需要修改对应的 IP 地址等信息
[ceph-custom-stable]
name=Ceph custom stable $basearch repo
baseurl=http://127.0.0.1:8080/RPMS/$basearch
enabled=1
gpgcheck=0
priority=0

[ceph-custom-stable-noarch]
name=Ceph custom stable noarch repo
baseurl=http://127.0.0.1:8080/RPMS/noarch
enabled=1
gpgcheck=0
priority=0


# 使用 Python3 启动一个 Web 服务
cd /root/ceph/rpmbuild/
python3 -m http.server 8080

二、容器构建

当构建 crimson RPM 的时候,最后会同时生成 ceph-crimson-osd 和 ceph-osd 两个 rpm 包,但是其内部的 /usr/bin/ceph-osd 和 /usr/bin/crimson-osd 文件完全相同,也就是说在构建 crimson RPM 的场景下,即使最后安装的软件包为 ceph-osd ,实际起作用的也是 crimson osd 。所以即使是构建 crimson osd 的容器环境,在执行容器脚本时对应的 FLAVOR 环境变量也可以使用 default 参数。

以下操作并不位于上面提到的名为 ceph-build 的容器中。

操作如下:

# 下载 Ceph 源码
git clone https://github.com/ceph/ceph.git
cd ./ceph
git checkout -f v19.2.1
cd ./container

# 构建 Cephadm 所需要的容器镜像
export NO_PUSH=true
export CI_CONTAINER=true
export FLAVOR=default
export BRANCH=v19.2.1
export CEPH_SHA1=58a7fab8be0a062d730ad7da874972fd3fba59fb
export ARCH=$(arch)
export CEPH_CUSTOM_REPO="http://127.0.0.1:8080/v19.2.1-crimson/ceph.repo"
/root/ceph/container/build.sh

# 推送容器镜像至内部/外部镜像服务器
podman push $IMAGE_NAME

三、集群部署

假设测试环境中拥有三台机器,每台机器上均已安装 ceph-common ,ceph-base 等 Ceph 相关的 CLI 软件,且三台机器的信息如下:

  • ceph01 : 10.10.10.1
  • ceph02 : 10.10.10.2
  • ceph03 : 10.10.10.3

使用 Cephadm 进行集群的搭建步骤如下:

  1. 创建新集群并初始化集群配置: 详见 Bootstrap a new cluster
  2. 添加主机到集群: 详见 Adding Hosts
  3. 添加 OSD 存储: 详见 Deploy OSDs
  4. 添加 MDS 组件并创建文件系统: 详见 Deploy CephFS

3.1、创建新集群并初始化集群配置

# 创建新集群
cephadm --image $IMAGE_NAME bootstrap --mon-ip 10.10.10.1 --allow-fqdn-hostname --initial-dashboard-password admin

# 初始化环境配置,调整 crimson 相关配置
ceph config set osd crimson_seastar_num_threads 1
ceph config set global 'enable_experimental_unrecoverable_data_corrupting_features' crimson
ceph osd set-allow-crimson --yes-i-really-mean-it
ceph config set mon osd_pool_default_crimson true

# 初始化环境配置:新主机安装集群 SSH 公钥
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph02
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph03

Crimson 相关配置参数:

  • osd_objectstore : 后端对象存储类型,可选值为 filestore/memstore/bluestore/kstore/seastore/cyanstore , 默认值为 bluestore ;
    • 对应 osd 的配置为: filestore/memstore/bluestore ;
    • 对应 crimson osd 的配置为: cyanstore/seastore/bluestore , 在这里 bluestore 前端使用 alienstore 进行代理,但是配置中并没有该参数;
  • crimson_osd_obc_lru_size : 缓存的 Object Context 数量 , 默认值为 512 ;
  • crimson_osd_scheduler_concurrency : 并发 IO 操作的最大数量,0 代表无限 , 默认值为 0 ;
  • crimson_alien_op_num_threads : 为 alienized ObjectStore 提供服务的线程数,默认值为 6 ;
  • crimson_alien_thread_cpu_cores : 以 cpuset(7) 格式运行 alienstore 线程的 CPU 核心, 无默认值;
  • crimson_seastar_cpu_cores : 以 cpuset(7) 格式运行 seastar reactor 线程的 CPU 核心,smp::count 从此选项推导, 无默认值;
  • crimson_seastar_num_threads : 不进行 CPU 绑定的情况下用于服务 seastar reactor 的线程数,如果设置了 crimson_seastar_cpu_cores,则会被覆盖 , 默认值为 0 ;
  • crimson_osd_stat_interval : 定期报告 OSD 状态的时间间隔(以秒为单位),设置为 0 则禁用, 默认值为 0 ;
  • osd_pool_default_crimson : 默认使用 FLAG_CRIMSON 创建池,默认值为 false ;
  • seastore_segment_size : 用于分段管理器的片段大小,默认值为 64M ;
  • seastore_device_size : 创建时用于 SegmentManager 块文件的总大小,默认值为 50G ;
  • seastore_block_create : 如果不存在,请创建 SegmentManager 文件,默认值为 true ;
  • seastore_journal_batch_capacity : 日志批处理中的记录数量限制,默认值为 16 ;
  • seastore_journal_batch_flush_size : 强制清除日志批处理的大小阈值,默认值为 16M ;
  • seastore_journal_iodepth_limit : 用于提交日志记录的 IO 深度限制,默认值为 5 ;
  • seastore_journal_batch_preferred_fullness : 清除日志批处理的记录完整阈值,默认值为 0.95 ;
  • seastore_default_max_object_size : seastore 对象数据的默认逻辑地址空间保留,默认值为 16777216 ;
  • seastore_default_object_metadata_reservation : seastore 对象的元数据的默认逻辑地址空间保留,默认值为 16777216 ;
  • seastore_full_integrity_check : seastore 是否需要完全检查每个范围的完整性,非完全完整性检查意味着在范围重映射期间可能会跳过完整性检查以提高性能,禁用时需谨慎,默认值为 false ;
  • seastore_max_data_allocation_size : 范围可以达到的最大字节大小, 一旦子范围读取/校验和实现,seastore_max_data_allocation_size 应该被弃用。默认值为 32K ;
  • seastore_cache_lru_size : 要保留在缓存中的扩展大小(以字节为单位),默认值为 64M ;
  • seastore_obj_data_write_amplification : 如果写入大小的总扩展大小超过这个值,则分割扩展,默认值为 1.25 ;
  • seastore_max_concurrent_transactions : seastore 允许的最大并发事务,默认值为 8 ;
  • seastore_main_device_type : seastore 使用的主设备类型,可选值为 SSD/RANDOM_BLOCK_SSD ,默认值为 SSD 。还有当前不支持的 HDD/ZBD 配置,其中 ZBD 指的是 ZNS SSD 或者 SMR HDD ;
  • seastore_cbjournal_size : 创建时用于 CircularBoundedJournal 的总大小,只有在 seastore_main_device_type 是 RANDOM_BLOCK 时有效, 默认值为 5G ;
  • seastore_multiple_tiers_stop_evict_ratio : 当主层使用的比率小于这个值时,停止将冷数据驱除到冷层,默认值为 0.5 ;
  • seastore_multiple_tiers_default_evict_ratio : 在使用主层使用比率达到这个值时,开始将冷数据驱除到冷层,默认值为 0.6 ;
  • seastore_multiple_tiers_fast_evict_ratio : 当主层使用比率达到这个值时,立即开始驱除,默认值为 0.7 ;
  • seastore_data_delta_based_overwrite : 如果覆盖大小小于或等于该值,则基于增量覆盖现有数据块,否则基于重映射进行覆盖,设置为 0 强制使用基于重映射的覆盖。默认值为 0 ;
  • seastore_disable_end_to_end_data_protection : 当为 false 时,在 mkfs 时尝试发现 nvme 设备是否支持内部校验和功能而不使用服务器 CPU,然后在可用时启用,设置为 true 则无条件禁用。默认值为 true ;

3.2、添加主机到集群

# 添加主机到集群
ceph orch host add ceph02 10.10.10.2
ceph orch host add ceph03 10.10.10.3

3.3、添加 OSD 存储

# 添加 OSD 存储
ceph orch device ls
ceph orch daemon add osd ceph01:/dev/sdd,/dev/sde
ceph orch daemon add osd ceph02:/dev/sdd,/dev/sde
ceph orch daemon add osd ceph03:/dev/sdd,/dev/sde

3.4、添加 MDS 组件并创建文件系统

# 添加 MDS 组件并创建文件系统
ceph fs volume create cephfs

四、相关资料