Ceph Balancer (upmap 模式) 啟用與配置
在 Ceph Nautilus (14.2.22) 版本中啟用和配置 Balancer 的完整步驟
1. 前提檢查
檢查集群的初始狀態和版本。
集群狀態 (ceph -s
)
cluster:id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxhealth: HEALTH_OKservices:mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 4w)mgr: ceph-node1(active, since 4w)mds: cephfs_ec:1 {0=ceph-node1=up:active} 1 up:standbyosd: N osds: N up (since 3w), N in (since 3w)data:pools: X pools, Y pgsobjects: A objects, B TiBusage: C TiB used, D PiB / D PiB availpgs: Y active+clean
Ceph 版本 (ceph -v
)
ceph version 14.2.22 (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) nautilus (stable)
2. 啟用 Balancer 模塊
啟用 balancer
模塊。系統提示該模塊已默認啟用。
[root@ceph-node1 ~]# ceph mgr module enable balancer
module 'balancer' is already enabled (always-on)
查看 Balancer 初始狀態,此時模式為 none
,且未激活。
[root@ceph-node1 ~]# ceph balancer status
{"last_optimize_duration": "", "plans": [], "mode": "none", "active": false, "optimize_result": "", "last_optimize_started": ""
}
3. 配置 Balancer 模式為 upmap
我們選擇 upmap
模式,因為它效率高且對集群性能影響小。
步驟 3.1: 解決兼容性問題
嘗試設置 upmap
模式時,系統報錯,提示需要最低的客戶端兼容版本為 luminous
。
[root@ceph-node1 ~]# ceph balancer mode upmap
Error EPERM: min_compat_client "jewel" < "luminous", which is required for pg-upmap. Try "ceph osd set-require-min-compat-client luminous" before enabling this mode
根據錯誤提示,執行以下命令更新客戶端兼容性要求:
[root@ceph-node1 ~]# ceph osd set-require-min-compat-client luminous
set require_min_compat_client to luminous
步驟 3.2: 成功設置 upmap
模式
解決兼容性問題后,再次嘗試設置模式,命令成功執行。
[root@ceph-node1 ~]# ceph balancer mode upmap
4. 開啟 Balancer 并驗證
現在,正式開啟 Balancer。
[root@ceph-node1 ~]# ceph balancer on
開啟后,立即查看狀態,可以看到 active
已變為 true
,mode
為 upmap
,并且系統已成功創建優化計劃。
[root@ceph-node1 ~]# ceph balancer status
{"last_optimize_duration": "0:00:00.xxxxxx", "plans": [], "mode": "upmap", "active": true, "optimize_result": "Optimization plan created successfully", "last_optimize_started": "YYYY-MM-DD HH:MM:SS"
}
5. 觀察集群狀態變化
Balancer 開始工作后,會進行 PG 的重映射(remap)和數據遷移。此時通過 ceph -s
查看集群狀態,會發現健康狀態變為 HEALTH_WARN
。
[root@ceph-node1 ~]# ceph -scluster:id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxhealth: HEALTH_WARNDegraded data redundancy: X/Y objects degraded (Z%), A pgs degradedservices:mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 4w)mgr: ceph-node1(active, since 4w)mds: cephfs_ec:1 {0=ceph-node1=up:active} 1 up:standbyosd: N osds: N up (since 3w), N in (since 3w); M remapped pgsdata:pools: X pools, Y pgsobjects: A objects, B TiBusage: C TiB used, D PiB / D PiB availpgs: X/Y objects degraded (Z%)A/B objects misplaced (C%)D active+cleanE active+recovery_wait+undersized+degraded+remappedF active+recovering+undersized+remappedio:recovery: X MiB/s, Y objects/s
注意: HEALTH_WARN
狀態是預期現象,因為數據正在根據優化計劃進行遷移。degraded
、misplaced
、remapped
等狀態表明 PG 正在被移動到更合適的 OSD 上。等待數據恢復(recovery)和回填(backfilling)完成后,集群狀態將恢復到 HEALTH_OK
。
6. 開啟balancer后 限制recovery恢復速度
recovery: 8.9 GiB/s, 2.28k objects/s
# ceph tell osd.1 config get osd_max_backfills
1
# ceph tell osd.1 config get osd_recovery_max_active
3
# ceph tell osd.1 config get osd_recovery_max_single_start
1
# 客戶端 I/O 默認優先級為 63,此參數默認值為 3,值越小優先級越低。
# ceph tell osd.1 config get osd_recovery_op_priority
1
# ceph tell osd.1 config get osd_recovery_sleep
0.000000
# 當以上并發數限制仍無法有效降低 I/O 時
# 最有效的方法是引入休眠時間。這會在兩次 recovery/backfill 操作之間插入一個短暫的延遲(單位:秒),
# 從而直接降低整體帶寬。可以從 0.1 開始嘗試,根據實際情況調整。
ceph tell 'osd.*' config set osd_recovery_sleep 0.1
# ceph tell osd.1 config get osd_recovery_sleep
0.100000
recovery: 3.4 GiB/s, 865 objects/s