ceph在扩容或缩容期间会有数据rebalance。如何控制在rebalance时,尽量降低对client IO的影响?调研如下:
首先,在什么情况下ceph会出现数据rebalance?
本质上,用户数据写入ceph时,会被切分成大小相等的object,这些object由PG承载,分布到不同的OSD上(每个OSD一般会对应一块硬盘)。数据的迁移会以PG为单位进行,所以当PG发生变化时,就会有数据rebalance。
那么在什么时候PG会变化呢?
从用户使用角度讲一般有如下几种场景:
- 添加/删除OSD
- 重新调整pool的PG数
Client IO优先
降低recovery的I/O优先级
1 | 调整后 |
降低recovery的I/O带宽及backfill带宽
1 | 调整后 |
调整相关命令
1 | [root@ceph ~]# ceph daemon osd.2 config set osd_recovery_op_priority 3 |
添加OSD时
1、BACK FILLING
当新的OSD加入群集时,CRUSH将把placement groups从群集中的OSD重新分配给新添加的OSD。强制新OSD立即接受重新分配的placement groups会给新OSD带来过多的负担。用placement groups backfilling OSD在后台运行。backfilling完成后,新的OSD将在准备就绪后开始处理请求。
在backfilling操作期间,您可能会看到以下几种状态之一:
- backfill_wait:表示backfilling操作尚未完成,但尚未进行
- backfilling:表示正在进行backfilling操作
- backfill_toofull:表示已请求backfill操作,但由于存储容量不足而无法完成
如果无法重新backfilled placement group,则可以认为该placement group considered incomplete(不完整)
backfill_toofull状态可能是瞬态的。随着PG的移动,空间可能变得可用。 backfill_toofull与backfill_wait类似,因为一旦条件发生变化,backfill就可以继续进行。
Ceph提供了许多设置来管理将placement groups重新分配给OSD(尤其是新OSD)相关的负载峰值。默认情况下,osd_max_backfill设置OSD之间最大并发backfill数为1。backfill full ratio可以使OSD拒绝接受backfill请求(默认为90%),使用ceph osd set-backfillfull-ratio命令进行更改。如果OSD拒绝backfill请求,则osd backfill retry interval使OSD可以重试该请求(默认为30秒后)。OSD还可以设置osd backfill scan min和osd backfill scan max以管理扫描间隔(默认为64和512)。
1 | Option("osd_max_backfills", Option::TYPE_UINT, Option::LEVEL_ADVANCED) |
参考资料
【1】https://blog.csdn.net/Linux_kiss/article/details/82857117
【2】http://www.zphj1987.com/2017/08/10/Ceph-recover-speed-control/