ceph数据recovery配置策略(数据recovery流量控制)
1、osd暂时下线,然后又上线 2、osd硬件故障下线,更换硬盘重新上线
log-based recovery: 是说osd故障时间不长,需要恢复的数据可以通过pg log回放找回来。 backfill recovery: 是说无法通过pg log回放找全数据,只能通过全量回填(backfill)拷贝。
ceph tell osd.* injectargs '--osd-max-backfills 1 --osd-recovery-max-active 1 --osd-recovery-max-single-start 1' ceph tell osd.* injectargs '--osd-recovery-sleep 1'
ceph tell osd.* injectargs '--osd-max-backfills 5 --osd-recovery-max-active 5 --osd-recovery-max-single-start 5' ceph tell osd.* injectargs '--osd-recovery-sleep 0'
ceph tell osd.* injectargs '--osd-max-backfills 1 --osd-recovery-max-active 3 --osd-recovery-max-single-start 1' ceph tell osd.* injectargs '--osd-recovery-sleep 0'
ceph osd set norebalance ceph osd set norecover ceph osd set nobackfill
ceph osd unset norebalance ceph osd unset norecover ceph osd unset nobackfill
注:查看现有recovery配置信息,这里的133为具体osd的id号
ceph --admin-daemon /var/run/ceph/ceph-osd.133.asok config show | grep -E "osd_max_backfills|osd_recovery_max_active|osd_recovery_max_single_start|osd_recovery_sleep" "osd_max_backfills": "1", "osd_recovery_max_active": "1", "osd_recovery_max_single_start": "1", "osd_recovery_sleep": "0.000000", "osd_recovery_sleep_hdd": "0.100000", "osd_recovery_sleep_hybrid": "0.025000", "osd_recovery_sleep_ssd": "0.000000",
扩展:参数解析
osd_max_backfills : 一个osd上最多能有多少个pg同时做backfill。其中osd出去的最大backfill数量为osd_max_backfills ,osd进来的最大backfill数量也是osd_max_backfills ,所以每个osd最大的backfill数量为osd_max_backfills * 2; osd_recovery_sleep: 出队列后先Sleep一段时间,拉长两个Recovery的时间间隔;
以下二个参数,网上解释大多有误导,结合代码以及官方材料分析为:
osd_recovery_max_active: 每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量; osd_recovery_max_single_start: OSD在某个时刻会为一个PG启动恢复操作数;
这两个参数需要结合在一起分析:
a.假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动1个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。 b.假设我们配置osd_recovery_max_single_start为2,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动2个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。例如第一个pg启动2个恢复操作,第二个pg启动1个恢复操作,第三个pg等待前两个pg 恢复操作完进行新的恢复。
recovery相关参数
osd_max_backfills:默认值10. 一个osd上承载了多个pg。可能很多pg都需要做第二种recovery,即backfill。 设定这个参数来指明在一个osd上最多能有多少个pg同时做backfill。 osd_recovery_max_active:默认值15. 一个osd上可以承载多个pg, 可能好几个pg都需要recovery,这个值限定该osd最多同时有多少pg做recovery。 osd_recovery_max_single_start:默认值5. 这个值限定了每个pg可以启动recovery操作的最大数。 osd_recovery_max_chunk: 默认值8388608. 设置恢复数据块的大小,以防网络阻塞 osd_recovery_op_priority: 默认值10. osd修复操作的优先级, 可小于该值 osd_recovery_sleep: 默认值0. revocery的间隔
"osd_max_backfills": "1", "osd_recovery_sleep": "0", "osd_recovery_max_active": "3", "osd_recovery_max_single_start": "1",
调整脚本,例如故障的物理机和磁盘为9,10,11,12
#!/bin/bash
for item in {0..47}
do
if (( item < 9 || item > 12 )); then
# 执行循环体内的命令
echo $item
ceph tell osd.$item injectargs '--osd-max-backfills 1 --osd-recovery-max-active 1 --osd-recovery-max-single-start 1 --osd_recovery_op_priority 1'
ceph tell osd.$item injectargs '--osd-recovery-sleep 1'
fi
done
查看调整是否生效
ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show | grep -E "osd_max_backfills|osd_recovery_max_active|osd_recovery_max_single_start|osd_recovery_op_priority"
"osd_max_backfills": "1",
"osd_recovery_max_active": "1",
"osd_recovery_max_active_hdd": "10",
"osd_recovery_max_active_ssd": "20",
"osd_recovery_max_single_start": "1",
"osd_recovery_op_priority": "1",
4个代表没问题
1 对 “ceph数据recovery配置策略(数据recovery流量控制)”的想法;