前面我們提到了Ceph是一個支持統一存儲架構的分布式存儲服務。簡單介紹了Ceph的基本概念和基礎架構包含的組件,其中最重要的就是底層的RADOS和它的兩類守護進程OSD and Monitor。上篇文章我們還挖了一個坑,我們提到了CRUSH。
是的,我們這篇教程就是一篇不完整的Ceph教材,因為我們講CRUSH並不涉及其算法和實現原理,我們講的是Ceph整體的尋址流程,並借此深入理解一下Ceph中數據的操作流程。
這張就是Ceph的尋址流程示意圖了,大家可以看到里面主要分四層,File->Objects->PGs->OSDs。很多同學就要問了,這什么Objects,PGs是什么新名詞啊,我們先來看一下哈。
File:就是我們想要存儲和訪問的文件了,這個是面向我們用戶的,是我們直觀操作的對象。
Object:這個object就是Ceph底層RADOS所看到的對象,也就是在Ceph中存儲的基本單位了。object的大小由RADOS限定(通常為2m或者4m)。就跟HDFS抽象一個數據塊一樣,這里也是為了方便底層存儲的組織管理。當File過大時,需要將File切分成大小統一的objects進行存儲。
PG (Placement Group):PG是一個邏輯的概念,它的用途是對object的存儲進行組織和位置的映射,通過它可以更好的分配數據和定位數據。
OSD (Object Storage Device):這個前面我們也介紹過了,它就是真正負責數據存取的服務。
PG和object是一對多的關系,一個PG里面組織若干個object,但是一個object只能被映射到一個PG中。
PG和OSD是多對多的關系,一個PG會映射到多個OSD上(大於等於2,此處即為副本機制),每個OSD也會承載大量的PG。
了解了上面一些基本的概念之后,就要到我們的尋址流程講解了,通過尋址流程圖我們可以看到,Ceph中的尋址需要經歷三次映射,分別是File->Object,Object->PG,PG->OSD。我們重點提到的CRUSH就是在第三步映射PG->OSD出現的。我們依次看一下。
File->Object
這一步非常簡單,就是將file切分成多個object。每個object都有唯一的id即oid。這個oid是怎樣產生的呢,就是根據文件名稱得到的。
圖中的ino為文件唯一id(比如filename+timestamp),ono則為切分后某個object的序號(比如0,1,2,3,4,5等),根據該文件的大小我們就會得到一系列的oid。
注:將文件切分為大小一致的object可以被RADOS高效管理,而且可以將對單一file的處理變成並行化處理提高處理效率。
Object -> PG
這里需要做的工作就是將每個object映射到一個PG中去,實現方式也很簡單就是對oid進行hash然后進行按位與計算得到某一個PG的id。圖中的mask為PG的數量減1。這里我們認為得到的pgid是隨機的,這與PG的數量和文件的數量有關系。在足夠量級的程度上數據是均勻分布的。
PG -> OSD
最后一次映射就是將object所在的PG映射到實際的存儲位置OSD上。這里應用的就是CRUSH算法了,通過CRUSH算法可以通過pgid得到多個osd(跟配置有關)。
因為我們不會過多的討論CRUSH是如何實現的,我們可以換個思考的角度認識一下CRUSH都做了哪些工作。假如我們不用CRUSH用HASH是否可以?我們也套用上面的公式hash(pgid) & mask = osdid是否可以實現呢?
假如我們這里也用hash算法生成osdid,如果我們的osd的數量發生了改變,那么mask的值就會改變,我們最終得到的osdid的值就會改變。這就意味着我當前這個PG保存的位置發生了改變,該PG下的數據都需要遷移到另外一個OSD上去了,這肯定是行不通的。而Ceph是支持多副本備份機制的,PG是應該映射到多個OSD上去,而通過HASH的方式只能得到一個。所以這里就需要CRUSH了,CRUSH可以根據集群的OSD狀態和存儲策略配置動態得到osdid,從而自動化的實現高可靠性和數據均勻分布。
關於CRUSH的詳細實現還需參考Sage Weil的論文。
現在我們已經對三次映射有了一個簡單的了解,大家可以看到我們整個過程中我們只知道文件的名稱和文件大小等信息,並沒有去查詢文件所在位置信息等等,都是通過計算算出來的。上篇文章中我們提到的Monitors(提供元數據服務存儲)實際上只是維護着整個集群中一些服務的狀態信息也叫做ClusterMap。至於數據到底是在哪個osd是通過CRUSH算法計算出來的。所以這里的元數據服務跟HDFS的NameNode就又不一樣了。NameNode里面保持的就是每個block所在的具體位置。那么Ceph是怎樣做到的呢,其實就是因為邏輯層PG和CRUSH算法。讀懂了Ceph的尋址流程那么對於Ceph的數據讀寫流程自然就不陌生了。
是時候看看Sage Weil的論文了
參考:
Ceph官方文檔
ceph存儲數據的詳細流程(CRUSH)
歡迎關注我:叄金大數據(不穩定持續更新~~~)