您好,登錄后才能下訂單哦!
這篇文章主要介紹了Ceph實(shí)現(xiàn)讀寫(xiě)流程的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
消息封裝
在OSD上發(fā)送和接收信息。有兩類:
1.cluster_messenger -與其它OSDs和monitors溝通
2.client_messenger -與客戶端溝通
消息調(diào)度
Dispatcher類,主要負(fù)責(zé)消息分類
工作隊(duì)列
1. OpWQ: 處理ops(從客戶端)和sub ops(從其他的OSD)。運(yùn)行在op_tp線程池。
2. PeeringWQ: 處理peering任務(wù),運(yùn)行在op_tp線程池。
3. CommandWQ:處理cmd命令,運(yùn)行在command_tp。
4. RecoveryWQ: 數(shù)據(jù)修復(fù),運(yùn)行在recovery_tp。
5. SnapTrimWQ: 快照相關(guān),運(yùn)行在disk_tp。
6. ScrubWQ: scrub,運(yùn)行在disk_tp。
7. ScrubFinalizeWQ: scrub,運(yùn)行在disk_tp。
8. RepScrubWQ: scrub,運(yùn)行在disk_tp。
9. RemoveWQ: 刪除舊的pg目錄。運(yùn)行在disk_tp。
線程池
有4種 OSD線程池:
1. op_tp: 處理ops和sub ops
2. recovery_tp:處理修復(fù)任務(wù)
3. disk_tp: 處理磁盤(pán)密集型任務(wù)
4. command_tp: 處理命令
注:索引的格式,查找更新索引、如何持久化的,還沒(méi)搞清楚。
沒(méi)有所謂索引,一切皆規(guī)則:
每個(gè)object的文件名格式為:
objectname_key_head(snap_num)_hash_namespace_poolid
? objectname:對(duì)象名
? key、namespace:都是客戶端指定,做名稱空間細(xì)分用。當(dāng)塊兒設(shè)備使用時(shí),一般都置為空
? head(snap_num):snapshot版本
? hash:由objectname計(jì)算得到,u_int32_t類型,這里轉(zhuǎn)換為16進(jìn)制字符打印,如3AF0B980
? poolid:pool的id
目錄結(jié)構(gòu):
數(shù)據(jù)目錄/PG名稱/子目錄/object文件名
舉例說(shuō)明:
/data09/ceph/osd2/current/0.0_head/DIR_0/DIR_8/DIR_9/10000007af4.00000000__head_3AF0B980__0
其中,子目錄是根據(jù)object文件名中hash字段的字符反向排列生成。當(dāng)一個(gè)目錄中的文件個(gè)數(shù)大于配置值(merge_threshold * 16 * split_multiplier)時(shí),會(huì)建子目錄,對(duì)文件進(jìn)行歸檔。
ReplicatedPG.h
ReplicatedPG.cc
int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)函數(shù)中的
Case CEPH_OSD_OP_READ分支
r = osd->store->fiemap(coll, soid, op.extent.offset, op.extent.length, bl);
r = pgbackend->objects_read_sync(
soid, miter->first, miter->second, &tmpbl);
pgbackend->objects_read_sync轉(zhuǎn)int ReplicatedBackend::objects_read_sync調(diào)用 store->read(coll, hoid, off, len, *bl) ,來(lái)自O(shè)bjectStore::read
階段1:主節(jié)點(diǎn)發(fā)請(qǐng)求
階段2:從節(jié)點(diǎn)處理請(qǐng)求
osd->store->queue_transactions(&osr, rm->tls, onapply, oncommit);
這里注冊(cè)的兩個(gè)回調(diào):
Context *oncommit = new C_OSD_RepModifyCommit(rm); 當(dāng)日志寫(xiě)入磁盤(pán)后被調(diào)用
Context *onapply = new C_OSD_RepModifyApply(rm); 當(dāng)該操作被處理后被調(diào)用
分別向主節(jié)點(diǎn)做ACK和ON_DISK兩種回應(yīng)。
注:transaction封裝,journal log寫(xiě)入細(xì)節(jié),對(duì)象寫(xiě)入細(xì)節(jié)還沒(méi)來(lái)得及看。
階段3:主節(jié)點(diǎn)接收從節(jié)點(diǎn)回應(yīng),并回應(yīng)客戶端
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Ceph實(shí)現(xiàn)讀寫(xiě)流程的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。