背景:
经巡检,发现ceph集群存储节点osd故障。查询日志后,发现为硬盘损坏,需要更换损坏硬件,重新添加osd。
正文:
以下为更换osd实施步骤:
1.确认故障osd与host对应关系
目标主机:存储控制节点
ceph osd tree | egrep 'down|host'
(或者直接使用osd tree查看)
损坏的osd为osd.207,对应host 172.16.0.63
2.检查ceph集群健康状态
确保当前集群健康状态为health_ok,且所有pg处于active clean状态(否则可能会出现pg不一致的问题)
目标主机:存储控制节点
3.查询并记录原来的 osd 的 data 与 journal 对应关系
目标主机:需要处理的存储节点
sdj硬盘挂载异常,为故障盘
osd.207对应的日志盘(分区)为 /dev/sdb3
4.检查ceph参数
目标主机:存储控制节点
cat /etc/ceph/ceph.conf
确保 osd_max_backfills =1, osd_recovery_max_active = 1
5.配置ceph状态标志位
目标主机:存储控制节点
执行以下操作命令:
ceph osd set norebalance
ceph osd set nobackfill
ceph osd set noout
ceph osd set noscrub
ceph osd set nodeep-scrub
6.移除损坏的osd
目标主机:存储控制节点
替换 [id] 为需要移除的故障 osd id,此处应为osd.207
ceph osd crush reweight osd.[id] 0
ceph osd crush rm osd.[id]
ceph osd rm osd.[id]
ceph auth del osd.[id]
ceph osd crush reweight osd.207 0
ceph osd crush rm osd.207
ceph osd rm osd.207
ceph auth del osd.207
7.卸载该osd对应的磁盘
目标主机:需要处理的存储节点
umount /dev/sdj1
如果该磁盘已无法识别,则检查目录有没有异常挂载(目录信息为“???”),存在则执行卸载目录操作。
ll /var/lib/ceph/osd/
umount -l /var/lib/ceph/osd/ceph-207
如步骤3图所示,该盘已经无挂载信息,则不需要操作。
8.更换损坏硬盘
此步骤可以直接更换硬盘,不需要对存储节点(服务器)进行关机;如果需要进入raid卡配置,则需要关机重启,不会影响现有集群,更换完成后启动服务器。
9.检查日志盘分区权限
ls -l /dev/sdb3
此处日志盘分区为步骤3查到的对应分区,权限应为ceph:ceph,若不是,则需要手动修改权限,否则osd服务启动不成功。
chown ceph:ceph /dev/sdb3
10.重新添加osd节点新硬盘至集群
方法一:在mon节点使用工具添加。
目标主机:mon节点
ceph-deploy --overwrite-conf osd prepare [hostname]:[数据盘]:[日志盘分区] --zap-disk
ceph-deploy osd activate [hostname]:[数据盘分区]
本文应执行如下命令
cd /root/ceph-cluster
ceph-deploy --overwrite-conf osd prepare hdzwy1-osd-172-16-0-63:/dev/sdj:/dev/sdb3 --zap-disk
ceph-deploy osd activate hdzwy1-osd-172-16-0-63:/dev/sdj1
方法二:在需要处理的存储节点直接添加
ceph‐disk prepare [数据盘] [日志分区] ‐‐zap‐disk ‐‐filestore
ceph‐disk activate [数据盘分区]
本文应执行如下命令:
ceph‐disk prepare /dev/sdj /dev/sdb3 ‐‐zap‐disk ‐‐filestore
ceph‐disk activate /dev/sdj1
11.检查ceph集群状态
目标主机:存储控制节点
ceph -s
加入osd的2分钟内,会进行pg的remap操作,remap到新osd上的pg会处于 peering状态,无法对外io,故会对部分虚拟机造成慢请求。
如果处于peering状态的pg数量未减少,且慢请求一直持续,请执行回滚操作
12.移除 ceph 状态标志位
目标主机:存储控制节点
确认需要添加的 osd 添加完成且 pg peering 全部完成之后,执行以下操作
ceph osd unset norebalance
ceph osd unset nobackfill
13.移除剩余ceph状态标志位
待集群所有 pg 状态恢复为 active clean 之后,执行以下操作
ceph osd unset noout
ceph osd unset noscrub
ceph osd unset nodeep-scrub
至此,ceph集群更换osd结束。