文章

Ceph 块存储 RBD 在 RDMA 网络下的部署

这里记录一下 Ceph 的块存储 RBD 使用 RDMA 网络(RoCE v2)的配置过程。主要参考的是 Ceph 的官方文档(然而并没有 RDMA 配置部分)以及 Bring Up Ceph RDMA

集群配置

刚开始尝试使用 cephadm bootstrap 命令配置,但可能是因为 RDMA 网卡没有暴露给 docker 容器的原因,这种方式没有配置成功。于是选择了手动配置。

手动编译 Ceph 出了各种问题,于是选择了直接使用官方提供的 https://download.ceph.com/ apt 源,Ubuntu 20.04 默认的 Ceph 版本似乎不行。见 Get Packages — Apt

为了方便这里把认证都关闭了,所以下面没有运行生成 keyring 的过程。

首先是 monitor map 的创建,见 Manual Deployment

1
2
3
monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
sudo -u ceph mkdir /var/lib/ceph/mon/ceph-{hostname}
sudo -u ceph ceph-mon --mkfs -i {hostname} --monmap /tmp/monmap

之后需要修改 /etc/ceph/ceph.conf 配置文件。建议先在其他地方写配置文件然后拷贝过去,在后续出错删除集群时会把 /etc/ceph/ceph.conf 删掉。对应的配置文件如下所示,使用 show_gids 可以获取 RDMA 网卡对应的 gid。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[global]
fsid = <uuidgen>
mon host = <ethernet ip addr, not roce port addr>
mon initial members = <hostname>
public network = <ethernet subnet, e.g. 192.168.0.0/16>
auth cluster required = none
auth service required = none
auth client required = none
osd pool default size = 1
ms type = async+rdma
ms cluster type = async+rdma
ms async rdma polling us = 0
ms async rdma device name = mlx5_0
ms async rdma local gid = 0000:0000:0000:0000:0000:xxxx:xxxx:xxxx

然后是需要改 memlock 的限制(RDMA 需要)。先在 /etc/security/limits.conf 文件中加入以下内容:

1
2
3
4
5
6
* soft memlock unlimited
* hard memlock unlimited
root soft memlock unlimited
root hard memlock unlimited
ceph soft memlock unlimited
ceph hard memlock unlimited

之后重新登录生效。然后在 /lib/systemd/system 文件夹下的 ceph-mon@.serviceceph-mgr@.serviceceph-osd@.service 文件中加入以下内容(注意原来的文件有没有这些配置,如果有的话先删掉)。见 Bring Up Ceph RDMA

1
2
3
[Service]
LimitMEMLOCK=infinity
PrivateDevices=no

之后运行如下命令启动 monitor 和 manager。如果启动出错可以使用 sudo cephadm logs --fsid <fsid> --name mon.{hostname} 来查看 monitor 的日志(mgr 的 name 是 mgr.{hostname})。

1
2
3
sudo systemctl daemon-reload
sudo systemctl start ceph-mon@{hostname}
sudo systemctl start ceph-mgr@{hostname}

如果出错了可以运行以下命令删除集群重新开始(不再需要进行 monitor map 的创建):

1
2
3
4
5
sudo cephadm rm-cluster --fsid <fsid> --force
sudo systemctl stop ceph-mon@{hostname}
sudo systemctl stop ceph-mgr@{hostname}
sudo systemctl daemon-reload
sudo systemctl reset-failed

如果没有问题那么运行 ceph -s 会显示该集群信息。在配置时每次运行 ceph 等命令都会出现一次 Infiniband send_cm_meta send returned error 111: (111) Connection refusedInfiniband to_dead failed to send a beacon: (111) Connection refused 错误,但似乎没有影响。

之后就可以添加 OSD(bluestore),见 Adding OSDs

1
2
3
sudo ceph-volume lvm create --data /dev/nvmeXnX
sudo ceph-volume lvm list
sudo ceph-volume lvm activate {OSD ID} {OSD FSID}

然后还需要创建 pool 和 image,见 Basic Block Device Commands

1
2
rbd pool init <pool-name>
rbd create --size {megabytes} --object-size {objectsize} {pool-name}/{image-name}

没有问题的话集群就部署完成了。

客户端配置

客户端上需要有集群的 /etc/ceph/ceph.conf 配置文件。将服务器上的配置文件复制到客户端的 /etc/ceph 下即可。见 Chapter 4. Client Installation。在客户端上运行 ceph -s 查看是否成功。

fio 测试

fio 中包含 rbd 的 ioengine,源码的 examples/rbd.fio 配置文件就是用于对 Ceph 的 rbd 进行测试。

为了编译 fio,让 fio 识别到 rbd 和 rados,首先安装 librbd-devlibrados-dev 两个库。之后按照 fio 的编译步骤运行即可。

tcpdump

Ubuntu 20.04 中默认的 tcpdump 和 libpcap 无法监控 mlx5_0 设备,需要自行编译 libpcap 和 tcpdump。Git clone 的 tcpdump 和 libpcap 两个目录应该在同一级,tcpdump 会在它文件夹的 ../libpcap 中寻找 libpcap。按照对应的编译步骤先编译 libpcap 再编译 tcpdump。使用以下命令可以监控 mlx5_0 的流量。

1
sudo tcpdump -i mlx5_0
本文由作者按照 CC BY 4.0 进行授权