ceph數據recovery配置策略(數據recovery流量控制)


 

Ceph在擴容或縮容期間會有數據rebalance。如何控制在rebalance時,盡量降低對client IO的影響?
本質上,用戶數據寫入ceph時,會被切分成大小相等的object,這些object由PG承載,分布到不同的OSD上(每個OSD一般會對應一塊硬盤)。數據的遷移會以PG為單位進行,所以當PG發生變化時,就會有數據rebalance。
后端的數據均衡IO會對client的IO造成影響從而影響到集群的業務IO,所以我們需要對數據均衡IO進行控制,主要是業務優先和恢復優先。
那么在什么時候PG會變化呢?
從用戶使用角度講一般有如下幾種場景:
1、osd暫時下線,然后又上線
2、osd硬件故障下線,更換硬盤重新上線

 

無論哪種情況,osd上線后通常會發現,自己承載的pg有數據落后了,需要進入恢復模式,從其它osd上獲取新的數據達到同步。這個過程就是recovery。
recovery分為兩種:
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'

 

 
場景三:完全保證client帶寬
在極端情況下,如果網絡帶寬及磁盤性能有限,這個時候為了不影響用戶體驗,不得不在業務繁重時段關閉數據重建及遷移的I/O,來完全保證client的帶寬,在業務空閑時段再打開數據重建及遷移,具體操作如下:
 
在業務繁忙時,完全關閉數據重建及遷移:
ceph osd set norebalance
ceph osd set norecover
ceph osd set nobackfill

 

 
在業務空閑時,打開數據重建及遷移:
ceph osd unset norebalance
ceph osd unset norecover
ceph osd unset nobackfill

 

 
以上前兩種方案操作配置均為立即生效,且重啟服務或者重啟節點后失效,如果想長期有效,可以在進行以上操作立即生效后,修改所有ceph集群節點的配置文件。

注:查看現有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",

 

推薦配置參數:
級別:
5%是業務優先,對業務影響最小;
100%恢復優先,對業務影響最大;
其他介於二者之間;
osd_min_pg_log_entries 正常情況下PGLog的記錄的條數,
osd_max_pg_log_entries 異常情況下pglog記錄的條數,達到該限制會進行trim操作

 

 

參考:https://www.cnblogs.com/dexter-wang/p/14176000.html

 https://ceph.com/planet/ceph-recover%E7%9A%84%E9%80%9F%E5%BA%A6%E6%8E%A7%E5%88%B6/

https://www.idcyunwei.org/post/234.html

https://blog.csdn.net/Linux_kiss/article/details/82857117?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM