Ceph OSD数据重平衡/数据分发异常及手动触发、池容量扩展方法咨询
兄弟,完全懂你刚上手Ceph扩容后遇到这种数据分布不均的抓狂感!咱一步步来拆解问题,解决当前困境,再给你说以后避免踩坑的方法。
先搞懂为啥新OSD加了却没自动重平衡
Ceph默认会根据OSD使用率差异自动触发重平衡,但它有个触发阈值(默认是osd_rebalance_threshold=0.05,也就是5%的使用率差)。如果你的老OSD和新OSD差异没达到这个值,或者集群处于某种保护状态(比如设置了norebalance标记、有PG异常),就不会自动动起来。另外,如果你的池PG数量太少,扩容后PG没法均匀分配到新OSD,也会出现新OSD只分到一点点数据的情况。
手动触发重平衡的操作步骤
现在先解决你当前的紧急情况:
先确认集群基础状态
先跑ceph -s看看集群是不是HEALTH_OK,所有PG是不是active+clean。如果有PG异常(比如unavailable、stuck),得先把这些问题解决,不然重平衡没法正常进行。
再用ceph osd tree确认新添加的2个1TB OSD是不是处于up/in状态,有没有被加入CRUSH映射里。取消可能的重平衡限制
检查集群是不是设置了norebalance标记:ceph osd dump | grep norebalance如果输出里有这个标记,赶紧取消:
ceph osd unset norebalance手动触发CRUSH重计算与PG迁移
执行下面的命令让Ceph重新计算每个OSD的权重对应的PG分布:ceph osd crush reweight-all之后可以用
ceph -w或者ceph pg stat观察PG迁移情况,看有没有pg_backfill或者pg_recovery的任务在跑。加快迁移速度(可选)
如果迁移太慢,你可以临时调大迁移相关的参数(用完可以调回默认):# 允许每个OSD同时进行的回填任务数,默认是1 ceph config set osd osd_max_backfills 4 # 允许每个OSD同时进行的恢复任务数,默认是3 ceph config set osd osd_recovery_max_active 4
池容量扩展的正确姿势(避免以后再踩坑)
提前规划PG数量
PG数量是Ceph数据分布均匀的关键,数量太少会导致扩容后数据没法分到新OSD上。PG数建议是2的幂,你可以根据总OSD数、副本数估算(比如总OSD数5个、副本数3的话,PG数设为64或128比较合适)。如果之前的PG数不够,只能往上加:ceph osd pool set <你的池名> pg_num <新的PG数> ceph osd pool set <你的池名> pgp_num <新的PG数>注意:PG数只能增加不能减少,所以一开始规划的时候要留有余量。
提前扩容,别等满了才动手
当池使用率达到60%-70%的时候就该准备加OSD了,给Ceph留足够的时间完成重平衡。你这次等到池快满了才加,很容易导致PG进入只读状态,迁移根本跑不起来。调整重平衡阈值(可选)
如果希望Ceph对使用率差异更敏感,可以调小osd_rebalance_threshold的值,比如设为3%的差异就触发重平衡:ceph config set osd osd_rebalance_threshold 0.03
备注:内容来源于stack exchange,提问作者Thomas P

