Ceph三連擊之二:不講CRUSH的Ceph教程是不完整的

post200發表於2021-09-09

前面我們提到了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的論文了

參考:

歡迎關注我:叄金大資料

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2249/viewspace-2812782/,如需轉載,請註明出處,否則將追究法律責任。

相關文章