部署一个单节点的 Ceph

最近需要在 Ceph 上部署 pytorch 然后做一些测试,来决定接下来干什么。由于只是做测试,所以只找学长要了一台服务器,打算架设一个单节点的 Ceph。由于我太菜,历经千辛万苦才成功部署,特地记一下部署的过程。

试错过程

这台服务器上装的是 CentOS 7,已经装有 Ceph 13.0.1 (mimic dev)。我拿到手之后完全不懂,上网乱搜一通后找到了官方中文版教程,决定照葫芦画瓢地试一下;然后就原地卡住了 2 天。

一切的起因是教程让我去配置 yum 的软件源 /etc/yum.repos.d/ceph.repo,然后我发现服务器上已经有这个文件。后面改软件源的时候我都是仿照着它来写。然而事实是,服务器上的 Ceph 版本是之前用的学长自己 make 的,安装在 /usr/local/bin 下面;软件源里的版本是 0.94.10 (hammer),yum 会把它安装在 /usr/bin 下面。当然这个时候,我还完全不知道这个事情。

于是就出现了这样的情况:ceph-deploy 告诉我它安装好 Ceph 之后,我在服务器上用自己的用户或者 root 运行 ceph -v 查看版本时,会显示为 13.0.1;但如果运行 sudo ceph -v,却显示为 0.94.10。我对此百思不得其解,搞来搞去搞了两天;直到我去问了学长,学长打了一行 whereis ceph 告诉我应该把 /usr/bin 下面这个 Ceph 干掉。我第一次学会用这个命令……问题是是我寻思这个才是 ceph-deploy 安装的版本啊,我都 uninstall 好几次了怎么你这个 Ceph 还在。

我只好继续乱搞,期间试过建立软链接等多种方案,都没能完全解决问题。后来我不知道在哪看见有人说 make install 的安装位置和 yum 是不同的,我才意识到原先存在的版本可能是某位学长自行编译出来的。接下来版本不同之谜也解决了:在我排空大脑,随便乱翻 TUNA 镜像站 里面 Ceph 的软件源的时候,我发现这玩意都更新到 nautilus 版本了:HIJKLMN,我落后整整六个版本;再一看 hammer 版本的更新日期,都是 2016 年的事了,我……

于是我愤而起身,去把 /etc/yum.repos.d/ceph.repo 里的所有 hammer 改成了 nautilus。这次再 ceph-deploy,得到的就是 14 开头的版本了。我沾沾自喜了一会儿就觉得不对:万一高版本和低版本冲突了怎么办?于是重新再 uninstall,把软件源改成 mimic,这回总没问题了吧?结果再 ceph-deploy 报 yum 的错误,指出 python-argparse 等等包的高版本没有卸载掉,只能手动 yum removepip uninstall。然后重新运行 ceph-deploy install,装上了 Ceph 13.2.7 (mimic stable),和原先的 Ceph 大版本号一样了。

当我终于露出问题解决的笑容的时候,ceph-deploy mon create-initial 开始疯狂报错,意思大概是说 mon 服务没有起来,访问某个文件的时候 No such file or directory。由于前两天我装错版本的时候也是这个问题,我一度以为一夜回到解放前。好在高版本 ceph-deploy(是的,之前搞错软件源的时候 ceph-deploy 也是低版本)有比较友好的警告信息;排除了一些疑似出错的点之后,我研究了一下报错,发现是 systemctl start ceph-mon@node 出了问题。于是继续 systemctl statusjournalctx -xe 组合分析,看了半天看见一句:

1
ceph-mon[21329]: 2019-11-28 01:40:53.825 7faf2ba25a00 -1 rocksdb: IO error: while open a file for lock: /var/lib/ceph/mon/ceph-node1/store.db/LOCK: Permission denied

想了一下之后打了一发 ll,果然没有读权限!直接对所有工作目录 chmod -R 777,成功跑起来了 monitor。

问题解决,接下来就是创建 OSD 了。但是好景不长,创建 OSD 的时候又报错了。看了一下,发现官方文档上写的 ceph-deploy osd prepare 早就 deprecated 了,现在要用 ceph-deploy osd create

重新打完命令之后又双叒叕报错,这回发现调用 ceph-volume 的时候跑到了服务器里面原先安装好的 Ceph 版本上面。我幼稚的以为这是 ceph-volume 的锅,想着用 pip 卸载了重装一下;结果卸载之后装不回来了,GG。只能停掉 monitor 从头再重新装一遍。这回我痛定思痛,去学长的目录下找到了源代码,跑了一发 make uninstall,完了之后 /usr/local/bin 里面残余的 Ceph 可执行文件也被我挪了个地方。这下 13.0.1 版本从服务器中消失,ceph -vsudo ceph -v 显示的版本终于都是 13.2.7 了。

然后从头重来一次,终于成功创建了 OSD。这次又发现了问题:Ceph 自动建立的 LVM 名字里面带着长长的一串 UUID,太丑,想把它们删掉重新起个名,然后就发现 ceph osd out 报错找不到密钥。ceph 不能跑意味着根本没法把 osd 踢出集群,也就没法卸载这些被 Ceph 占用的 LVM。慌张地又去查资料,发现忘记运行 ceph-deploy admin 来复制密钥,遂运行之。结果搞完,还是不行!绝望中试着 ls 一下发现要求的密钥文件的确存在,但是 ceph 找不到。感觉有了既视感,ll 一下发现居然又没有读权限!于是 chmod 777,解决。

后来发现官方文档上已经写了这件事:

确保你对 ceph.client.admin.keyring 有正确的操作权限。

sudo chmod +r /etc/ceph/ceph.client.admin.keyring

GG。

回到正题。总之这回是学乖了,先去 lvcreate 几个逻辑卷,指定好名称再在上面创建 OSD,而不是直接拿个分区喂给 ceph-deploy。于是终于成功跑起了 Ceph,OSD 名称也比较好看了。也跑起来了 mgr。

然后为了方便,按照这篇文章里面讲的步骤开启了 Dashboard;开启之后网页又打不开,意识到是 8443 端口没有开放,于是 firewall-cmd 开启之,解决。

接下来就是最后一步,要部署 Ceph 块设备并且把它 mount 起来。因为 Ceph 官网上说 CephFS 还不如块设备和对象存储稳定,同时我也不能确定它的性能,因此放弃了用 CephFS 的想法。建好存储池和块设备,map 的时候又报错 rbd: sys write failed。在这篇文章中看到是操作系统不支持块设备的一些 feature,遂 disable 掉,成功 map 到 /dev/rbd0。mount 起来,大功告成。

这一套操作真麻烦啊。

安装步骤总结

这一节总结一下怎么在单节点上部署 Ceph 13.2.7 (mimic)。

首先,需要保证 ceph-deploy 是最新的。它可以用 pip 来安装,所以比较容易搞到最新版,不需要改软件源。目前最新的版本似乎是 2.0.1。

接下来,保证没有安装其他版本的 Ceph。用 ceph-deploy uninstall $HOSTNAME 移除当前这台服务器上的 Ceph,然后 whereis ceph 检查是否还有别的版本。如果看到还有 /usr/local/bin/ceph,那就去找到 build 目录,跑一发 make uninstall。这时候 /usr/local/bin 里面也许还有 ceph 打头的文件剩下,把它们换个地方备份起来。

现在,你还需要创建一个用户用来执行 Ceph 的相关操作,而不是直接使用 root。由于我们部署的是单节点的 Ceph,所以这里直接用个人用户就可以。按照官方中文文档配置 sudoers、创建 SSH Key,等等。都做完之后,创建一个工作目录,名字可以随意:

1
2
3
4
mkdir -p ~/workspace/ceph
cd ~/workspace/ceph
ceph-deploy new $HOSTNAME
ceph-deploy install $HOSTNAME

install 这一步可能会网络超时而报错,这是因为 Ceph 官网的源从国内访问实在是太慢了。如果这样的话,就去改 /etc/yum.repos.d/ceph.repo,把所有的软件源换成 TUNA 的,然后执行 ceph-deploy install --no-adjust-repos $HOSTNAME,注意新增了一个参数用来告诉 ceph-deploy 使用现有的软件源。

接下来,修改工作目录下的 ceph.conf,加下面这两句。注意文件最后必须有换行

1
2
osd pool default size = 1
osd crush chooseleaf type = 0

愿意的话还可以加个 public network,可以少个警告。然后:

1
2
sudo chmod -R 777 /var/run/ceph/
ceph-deploy --overwrite-conf mon create-initial

直到这一步结束都没有报错的话,接下来按照官方文档,从添加 OSD 那步开始部署就行了。