部署一个单节点的 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 remove
和 pip 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 status
和 journalctx -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 -v
和 sudo 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 | mkdir -p ~/workspace/ceph |
install 这一步可能会网络超时而报错,这是因为 Ceph 官网的源从国内访问实在是太慢了。如果这样的话,就去改 /etc/yum.repos.d/ceph.repo
,把所有的软件源换成 TUNA 的,然后执行 ceph-deploy install --no-adjust-repos $HOSTNAME
,注意新增了一个参数用来告诉 ceph-deploy 使用现有的软件源。
接下来,修改工作目录下的 ceph.conf,加下面这两句。注意文件最后必须有换行:
1 | osd pool default size = 1 |
愿意的话还可以加个 public network
,可以少个警告。然后:
1 | sudo chmod -R 777 /var/run/ceph/ |
直到这一步结束都没有报错的话,接下来按照官方文档,从添加 OSD 那步开始部署就行了。