Ceph分布式存储系统OSD单元down以及out状态的排查与修复
我自己搭建的家用CEPH分布式存储系统由三套监控器(monitor)和六套存储单元(OSD)组成。Monitor监控器运行在单板电脑(SBC,single board computer)上,而osd存储单元则运行在Intel NUC迷你电脑上。为了方便管理,我用激光切割机制作了亚克力材料的支架用于统一放置这些设备。在使用了这个系统一段时间以后,我不得不承认这套由CEPH平台搭建的软件定义存储(SDS)系统的强大和稳定。多年来我在这个系统上全天候运行多个网站(包括您正在浏览的这个)从未间断过……直到有一天,长达半天的停电造成UPS蓄电池彻底放空导致宕机。重启以后,六套OSD中的两套无论如何无法重启,一直处于out和down的状态。
osd: 6 osds: 4 up (since 5m), 4 in (since 5m)
尽管如此,还是需要给CEPH系统来个大写的赞!因为在三分之一OSD掉线的情况下,文件系统依然稳定,网站也依然稳定保持快速响应。接下来就来说说我是如何排查寻找原因最终成功恢复系统的。
第一步,排查硬件问题
使用下面的命令来找出问题OSD:
ceph osd tree
显示结果发现宕机的两套OSD均在同一台NUC上面(备注:我的系统一共三台Intel NUC,每台里面由两片SSD,每个SSD单独配置成一个OSD)。很自然地,第一个怀疑目标就是那块NUC除了问题……可是登录那台问题NUC的系统以后发现一切正常,没有过热;网络连接通畅;磁盘也完全没有写满。
第二部,重启OSD服务
硬件没有问题,那是不是服务掉线了,重启试试看:
sudo systemctl start ceph-osd@4
sudo systemctl start ceph-osd@5
初次运行上面命令的时候,系统貌似接受了指令而且没有提示任何错误。并且CEPH的系统状态确实变成了:
osd: 6 osds: 4 up (since 5s), 6 in (since 5s)
乍看CEPH系统确实开始在恢复两套OSD,可是并没有过多久就放弃了,重新变回了“4 in”。我只能重新尝试重启服务,可这次系统就直接提示启动服务失败。所以我又通过运行下方的命令来查看失败原因:
sudo systemctl status ceph-osd@4.service
我输出的日志中,我发现了几条可疑线索:
received signal: Interrupt from Kernel ( Could be generated by pthread_kill(), raise(), abort(), alarm() ) UID: 0
osd.4 1746 *** Got signal Interrupt ***
osd.4 1746 *** Immediate shutdown (osd_fast_shutdown=true) ***
看上去感觉OSD服务在试图重启的过程中,收到了来自Kernel的强制杀进程指令,导致了重启服务失败。
第三步,删除OSD再重新加入CEPH系统
我开始怀疑,是否OSD的那台电脑配置出了问题倒是服务无法上线,最终被Kernel杀死。我检查了系统时间,未发现有问题。然后我按照这篇文章的步骤删除了OSD,并重新配置添加,可还是无法解决问题。
最终步骤,在CEPH日志脚本中发现线索,都是IP惹的祸
我发觉CEPH系统会在每台服务器上留下日志,所以我在一下所示的位置上找到了出问题的NUC上的日志:
/var/log/ceph/ceph-osd.4.log
你只需要把4换成相应的数字即可。然后我找到了一条关键线索:
-1 osd.4 1717 heartbeat_check: no reply from 100.0.0.100:6804 osd.0 ever on either front or back, first ping sent 2025-05-13 17:52:27.107270 (oldest deadline 2025-05-13 17:52:47.107270)
而且我在osd.5.log里面也同样发现了一样的记录。也就是说,该OSD服务器无法和其他OSD服务器相互通讯。我是用ping命令做了最简单的测试,果然发觉OSD4/5服务器可以ping通OSD0/1服务器, 但反过来则失败。经过一盘排查,最终发现OSD0/1服务器上的IP地址,同时使用了静态IP设置和动态IP分配(不要问为什么……),结果倒是OSD0/1服务器被配置了双IP,也不知为何双IP貌似一直没什么问题,直到最近的断电重启以。显然这造成了DHCP分配了一个陌生的IP地址导致了通讯失败。但是我还是没法解释为什么,尤其另外一个静态IP没有变化过。不管怎么样,我取消了DHCP功能并再次重启服务,这下CEPH一下子就重新上线了丢失的两个OSD,变成了“6 up”和“6 in”!
提示:linux系统上配置动态静态IP的文件位于
/etc/netplan
修改相应的.yaml文件以后执行一下命令来生效即可:
sudo netplan apply