1. ceph羣集裏pg存在的意義?算法
PG是一種間址,PG的數量有限,記錄PG跟OSD間的映射關係可行,而記錄object到OSD之間的映射由於數量巨大而實際不可行或效率過低。從用途來講,搞個映射自己不是目的,讓故障或者負載均衡變得可操做是目的;負載均衡
ceph實現了兩種了字符串hash,ui
一種是Linux dcache採用的hash算法,比較簡潔;命令行
另外一種是RJenkins hash 算法,根據object name計算hash 採用的Rjenkins hash 算法。對象
計算x的過程:blog
1.對象name進行hash算出一個uint的值ps;字符串
2.ps與pgp_number進行mod後獲得餘數b;input
3.b於pool id進行hash,獲得一個值,即X,做爲do_crush_rule()的入參;jenkins
2. weight和reweighthash
ceph osd crush reweight」 設置了OSD的權重
weight :這個重量爲任意值(一般是磁盤的TB大小,1TB設置爲1),而且控制系統嘗試分配到OSD的數據量。
reweight :reweight將覆蓋了weight量。這個值在0到1的範圍,並強制CRUSH從新分配數據。它不改變buckets 的權重,而且是CRUSH不正常的狀況下的糾正措施。(例如,若是你的OSD中的一個是在90%以上,其他爲50%,能夠減小權重,進行補償。)
一般狀況下,當OSD上面數據相對不平衡時,咱們應該使用ceph osd reweight 命令修改reweight值,而不該該使用ceph osd crush reweight 命令修改weight值。
緣由在於,修改reweight值將不會改變bucket的weight,而若是修改weight值就會改變整個bucket的weight,bucket weight 一旦改變,就會致使數據在bucket之間進行遷移,而不是在bucket內部進行遷移,這能最小化數據的交換量。
經過ceph osd reweight 設置權重,更新了什麼?
ceph osd reweight 命令僅僅更新了OSDMap中osd_weights的值,而crush下面的item_weight值並不改變。從命令行傳入的 [0.0 ~ 1.0] 的值會被系統歸一化,將值乘個乘數(0x10000)並將其截整,因此osd_weigth下面的最大值爲 0x10000,這對於下面解釋osd_weights如何起做用時候,相當重要。
歸一化算式:weigth = (int)input_weight * 0x10000 (65536)
從算式可知,當weight 被截整後,精度可以到0.000015,若是權重值變化差別小於該值的,可能的結果是weigth截整後數值沒有變化,這也限定了weight的精度值。
簡單來講,bucket weight表示設備(device)的容量,1TB對應1.00。bucket weight是全部item weight之和,item weight的變化會影響bucket weight的變化,也就是osd.X會影響host。
osd weight的取值爲0~1。osd reweight並不會影響host。當osd被踢出集羣時,osd weight被設置0,加入集羣時,設置爲1。