ceph 剔除 osd 步骤

有时候磁盘故障或者即将故障,我们需要将osd剔除,主要分为如下几步:

前提

ceph集群空间足够,否则如果剔除osd,集群写满,会造成拒绝写入问题

方式一

设置osd out

1
2
3
4
5
ceph osd out osd.{osd-number} # 5 osds: 5 up, 4 in 会提示in状态的osd数减少了
然后等待集群rebalancing 和 copying 数据 到其他osds上
/var/lib/ceph/osd/ceph-{osd-number}/current/ 目录下的数据会清空
通过ceph osd tree 会发现该osd的REWEIGHT 为0
通过ceph -w观察集群状态直到ok

关闭 osd 服务

1
2
ssh {osd-host}
systemctl stop ceph-osd@{osd-number} # 5 osds: 4 up, 4 in 会提示up状态的osd数减少了

从crush map 移除osd信息

1
2
3
4
ceph osd crush remove {node_name} ##ceph osd crush remove osd.3
该节点将不会再接收数据
会触发peering和recovering
通过ceph osd tree 会查看到该osd的WEIGHT 为0

删除osd 认证信息

1
ceph auth del osd.X ##不执行该步骤,则osd的编号会继续占用

删除osd

1
ceph osd rm X ##从集群里删除这个节点记录, 4 osds: 4 up, 4 in 会发现osd的总数减少了

后记

1
2
3
4
5
6
7
如果一个节点剔除,即该节点上的所有osd以及剔除,而执行 ceph osd tree 发现还有该节点信息,可以通过
ceph osd getcrushmap -o compiled-crushmap
crushtool -d compiled-crushmap -o decompiled-crushmap
vim decompiled-crushmap 然后删除该节点的相关信息
crushtool -c decompiled-crushmap -o new_compiled-crushmap
ceph osd setcrushmap -i new_compiled-crushmap
这样该几点信息就不复存在了

方式二

设置 norebalance norecovery nobackfill

1
2
3
ceph osd set norebalance
ceph osd set norecovery
ceph osd set nobackfill

调整 weight

1
ceph osd crush reweight osd.{osd-number} 0 # 调整osd的WEIGHT值, 因为前面设置了norebalance norecovery nobackfill,这里并没有迁移数据,只是做了标记

从crush map 移除 osd

1
ceph osd crush remove osd.{osd-number}

关闭服务

1
2
ssh {ceph-node}
systemctl stop ceph-osd@{osd-number}

删除认证

1
2
ceph auth del osd.X
ceph osd rm X

取消设置 norebalance norecover nobackfill

1
2
3
ceph osd unset norebalance
ceph osd unset norecover
ceph osd unset nobackfill

引用: Ceph 替换 osd
ceph osd set norebalance