ceph若干關鍵問題

1. ceph羣集裏pg存在的意義?算法

因爲PG和OSD的數量都比較有限,記錄每一個OSD承載了哪些PG可行,並且變化不頻繁,開銷小。 在OSD X故障後,很容易得到OSD X承載的PG列表,並計算出各個PG的另外兩個副本在哪一個OSD。而每一個PG下面的對象,都按照PG作了彙集(稱爲collection,每一個PG對應一個目錄或者共用k/v存儲的prefix),很容易得到對象列表。有了這些信息,才具有了故障處理的可行性。

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。

相關文章
相關標籤/搜索