前言

使用官方源码编译过程中主要参考链接 1~3 官网链接以及链接 8,有比较详细的步骤
想要实现效果

  • 两台主机承担 Ceph 所有服务功能,一主一备分别运行 Mon,Mgr 以及 Mds 等服务,每台机器上都有相应的存储作为 OSD 加载;
  • 这两台主机均使用源码编译,启动 DPDK 和 SPDK 服务,加速其他客户端的读取访问操作;
  • 其他机器通过局域网交换机与这两台记录建立通信,作为客户端连接到集群。在这些机器上挂载 CephFS 目录,实现共享文件系统访问;
    当前环境
  • 所有机器均通过 Cisco 交换机进行连接,连接网卡为 Intel XL710 40G;
  • 机器环境均为 Ubuntu 20.04 LTS
    整个集群规划如下
  • storage0 (10.0.1.2) - 主 Mon, Mgr, Mds, OSD (源码编译添加 DPDK SPDK 选项)
  • storage1 (10.0.1.3) - 从 Mon, Mgr, Mds, OSD (源码编译添加 DPDK SPDK 选项)
  • gpu0 (10.0.1.4) - Client (局域网络挂载 CephFS 服务)
  • gpu1 (10.0.1.5) - Client (同上)
  • gpu2 (10.0.1.6) - Client (同上)

1. 源码安装

从官网 clone 后在源码进行编译(测试下载压缩包编译会出现问题),然后 checkout 到一个 stable release 的分支如 quincy-release(当前最新版本)

1
2
3
git clone --recursive https://github.com/ceph/ceph.git
cd ceph
git checkout quincy-release

根据官网描述运行 ./install-deps.sh 安装相关文件和依赖项
测试发现前面步骤安装完成后,后面运行仍然会提示缺少依赖项的问题,统一记录如下(ubuntu 20.04),再继续安装

1
sudo apt install -y libibverbs-dev python3-sphinx librdmacm-dev libblkid-dev libkeyutils-dev libldap2-dev libcryptsetup-dev libjson-c-dev libpopt-dev libdevmapper-dev libsqlite3-dev libsnappy-dev liblz4-dev libcurl4-openssl-dev liboath-dev liblttng-ust-dev libbabeltrace-dev liblua5.3-dev cython3 libnl-genl-3-dev libcap-ng-dev librabbitmq-dev librdkafka-dev libthrift-dev gperf libfmt-dev libicu-dev libaio-dev libre2-dev

安装完成后运行如下命令,启动 DPDK 和 SPDK 编译选项进行加速

1
ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DWITH_DPDK=ON -DWITH_SPDK=ON -DWITH_TESTS=OFF" ./do_cmake.sh

执行上面命令后会在本地创建 build 文件夹,之后执行安装命令

1
2
3
cd build
ninja -j16 # long time ...
sudo ninja install # install in user space - /usr/local/bin

安装完成后便可以使用 ceph 相关命令了,可以在 /usr/local/bin 目录下看到 ceph 相关的所有可执行命令,以及在 /usr/lib/systemd/system 下面看到所有生成的 service ,后面使用命令 systemd start ceph-mon@ 等相关命令都是从这里调取 service。
然而这里有个奇怪的问题,所有默认的 service 启动 ceph 相关指令的地址都是在 /usr/bin 下面,而运行 ninja install 安装后的位置却是在 /usr/local/bin 下面。因此要么修改每个 service 里面 ceph 指令的启动位置,要么移动所有的指令到 /usr/bin 下面。这里我个人做了两点修改:

  • 没有根据官网或者其他参考资料那样使用 ceph 用户和用户组,而是统一使用 root ,因此需要更改 service 中的用户和用户组为 root(原来的是 ceph);
  • 修改所有 service 中的的 /usr/bin/usr/local/bin,否则启动 service 会报错提示无法启动;

2. 集群部署

a. Mon 安装

主要参考链接 9(官方搭建链接,只有一个 Mon 节点)和链接 8(多节点搭建),和参考链接不同,这里均使用 root 用户来实现,默认已经修改过 /usr/lib/systemd/system 下的 service 文件
首先创建相关的文件夹

1
2
3
4
mkdir /etc/ceph
mkdir -p /var/lib/ceph/bootstrap-osd
mkdir -p /var/lib/ceph/mon
mkdir -p /var/lib/ceph/osd

运行 uuidgen 命令生成 fsid 序号,然后创建 cluster 配置文件 /etc/ceph/ceph.conf 并将 fsid 填充进去

1
2
3
4
5
6
7
8
9
[global]
fsid=1dd43550-8165-40b0-b0da-ba34da957a95
mon initial members = storage0, storage1
mon host = 10.0.1.2, 10.0.1.3
public network = 10.0.1.2/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
mon allow pool delete = true

创建 mon 节点的 key 值

1
2
3
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' --cap mgr 'allow r'

添加生成的 keys 到 ceph.mon.keyring

1
2
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring

生成 monitor map(这里添加两台机器共同生成 monmap)

1
monmaptool --create --add storage0 10.0.1.2 --add storage1 10.0.1.3 --fsid 12f276b7-6ff9-4d2b-bac4-a7ac94ac4824 /tmp/monmap

此时可以运行命令查看生成的 monitor 映射文件,效果大致如下

1
2
3
4
5
6
7
8
9
10
team-admin@storage0:~$ monmaptool --print /tmp/monmap
monmaptool: monmap file /tmp/monmap
epoch 0
fsid f0141972-922d-42e2-a8a5-13e1e36b1a18
last_changed 2023-03-23T02:31:11.682950+0000
created 2023-03-23T02:31:11.682950+0000
min_mon_release 15 (octopus)
election_strategy: 1
0: v1:10.0.1.2:6789/0 mon.storage0
1: v1:10.0.1.3:6789/0 mon.storage1

使用 scp 命令将以上几个集群文件拷贝到 storage1 机器上(默认已经设置了 hosts 目录以及免密操作)

1
2
3
4
scp /etc/ceph/ceph.conf storage1:/etc/ceph
scp /etc/ceph/ceph.client.admin.keyring storage1:/etc/ceph
scp /tmp/ceph.mon.keyring storage1:/tmp/ceph.mon.keyring
scp /tmp/monmap storage1:/tmp/monmap

从后面步骤开始 Storage 1 机器上也要如此运行,首先是激活 monitor daemon(实测不用创建 mon 下文件夹,会自动生成)

1
ceph-mon --mkfs -i storage0 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring --setuser ceph --setgroup ceph

之后应该可以看到 /var/lib/ceph/mon 下生成了对应的文件夹,然后启动服务

1
systemctl start ceph-mon@storage0

运行完成后使用 systemctl status ceph-mon@storage0 命令查看状态,如果状态如下说明服务启动成功
image-20230802202334981
走完上面几步之后使用 ceph -s 查看集群状态。需要注意的是,如果是在 conf 中已经注明了是多个节点 Mon 的话,需要所有 Mon 节点都启动 Mon 服务之后最终的 ceph 集群服务才能启动,否则运行 ceph -s 会一直卡住。正常如果上面步骤运作成功应该会显示当前集群状态的,如果一直不显示应该就是操作哪里有问题了,需要再调试。最后运行 ceph -s 如果正常出现集群状态则说明集群运行成功。
补充两点:

  • 对于警告提示 1 monitors have not enabled msgr2,运行 ceph mon enable-msgr2
  • 对于警告提示 mons are allowing insecure global_id reclaim,运行如下命令即可
    1
    ceph config set mon auth_allow_insecure_global_id_reclaim false

b. Mgr 添加

以下操作 storage 0 和 storage 1 节点都要执行,节点名字自行修改。首先需要创建密钥目录

1
2
mkdir -p /var/lib/ceph/mgr/ceph-mgr0
cd /var/lib/ceph/mgr/ceph-mgr0

创建身份验证密钥

1
ceph auth get-or-create mgr.storage0 mon 'allow profile mgr' osd 'allow *' mds 'allow *' > keyring

启动 mgr 守护进程

1
systemctl start ceph-mgr@mgr0

使用 systemctl status ceph-mgr@mgr0 查看 Active 为 running 则没有问题

c. OSD 添加

首先使用 lsblk 命令查看可以加载的块设备都要哪些,以及设备状态是否有效。如果无效或者需要重新更新后挂载
命令如下,其中 ceph 为集群名,/dev/sdb 为机器实际的块存储

1
ceph-volume --cluster ceph lvm create --data /dev/sdb

如果上面这步出现报错,可能需要排除是否是之前挂载过或者磁盘有问题,仍然是参考上面提到笔记更新磁盘状态后再次尝试
在 storage1 机器上执行时可能会报错提示缺少密钥文件,从 storage0 拷贝密钥然后再次执行即可

1
scp /var/lib/ceph/bootstrap-osd/ceph.keyring storage1:/var/lib/ceph/bootstrap-osd/ceph.keyring

最后运行 sudo ceph osd tree 查看 osd 集群状态正常显示即可。
image-20230802202559666

d. MDS 添加

storage0 和 storage1 都需要操作,首先创建 mds 数据目录

1
mkdir -p /var/lib/ceph/mds/ceph-mds0

创建 keyring

1
ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-mds0/keyring --gen-key -n mds.mds0

导入 keyring

1
ceph auth add mds.mds0 osd "allow rwx" mds "allow" mon "allow profile mds" -i /var/lib/ceph/mds/ceph-mds0/keyring

修改配置文件(两台机器都需要修改,或者自行 scp 复制)

1
2
3
4
5
[mds.mds0]
host = mds0

[mds.mds1]
host = mds1

启动服务

1
systemctl start ceph-mds@mds0

查看状态没有问题即可

e. Pool 添加 & CephFS 搭建

在创建 fs 之前首先要配置好 mds 服务和两个 pool,一个 pool 存放 object ,另一个存放元数据,可设置较高副本级别,也可调整 pool 的 crush_ruleset 使其在 ssd 上存储,加快客户端响应速度,这里使用默认。这部分具体内容参考链接 7

创建命令如下,这里两个 pg_num 必须一致否则无法挂载,而对于 pg 数量的计算参考如下公式,注意 pg_num 必须是 2 的整数幂

  • 集群pg 总数 = (OSD 总数* 100 )/最大副本数
  • 每个pool中pg总数=(OSD总数*100)/ 最大副本数 )/ 池数

基于以上我们选择 256 作为 pg_num

1
2
3
4
[cephfsd@ceph-admin ceph]$ ceph osd pool create cephfs_data 256
pool 'cephfs_data' created
[cephfsd@ceph-admin ceph]$ ceph osd pool create cephfs_metadata 256
pool 'cephfs_metadata' created

接下来创建 fs 并查看创建的状态

1
2
3
4
[cephfsd@ceph-admin ceph]$ ceph fs new cephfs cephfs_metadata cephfs_data
new fs with metadata pool 6 and data pool 5
[cephfsd@ceph-admin ceph]$ ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

接下来挂载 cephfs 文件系统,可以在任意客户端上挂载

1
2
3
4
5
6
7
8
9
# 创建挂载点
[cephfsd@ceph-admin ceph]$ mkdir /opt/storage
# 去admin主机查看存储秘钥
[cephfsd@ceph-admin ceph]$ cat ceph.client.admin.keyring
[client.admin]
key = AQBIH+ld1okAJhAAmULVJM4zCCVAK/Vdi3Tz5Q==
# 将key的值复制下来,保存到客户端,我们这里保存在了/etc/ceph/admin.secret
[cephfsd@ceph-admin ceph]$ cat admin.secret
AQBIH+ld1okAJhAAmULVJM4zCCVAK/Vdi3Tz5Q==

挂载,有两种方式挂载,mount挂载和ceph-fuse挂载,这里选择用内核驱动挂载Ceph文件系统

1
2
3
4
5
6
7
8
9
10
11
[cephfsd@ceph-admin ceph]$ mount.ceph 10.0.1.2:6789:/ /mnt/storage -o name=admin,secretfile=/etc/ceph/admin.secret
[cephfsd@ceph-admin ceph]$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 484M 0 484M 0% /dev
tmpfs tmpfs 496M 0 496M 0% /dev/shm
tmpfs tmpfs 496M 26M 470M 6% /run
tmpfs tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 46G 1.9G 44G 4% /
/dev/sda1 xfs 497M 130M 368M 26% /boot
tmpfs tmpfs 100M 0 100M 0% /run/user/0
10.0.1.2:6789:/ ceph 8.5G 0 8.5G 0% /opt

以上便是 Ceph 源码编译之后使用原生命令部署集群之后挂载文件系统的全部过程了,关于后面的使用细节后面再添加整理吧


3. 参考链接

  1. Build Ceph — Ceph Documentation
    参考这个来进行整体的安装,注意是 clone 源码进行的
  2. Install Ceph Storage Cluster — Ceph Documentation
    最后安装成功后的可执行文件位置是在 usr/local/bin,可以将 ceph.conf 文件放置在这从而启动一个 cluster
  3. ceph/ceph: Ceph is a distributed object, block, and file storage platform (github.com)
    执行编译安装命令时注意添加部分参数,这里有简单提到可以加哪些参数,有的参数可以指定安装位置
  4. Ceph messenger DPDKStack — Ceph Documentation
  5. linux - fuse is installed but compiler is saying "no package ‘fuse’ found - Unix & Linux Stack Exchange
  6. 源码搭建ceph集群 - 简书 (jianshu.com)
  7. cephfs文件系统场景 - doublexi - 博客园 (cnblogs.com)
  8. [手动部署ceph octopus集群 - 腾讯云开发者社区-腾讯云 (tencent.com)](https://cloud.tencent.com/developer/article/1782762
  9. Manual Deployment — Ceph Documentation