概述
近期遇到項目,由于靈活配置,前期只有部分機器,后續擴容,想用ec4+2的糾刪碼,但前期只有3臺機器,需要做精簡ec。
erasure-code-profile
首先按照ceph創建糾刪碼池步驟進行操作。
創建ec4+2的rule
ceph osd erasure-code-profile set newecrule k=4 m=2
查看該rule
# ceph osd erasure-code-profile get newecrule
crush-device-class=
crush-failure-domain=host
crush-root=default
jerasure-per-chunk-alignment=false
k=4
m=2
plugin=jerasure
technique=reed_sol_van
w=8
創建糾刪碼存儲池
ceph osd pool create testec 1 1 erasure newecrule
通過ceph osd pool ls detail可以看到該pool相關信息,以及分配了crushrule。
如果是正常創建糾刪碼池,以上步驟基本完成,如果需要做精簡ec,或者自定義結構,可以繼續操作crushmap。
導出crushmap
導出crushmap,反編譯,ceph基操不做贅述,步驟如下:
ceph osd getcrushmap -o crushmap
crushmap -d crushmap -o crushmap.txt
查看crushmap,可以看到剛pool所使用的rule,結構如下
rule testec {id xtype erasuremin_size 3max_size 6step set_chooseleaf_tries 5step set_choose_tries 100step take defaultstep chooseleaf indep 0 type hoststep emit
這個就是標準的host容災的糾刪碼配置,其中ec的k+m是在erasure code profile中定義,這里的rule就是將糾刪碼的塊分別放到不同host中。
如果前期項目只有3個節點,顯然這里pg無法完成peering。
ec4+2:1
如果我們只有3臺host,我們可以保留ec4+2的特性,同時通過調整rule,將每兩個塊放到一個host上,實現ec4+2:1的配置,等到集群擴容完成后,再將rule恢復。
type erasuremin_size 3max_size 6step take defaultstep choose indep 3 type host step chooseleaf indep 2 type osd
此處的rule不難看出,先選3個host,再從host上選擇2osd,共6個osd完成pg peering和active。
精簡ec的問題
ec4+2host容災,正常是可以同時離線2個節點而完成自愈,而ec4+2:1只能同時離線一個節點,或者不同節點的2個盤(很好理解,最多損壞兩個塊)。
此外由于使用choose indep host后choose osd,當某個host下的osd不足完成2個塊的數據承擔時,仍有可能會被選中,導致pg卡住,無法完成peering。
因此當集群規模,預算足夠時,應即使擴容,調整成完整的非精簡的ec結構。