本文所使用Ceph版本为luminous(不同版本删除OSD基本操作相同),当出现Ceph OSD为down的情况时,可以通过以下方法解决(假设ceph-admin节点OSD.1 Down,该OSD对应磁盘为/dev/sdb):
1.首先尝试能否重启ceph-osd服务
近期在维护ceph集群时,发现一些新的情况:
(1)ceph osd down掉之后(这里假设osd.1 down),去到对应的机器上使用systemctl | grep ceph 命令查看ceph进程时,发现[email protected]仍然显示active,此时通过systemctl restart [email protected]可以解决这个问题(这也许是ceph的一个bug?并没有严格考证过),可能需要等待一段时间服务才会重启成功(大约几分钟)。
{最近发现有时这种情况下简单重启一下进程不能解决问题,这时可以尝试以下步骤重新开启osd进程:
ceph osd out osd.1
systemctl stop [email protected]
ceph-osd -i 1 //执行完这一条命令后需要等待比较长的时间
如果执行成功,应提示如下信息:
[root@a-08 ~]# ceph-osd -i 1
starting osd.1 at - osd_data /var/lib/ceph/osd/ceph-1 /home/nvme/ceph/ceph-1/journal
2020-01-04 12:04:32.815 7f2cc6e82b80 -1 osd.1 69155 log_to_monitors {default=true}
如果执行失败并且提示如下信息:
osd.1 init authentication failed: (1) Operation not permitted
解决方法:
ceph auth del osd.1
ceph auth add osd.1 osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/ceph-1/keyring
ceph osd out osd.1
systemctl stop [email protected]
ceph-osd -i 1
问题应该得到解决
}
(2)如果ceph.conf配置文件中的cluster network字段配置错误会导致所有的osd服务down掉。
(3)ceph health detail提示slow ops, oldest one blocked for 109179 sec, daemons [osd.1,osd.2,osd.3] have slow ops,此时需要进入osd所对应机器上重启ceph-osd进程,但如果使用systemctl restart [email protected]重启会导致ceph-osd开始自动重启,过一段时间之后就会导致ceph-osd进程状态为failed,无法重启服务(后来尝试重启几次机器之后发现集群状态恢复正常,但是这种方法可能会导致数据丢失)。经过几次尝试,发现提示这种情况的slow ops时,需要首先使用systemctl stop [email protected]命令使[email protected]进程停止后,再使用systemctl start [email protected]才不会发生上述问题(执行完systemctl stop 命令后,不要马上重新执行systemctl start,需要等待集群状态趋于稳定后再执行systemctl start命令,可以通过ceph -w查看ceph集群实时状态,如果集群信息连续多行显示相同的信息,则说明集群状态已经处于稳定,此时可以执行systemctl start命令使osd重新启动)。如果重启这个进程之后ceph集群并未达到健康状态,则继续按此方法重启ceph health detail中有问题的osd。(如果ceph health detail中只是提示slow ops和monitorID,并没有具体的osd编号时,重启相应的monitor进程即可)
(4)有可能是硬件故障导致ceph osd down掉(概率比较低,但我确实遇到过),需要确认非硬件故障之后再尝试方法2(发生硬件故障之后是无法执行方法2的)。
2.如果重启无望,可采用以下步骤重新格式化硬盘并将其加入ceph集群中(以下步骤会将硬盘中的所有数据抹除)
步骤1.停止相应OSD服务
此步骤需要在Down掉的OSD所在节点上操作,
输入命令:
systemctl stop [email protected]
步骤2.取消OSD挂载
安装OSD时,会将osd.1挂载至/var/lib/ceph/osd/ceph-1,因此,删除OSD时,需要首先取消OSD挂载,
输入命令:
umount /var/lib/ceph/osd/ceph-1
步骤3. 设置OSD为OUT
输入命令:
ceph osd out osd.1
步骤4.删除OSD
输入命令:
ceph osd crush remove osd.1(如果未配置Crush Map则不需要执行这一行命令)
ceph auth del osd.1
ceph osd rm 1
步骤5.清空已删除磁盘中的内容
输入命令:
wipefs -af /dev/sdb
完成此项操作后,重启该OSD所在节点的机器
重启完成后,需要zap该磁盘,输入命令如下:
ceph-volume lvm zap /dev/sdb
如果zap成功,会提示以下信息:
--> Zapping: /dev/sdb
Running command: /usr/sbin/cryptsetup status /dev/mapper/
stdout: /dev/mapper/ is inactive.
Running command: /usr/sbin/wipefs --all /dev/sdb
Running command: /bin/dd if=/dev/zero of=/dev/sdb bs=1M count=10
stderr: 10+0 records in
10+0 records out
stderr: 10485760 bytes (10 MB) copied, 0.0195807 s, 536 MB/s
--> Zapping successful for: /dev/sdb
步骤6.重新安装OSD
输入命令:
ceph-deploy osd create --bluestore ceph-admin --data /dev/sdb
步骤7.查看OSD TREE
输入命令:
ceph osd tree
此时应该看到OSD为UP的情况
附:
如果不清楚osd编号与盘符的对应关系,可以通过以下命令查看(ceph在安装osd时,会向磁盘中写入一些信息,其中就包括osd编号、集群ID等):
此处以sdb为例
ceph-volume lvm list /dev/sdb (注:ceph-volume lvm list命令会将所有与ceph相关的磁盘中写入的ceph信息都显示出来)
如果磁盘很多,可以参考以下shell脚本(批量显示磁盘中的ceph集群信息),这个脚本可以显示出每一个磁盘对应的osd编号:
#!/bin/bash
osd=`fdisk -l | grep [^o]sd | awk '{print $2}' | sed "s/://g" | sort `
echo "Device in Ceph"
for i in $osd
do
echo $i
ceph-volume lvm list $i | grep "=====" | awk '{print $2}'
echo
echo "==================================================="
echo
done