提前学习,做好功课,应对osd变更
写在前面
松鼠哥的ceph专业课程上线啦!
面向新手同学,从0实战,全面入门ceph安装部署与运维,有需要的同学赶紧扫码订购吧:
集群运行过程中会遇到各种情况,比较典型的是磁盘的损坏,那么磁盘损坏后处理闭环会涉及到不少osd的操作,另外就是扩容和缩容场景,或者更改集群crush结构,这些操作都会一定程度给集群带来震荡,也会产生数据恢复和业务感知,如果一定要操作osd,那么我们应该怎么样操作才能将影响降至最低呢?于是有了此篇测试报告。
首先,测试集群停止数据的读写,这样集群的总数据量是确定的,便于对比。
目标存储池是对象存储data pool,14.2.22版本,写入了相当一部分数据,策略为ec 4+2,容量4PiB
1 | data: |
开始前,将集群的backfill和recover都降到最低,然后在集群层面将backfill和recover都关闭,便于观察
1 | sudo ceph tell osd.* injectargs '--osd_recovery_max_single_start 1 --osd_recovery_sleep_hdd 1 --osd_recovery_max_active 1 --osd_max_backfills 1' |
首先是osd的up状态out出集群
1 | sudo ceph osd out 250 |
由于停止了backfill和recover,集群未进行数据恢复,pg稳定后,观察到受影响的pg数量是196,均为osd.250上面的pg
1 | data: |
查看pg情况,发现osd上pg 都是在的,状态全部为active+remapped+backfill*
1 | [twj@test-node1 ~]$ sudo ceph pg ls-by-osd 250 |
打开集群恢复并调大速度后,osd.250的磁盘读直接拉满
1 | avg-cpu: %user %nice %system %iowait %steal %idle |
query pg的信息及op,确认是读取本osd的相关数据
1 | [twj@test-node9 ~]$ sudo ceph daemon osd.250 dump_historic_ops_by_duration|grep description|awk '{print $2}' |
经过统计,参与backfill的osd为265个,而该pool一共270个osd,因此近似认为pool中所有osd都参与到了本次backfill
1 | -61 270.00000 root hdd-root-1 |
在恢复的后期,可以观察到osd.250上面的pg数量是缓慢下降的。
1 | data: |
实验表明,当osd是up状态且被out出集群时,原本属于它的pg会被重新分布到其他的osd上,而数据的还原方式是通过从原来osd上读取然后backfill到目标osd
接下来是reweight方式,注意到,reweight调整osd为0后,osd将自动out出集群,因而预期的操作结果与手动out没有区别
1 | sudo ceph osd reweight 250 0 |
集群状态及osd的df与out操作后观察到的结果是一致的
1 | data: |
查看了pg query及相关log,与out操作产生的效果没有区别
实验表明,当osd为up时,reweight效果与out一致
接下来是移动到空的bucket
有时候,我们希望的是将osd从某个host抽出,放入其他的host中做一个新的pool,那么效果如下
1 | [twj@test-node1 ~]$ sudo ceph osd crush move osd.250 host=test-1 |
查看集群状态,发现受影响的pg达到了409个
1 | data: |
其中osd.250上的196个pg也是全部进入backfill* 状态
实验表明,osd为up状态时,不out出集群而是移动到其他的host,会引发更大的数据迁移,也就是说,out出集群和不out出集群,osd离开pool触发的流程是不相同的,从结果来看,直接out出集群会是更好的方案
那么,先out出集群,再立刻move到别的host,是否触发大量pg迁移呢?结果如下
1 | [twj@test-node1 ~]$ sudo ceph osd out 250 |
实验表明,只要osd没有out出集群,离开pool会引发更多的数据迁移
那么osd为down状态,情况是否会有不同呢?先看看out的情况
1 | data: |
可以看到,out出集群后,受影响的pg 数量仍然为196个,但是因为osd.250已经down了,所以osd.250 上面的数据肯定是没办法读出给其他的osd,因而其恢复方式应该是从另外的EC分片中计算得到。
move的情况
1 | data: |
可见受影响的pg数量多得多
由此可见,osd离开pool,其状态是up还是down,影响的pg数量没有区别。
总结
实验表明,无论osd是up还是down,当要将其从pool中移除,最好的做法是将其out出集群,这在缩容场景中还是很实用的,其中osd up状态将读取原有数据分配给其他osd,而osd down状态则需要恢复的方式,这在ec场景尤为重要,因为移除osd后,该osd的数据如果能够从原osd读取得到,就不需要让另外的k个pg参与,这就很大程度减轻了集群整体的负载,当然,受限于原osd磁盘的读取速度,恢复速度也许不会很大
- 本文作者: 奋斗的松鼠
- 本文链接: http://www.strugglesquirrel.com/2023/12/05/OSD操作探究/
- 版权声明: 本博客所有文章除特别声明外,创作版权均为作者个人所有,未经允许禁止转载!