Ceph-CRUSH算法的具體實現

Ceph的工作原理及流程

首先介紹RADOS中最爲核心的、基於計算的對象尋址機制,然後說明對象存取的工作流程,之後介紹RADOS集羣維護的工作過程,最後結合Ceph的結構和原理對其技術優勢加以回顧和剖析。     

 

尋址流程:

File:用戶需要存儲或訪問的文件。對於一個基於Ceph開發的對象存儲應用而言,這個file就是對應於應用中的“對象”,也就是用戶直接操作的對象。

Object:當上層應用向RADOS存入size很大的file時,需要將file切分成統一大小的一系列object進行存儲。

PG(Placement Group) 它可以看成是一致性哈希中的虛擬節點,維護了一部分數據並且是數據遷移和改變的最小單位。PG的用途是對object的存儲進行組織映射。具體而言,一個PG負責組織若干個object,但一個object只能被映射到一個PG中,即PGobject”一對多”映射關係。同時一個PG會被映射到nOSD上,而每個OSD上都會承載大量的PG,即PGOSD”多對多”映射關係。在生產環境中n至少爲3,

OSD:即object storage device在實踐中至少應該是數十上百個纔有助於Ceph系統的設計發揮其應有的優勢。

failure domain:故障域

 

Ceph中的尋址至少要經歷以下三次映射:

(1)File->object映射

這次映射的目的是將用戶要操作的file,映射爲RADOS能夠處理的object。其映射十分簡單,本質上就是按照object的最大sizefile進行切分,相當於RAID中的條帶化過程。

這種切分好處有二:

1.讓大小不限的file變成最大size一致、可以被RADOS高效管理的object.

2.讓對單一file實施的串行處理變爲對多個object實施的並行化處理。

每一次切分後產生的object將獲得唯一的oid,即object id .其生產方式也是線性映射,極其簡單

圖中,ino是待操作file的元數據,可以簡單理解爲該file的唯一idono則是由該file切分產生的某個object的序號。而oid就是將這個序號簡單連綴在該file id之後得到的。舉例而言,如果一個idfilenamefile被切分成了三個object,則其object序號依次爲012,而最終得到的oid就依次爲filename0filename1filename2

這裏隱含的問題是:ino的唯一性必須得到保證,否則後續映射無法正常進行。

 

(2)Object->PG映射

file被映射爲一個或多個object之後,就需要將每個object獨立地映射到一個PG中去。過程很簡單,計算公式是:

hash(oid) & mask -> pgid

計算由兩步組成。首先是使用Ceph系統指定的一個靜態哈希函數計算oid的哈希值,將oid映射成一個近似均勻分佈的僞隨機數值。然後將這個僞隨機數值與mask按位相與,得到最終的PG序號(pgid)。根據RADOS的設計,給定PG的總數爲m(m2的整數冪),則mask的值爲m-1。因此,哈希值計算和按位與操作的整體結果事實上是從所有mPG中近似均勻地隨機選擇一個。基於這一機制,當有大量object和大量PG時,RADOS能夠保證objectPG之間的近似均勻映射。又因爲object是由file切分而來,大部分objectsize相同,因而,這一映射最終保證了,各個PG中存儲的object的總數據量近似均勻。

只有在objectPG的數量較多是,這種僞隨機關係的近似均勻性才能成立,Ceph的數據存儲均勻性才能保證。一方面,object的最大size應該被合理配置,以使得同樣數量的file能夠被切分成更多的object;另一方面,Ceph也推薦PG總數量應該爲OSD總數的數百倍,以保證有足夠數量的PG可夠映射。

 

(3)PG->OSD映射

第三次映射就是將作爲object的邏輯組織單元的PG映射到數據的實際存儲單元OSD

RADOS採用一個名爲CRUSH的算法,將PGid帶入其中,然後得到一組工nOSD。這nOSD即共同負責存儲和維護一個PG中的所有object (n通常爲3)。具體到每個OSD,則由其上運行的OSD deamon負責執行映射到本地的Object在本地文件系統中的存儲、訪問、元數據維護等操作。

和”Object->PG”映射中採用的哈希算法不同,這個CRUSH算法的結果不是絕對不變的,主要受到兩個因素影響:1.當前系統狀態(宕機) 2.存儲策略配置(一般不變)

之所以在此次映射中使用CRUSH算法,而不是哈希算法,原因之一是CRUSH具有上述可配置特性,可以根據管理員的配置參數決定OSD的物理位置映射策略;另一方面是CRUSH具有特殊的”穩定性”,即當系統中加入新的OSD,導致系統規模增大時,大部分PGOSD之間的映射關係不會發生改變,只有少部分PG的映射關係會發生變化並引發數據遷移。這種可配置和穩定性Hash算法都不能提供。因此CRUSH算法也是Ceph的核心內容之一。

 

到此爲止,Ceph通過三次映射,完成從fileobjectPGOSD整個映射過程。整個過程沒有任何的全局查表操作需求。至於唯一的全局性數據結構cluster map,它的維護和操作都是輕量級的,不會對系統的可擴展性、性能等因素造成不良影響。

問:爲什麼要設計三層映射而不是一層?

答:如果將object直接映射到一組OSD上,如果這種算法是固定的哈希算法,則意味着一個object被固定映射在一組OSD上,當其中一個OSD損壞時,object也無法部署到新的OSD(因爲映射函數不允許)

如果設計一個動態算法(例如CRUSH算法)來完成這一映射,結果將是各個OSD所處理的本地元數據暴增,由此帶來的計算複雜度和維護工作量也是難以承受的。

綜上所訴,引入PG的好處至少有二:一方面試下呢objectOSD之間的動態映射,從而爲Ceph的可靠性、自動化等特性的實現留下了空間;另一方面也有效簡化了數據的存儲組織,大大降低了系統的維護管理開銷。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章