? ? ? ? ? ? ?CRUSH(Controlled Replication Under Scalable Hashing)是一種基于偽隨機控制數據分布、復制的算法。Ceph是為大規模分布式存儲系統(PB級的數據和成百上千臺存儲設備)而設計的,在大規模的存儲系統里,必須考慮數據的平衡分布和負載(提高資源利用率)、最大化系統的性能,以及系統的擴展和硬件容錯等。CRUSH就是為解決以上問題而設計的。在Ceph集群里,CRUSH只需要一個簡潔而層次清晰的設備描述,包括存儲集群和副本放置策略,就可以有效地把數據對象映射到存儲設備上,且這個過程是完全分布式的,在集群系統中的任何一方都可以獨立計算任何對象的位置;另外,大型系統存儲結構是動態變化的(存儲節點的擴展或者縮容、硬件故障等),CRUSH能夠處理存儲設備的變更(添加或刪除),并最小化由于存儲設備的變更而導致的數據遷移。
CRUSH基本原理
? ? ? ? ?眾所周知,存儲設備具有吞吐量限制,它影響讀寫性能和可擴展性能。所以,存儲系統通常都支持條帶化以增加存儲系統的吞吐量并提升性能,數據條帶化最常見的方式是做RAID。與ceph的條帶化最相似的是RAID 0或者是“帶區卷”。Ceph條帶化提供了類似于RAID 0的吞吐量,N路RAID鏡像的可靠性以及更快速的恢復能力。
? ? ? ? ?在磁盤陣列中,數據是以條帶(stripe)的方式貫穿在磁盤陣列所有硬盤中的。這種數據的分配方式可以彌補OS讀取數據量跟不上的不足。
1. 將條帶單元(stripe unit)從陣列的第一個硬盤到最后一個硬盤收集起來,就可以稱為條帶(stripe)。有的時候,條帶單元也被稱為交錯深度。在光纖技術中,一個條帶單元被叫作段。
2.數據在陣列中的硬盤上是以條帶的形式分布的,條帶化是指數據在陣列中所有硬盤中的存儲過程。文件中的數據被分割成小塊的數據段在陣列中的硬盤上順序的存儲,這個最小數據塊就叫做條帶單元。
? ? ? ? 決定Ceph條帶化數據的3個因素:
◎ 對象大小:處于分布式集群中的對象擁有一個最大可配置的尺寸(例如,2MB、4MB等),對象大小應該足夠大以適應大量的條帶單元。
?◎?條帶寬度:條帶有一個可以配置的單元大小,Ceph Client端將數據寫入對象分成相同大小的條帶單元,除了最后一個條帶之外;每個條帶寬度,應用是對象大小的一小部分,這樣使得一個對象可以包含多個條帶單元。
?◎?條帶總量:Ceph客戶端寫入一系列的條帶單元到一系列的對象,這就決定了條帶的總量,這些對象被稱為對象集,當Ceph客戶端寫入的對象集合中的最后一個對象之后,它將會返回到對象集合中的第一個對象處。
Object與PG
? ? ? ? ?Ceph條帶化之后,將獲得N個帶有唯一oid(即object的id)。Object id 是進行線性映射生成的,即由file的元數據、Ceph條帶化產生的object的序號連綴而成。此時object需要映射到PG中,該映射包括兩部分。
? ? ? ? ? 1.由Ceph集群指定的靜態Hash函數計算Object的oid,獲取到其Hash值。
? ? ? ? ? 2.將該Hash值與mask進行操作,從而獲得PG ID
? ? ? ? ? 根據PADOS的設計,假定集群中設定的PG總數為M(M一般為2的整數冪),則mask的值為M-1。由此,Hash值計算之后,進行按位與操作是想從所有PG中近似均勻地隨機選擇。基于該原理以及概率論的相關原理,當用于數量龐大的Object以及PG時,獲得到的PG ID是近似均勻的。
? ? ? ? ?計算PG的ID示例如下:
? ? ? ? ? 1.Client輸入pool ID和對象ID(如pool='liverpool',object-id='john')。
? ? ? ? ? 2.CRUSH獲得對象ID并對其Hash運算。
? ? ? ? ? 3.CRUSH計算OSD個數,Hash取模獲得PG的ID(如0x58)。
? ? ? ? ? 4.CRUSH獲得已命名pool的ID(如liverpool=4)。
? ? ? ? ? 5.CRUSH預先考慮到pool ID相同的PG ID(如4.0x58)。
PG與OSD
? ? ? ? ?由PG映射到數據存儲的實際單元OSD中,該映射是由CRUSH算法來確定的,將PG ID作為該算法的輸入,獲得到包含N個OSD的集合,集合中第一個OSD被作為主OSD,其他的OSD則依次作為從OSD。N為該PG所在POOL下的副本數目,在生產環境N一般為3;OSD集合中的OSD將共同存儲和維護該PG下的Object。需要注意的是,CRUSH算法的結果不是絕對不變的,而是受其他因素的影響。其影響因素主要有以下兩個。
? ? ? ? ?一是當前系統狀態。也就是上文邏輯結構中曾經提及的Cluster Map(集群映射)。當系統中的OSD狀態、數量發生變化 時,Cluster Map可能發生變化,而這種變化將會影響到PG到OSD之間的映射。
? ? ? ? ? 二是存儲策略配置。這里的策略主要與安全相關。利用策略配置,系統管理員可以指定承載同一個PG的3個OSD分別位于數據中心的不同服務器乃至機架上,從而進一步改善存儲的可靠性。
? ? ? ? ?因此,只有在Cluster Map和存儲策略都不發生變化的時候,PG和OSD之間的映射關系才是固定不變的。在實際使用中,策略一經配置通常不會改變。而系統狀態的改變或者是因為設備損壞,或者是因為存儲集群規模擴大。好在Ceph本身提供了對于這種變化的自動化支持,因而,即便PG與OSD之間的映射關系發生了變化,并不會對應用造成困擾。事實上,Ceph正是需要有目的的利用這種動態映射關系。正是利用了CRUSH的動態特性,Ceph才可以將一個PG根據需要動態遷移到不同的OSD組合上,從而自動化地實現高可靠性、數據分布re-blancing等特性。
? ? ? ? 之所以在此次映射中使用CRUSH算法,而不是其他Hash算法,原因之一是CRUSH具有上述可配置特性,可以根據管理員的配置參數決定OSD的物理位置映射策略;另一方面是因為CRUSH具有特殊的“穩定性”,也就是當系統中加入新的OSD導致系統規模增大時,大部分PG與OSD之間的映射關系不會發生改變,只是少部分PG的映射關系會發生變化并引發數據遷移。這種可配置性和穩定性都不是普通Hash算法所能提供的。因此,CRUSH算法的設計也是Ceph的核心內容之一。
PG與Pool
? ? ? ? ? Ceph存儲系統支持“池”(pool)的概念,這是存儲對象的邏輯分區。
? ? ? ? ? Ceph Client端從Ceph mon端檢索Cluster Map,寫入對象到pool。Pool的副本數目,Crush規則和PG數目決定了Ceph將數據存儲的位置,如圖:
? ? ? ? ? ? Pool至少需要設定以下參數:
? ? ? ? ? ? ? ? ? ? ◎ ?對象的所有權/訪問權
? ? ? ? ? ? ? ? ? ? ◎? PG數目
? ? ? ? ? ? ? ? ? ? ◎? 該Pool使用的CRUSH規則
? ? ? ? ? ? ? ? ? ? ◎? ?對象副本的數目
CRUSH關系分析
? ? ? ? ? 從本質上講,CRUSH算法是通過存儲設備的權重來計算數據對象的分布的。在計算過程中,通過Cluster Map(集群映射)、Data Distribution Policy(數據分布策略)和給出的一個隨機數共同決定數據對象的最終位置。
Cluster Map
? ? ? ? Cluster Map記錄所有可用的存儲資源及相互之間的空間層次結構(集群中有多少個機架、機架上有多少服務器、每個機器上有多少磁盤等信息)。所謂的Map,顧名思義,就是類似于我們生活中的地圖。在Ceph存儲里,數據的索引都是通過各種不同的Map來實現的。另一方面,Map使得Ceph集群存儲設備在物理層作了一層防護。例如,在多副本結構上,通過設備合理的Map(故障域設置為Host級),可以保證在某一服務器死機的情況下,有其他副本保留在正常的存儲節點上,能夠繼續提供服務,實現存儲的高可用。設置更高的故障域級別(如Rack、Row等)能保證整機柜或同一排機柜在掉電情況下數據的可用性和完整性。
1.Cluster Map的分層結構
? ? ? ? ?Cluster Map由Device和Bucket構成。它們都有自己的ID和權重值,并且形成一個以Device為葉子節點、Bucket為軀干的樹狀結果。
? ? ? ? ? ? Bucket擁有不同的類型,如Host、Row、Rack、Room等,通常我們默認把機架類型定義為Rack,主機類型定義為Host,數據中心(IDC機房)定義為Data Center。Bucket的類型都是虛擬結構,可以根據自己的喜好設計合適的類型。Device節點的權重值代表了存儲設備的容量與性能。其中,磁盤容量是權重大小的關鍵因素。
? ? ? ? ? OSD的權重值越高,對應磁盤會被分配寫入更多的數據。總體來看,數據會被均勻寫入分布于集群所有磁盤,從而提高整體性能和可靠性。無論磁盤的規格容量,總能夠均勻使用。
? ? ? ? ? 關于OSD權重值的大小值的配比,官方默認值設置為1TB容量的硬盤,對應權重值為1.可以在/etc/init.d/ceph原碼里查看相關的內容。
2.恢復與動態平衡
? ? ? ? ? 在默認設置下,當集群里有組件出現故障時(主要是OSD,也可能是磁盤或者網絡等),Ceph會把OSD標記為down,如果在300s內未能回復,集群就會開始進行恢復狀態。這個“300s”可以通過"mon osd down ourt interval“配置選項修改等待時間。PG(Placement Groups)是Ceph數據管理(包括復制、修復等動作)單元。當客戶端把讀寫請求(對象單元)推送到Ceph時,通過CRUSH提供的Hash算法把對象映射到PG。PG在CRUSH策略的影響下,最終會被映射到OSD上。
Data Distribution Policy
? ? ? ? ? ? ?Data Distribution Policy由Placement Rules組成。Rule決定了每個數據對象有多少個副本,這些副本存儲的限制條件(比如3個副本放在不同的機架中)。一個典型的rule如下所示:
rule replicated_ruleset ? ? {? ##rule名字
? ? ? ruleset 0? ? ? ? ? ? ? ? ? ? #rule的ID
? ? ? type replicated? ? ? ? ##類型為副本模式,另外一種模式為糾刪碼(EC)
? ? ? min_size 1? ? ? ? ? ? ? ##如果存儲池的副本數大于這個值,此rule不會應用
? ? ? max_size 10 ? ? ? ? ? ##如果存儲池的副本數大于這個值,此rule不會應用
? ? ? step take default ? ?##以default root 為入口
? ? ? step chooseleaf firstn 0 type host ? ##隔離城為host級,即不同副本在不同的主機上
? ? ? step emit ? ? ? ? ? ? ? ? ##提交}
根據實際的設備環境,可以定制符合自己需求的Rule。
CRUSH中的偽隨機
? ? ? ? ? ? CRUSH(x) -> (osd1,osd2……osd N)
? ? ? ? ? CRUSH使用了多參數的Hash函數在Hash之后,映射都是按既定規則選擇的,這使得從x到OSD的集合是確定的和獨立的。CRUSH只使用Cluster Map、Placement Rules、X。CRUSH是偽隨機算法,相似輸入的結果之間沒有相關性。
? ? ? ? ? ? PGP是PG的邏輯承載體,是CRUSH算法不可缺少的部分。在Ceph集群里,增加PG數量,PG到OSD的映射關系就會發生變化,但此時存儲在PG里的數據并興地發生遷移,只有當PGP的數量也增加時,數據遷移才會真正開始。關于PG和PGP的關系,假如把PG比作參加宴會的人,那么PGP就是人坐的椅子,如果人員增加時,人的座位排序就會發生變化,只有增加椅子時,真正的座位排序變更才會落實。因此,人和椅子的數量一般都保持一致。所以,在ceph里,通常把PGP和PG設置成一致的。
查看PG映射OSD的集合,即PG具體分配到OSD的歸屬。
ceph pg dump | grep ^22\. | awk '{print $1 "\t" $17}'
? ? ? ? ? ?在Ceph集群里,當有數據對象要寫入集群時,需要進行兩次映射,第一次從object-->PG,第2次是PG-->OSD set 。每一次的映射都是與其他對象無相關的,這充分體現了CRUSH的獨立性(充分分散)和確定性(可確定的存儲位置)。