1. 程式人生 > >Ceph中糾刪碼的讀寫過程與快取分層

Ceph中糾刪碼的讀寫過程與快取分層

之前一直在關注Ceph讀寫過程與修復,現將之前看到的內容記錄下來。歡迎探討。

讀寫過程

上圖大體可以表示從檔案到儲存在儲存實體上的過程,詳細步驟如下:

1.       RADOS中需要配置Object Size的值,也就是每個Object大小的最大值,一般情況下會設定為2M到4M。當一個file存進ceph中時,會根據Object Size將file進行切分。若file的大小不足Object Size,則直接按原大小對映到一個Object中;若file的大小大於Object Size,則file會被切分為若干個完整大小的Object,和一個不完整大小的Object。對於小檔案,對映不足一個完整的Object時,並不會發生填充,Object大小就是原始檔案的大小。

Object的大小,可以在ceph.file.layout中object_size進行配置。

$ touch file

$ getfattr -n ceph.file.layout file

# file: file

ceph.file.layout="stripe_unit=4194304 stripe_count=1object_size=4194304 pool=cephfs_data"

2.       從Object對映到PG的過程就是簡單的Hash運算。將Object id計算出一個hash值然後與mask位與就可以得到PG的id值。

3.       Crush演算法的作用是定位資料存放的位置,在這個步驟中就是將PG對映到一個OSD set中。在三副本replicated下,set中就會有三個osd。第一個就是primary osd,負責接受讀寫請求和維護一致性以及進行修復。後兩個就是replicated osd。

4.       寫檔案的過程是,client先寫到primary osd上,然後再由primary osd寫到replicated osd上。為了維護強一致性,具體的流程如下。

 

1)      通過上述過程,client找到primary osd,並將Object寫入到其上。

2)      再由primary osd寫到set中的secondary osd上。

3)      再由primary osd寫到set中的Tertiary osd上。2、3基本上是同時進行的。

4)      Secondary osd接收到Object,寫入後給Primaryosd傳送一個Ack,確認已經寫入。

5)      Tertiary osd接收到Object,寫入後給Primaryosd傳送一個Ack,確認已經寫入。4、5過程也可以是同時進行的。

6)      Primary osd在接收到另兩個都已經寫入的確認後,向client傳送一個Ack,表示此Object已經寫入完畢。

至此一個Object的寫過程就已經結束了。需要強調的是,上述1. ,2. ,3.都是發生在client上,而4.過程是client直接與Primary osd聯絡,減少了cluster中需要傳輸的總資料量。

使用糾刪碼

使用糾刪碼也只是上述過程中3、4步驟有所不同。


糾刪碼編碼與解碼的運算過程都是在Primary osd做的。一個Object通過Crush演算法找到Primary osd,client完全寫Object到Primary osd上。之後的過程如上圖所示,根據糾刪碼的引數設定(K,M;K為資料塊個數,M為編碼塊個數),Object在Primary osd上被切分成K個chunk或者說是fragment。若原來Object的大小不能被K整除,則會進行一些填充,以保證每個chunk大小相同。每個chunk的obj_name都相同,用shardk來標記。

使用糾刪碼,原來的Object會產生K+M個chunk。第一個chunk存在Primary ods上,剩下的K+M-1個chunk,Primary osd會依次傳送到相應的osd上。

在讀檔案時,Primary osd會收集相應osd上的chunk,然後在Primary osd恢復出原Object,發給client。Primary osd會優先收集資料塊進行拼接重建出原Object,編碼塊用於恢復出丟失的塊。

糾刪碼的具體配置過程可以參考:

糾刪碼的預設引數為:

快取分層

單獨使用糾刪碼會產生較大程度的延遲,影響SLA。所以較新版本的ceph中都會將糾刪碼和快取分層(Cache Tiering)結合起來使用。

快取分層包括建立一個相對快速的儲存裝置池,比如說SSD,將其配置為一個快取層。和一個後備的相對經濟的儲存裝置層,該層主要放置經過糾刪碼編碼後的資料塊。Ceph objecter處理Objects的放置位置,tiering agent處理何時將Objects從cache寫入到後備儲存層。快取層和後備儲存層的存在相對於client都是透明的。

 

Cache tiering agent自動處理快取層和後備儲存層間的資料遷移。有兩種模式可以選擇:

l  Writeback 模式:client寫資料到快取層,並從快取層接收ACK,同時快取層中的資料寫入到儲存層。當client需要儲存層中的資料時,tiering agent會寫先從儲存層中讀資料到快取層,然後再發送給client。

l  Read-only模式:client直接寫資料到儲存層。讀資料時,tiering agent先將要讀取的Objects從儲存層複製到快取層,再由快取層傳送給client。

要設定快取分層就需要有兩個池,一個作為後備儲存,另一個作為cache。