上圖大體可以表示從檔案到儲存在儲存實體上的過程,詳細步驟如下:
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。
ceph中糾刪碼如何讀寫資料
從該圖我們可以看到從前端的業務檔案到資料儲存到儲存硬碟上的過程,步驟如下 1.file object對映 rados中需要配置object的大小,一般會設定為2m到4m的大小。當使用者寫入資料檔案時,首先會根據object的大小值將file進行切分。如果file的大小不足object的大小,則直接按...
Ceph的正確玩法之Ceph糾刪碼理論與實踐
注意空格,有的命令少空格 一 糾刪碼原理 糾刪碼 erasure coding,ec 是一種編碼容錯技術,最早是在通訊行業解決部分資料在傳輸中的損耗問題。其基本原理就是把傳輸的訊號分段,加入一定的校驗再讓各段間發生相互關聯,即使在傳輸過程中丟失部分訊號,接收端仍然能通過演算法將完整的資訊計算出來。在...
hdfs的讀寫過程
詳細步驟解析 1 client發起檔案上傳請求,通過rpc與namenode建立通訊,namenode檢查目標檔案是否已存在,父目錄是否存在,返回是否可以上傳 client呼叫filesystem.create filepath 方法,去與nn進行 rpc 通訊,check該路徑的檔案是否存在以及有...