作者:Summer_ZJU
來源:CSDN
原文:https://blog.csdn.net/xiaqunfeng123/article/details/78574348
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接棱诱!
一康嘉、rbd到OSD映射關(guān)系
?客戶端使用RBD設(shè)備劳景,使用librbd镀钓、librados庫進(jìn)行訪問管理塊設(shè)備进栽。
?1雷滋、創(chuàng)建一個pool类缤,為這個pool指定pg的數(shù)量臼勉,同時在這個pool中指明保存數(shù)據(jù)的副本數(shù)(通常為3個副本)。
?2餐弱、在這個pool中創(chuàng)建一個rbd設(shè)備rbd0宴霸,那么這個rbd0都會保存三份囱晴,在創(chuàng)建rbd0時必須指定rbd的size,對于這個rbd0的任何操作不能超過這個size瓢谢。
?3畸写、將這個塊設(shè)備進(jìn)行切塊,每個塊的大小默認(rèn)為4M恩闻,并且每個塊都有一個名字艺糜,名字就是object+序號。
?4幢尚、將每個object通過pg進(jìn)行副本位置的分配破停,pg會尋找3個osd,把這個object分別保存在這三個osd上尉剩。最后對于object的存儲就變成了存儲一個文件rbd0.object1.file真慢。數(shù)據(jù)層次映射圖如下:?
?經(jīng)過pool,rbd理茎,object黑界、pg的層層映射關(guān)系,在PG這一層中皂林,已經(jīng)知道存儲數(shù)據(jù)的3個OSD所在位置及主從關(guān)系朗鸠。
?客戶端與primay OSD建立SOCKET通信,將要寫入的數(shù)據(jù)傳給primary OSD础倍,由primary OSD再將數(shù)據(jù)發(fā)送給其他replica OSD數(shù)據(jù)節(jié)點烛占。
?讀寫框架圖:
二、寫請求流程
1沟启、rbd上的處理
?在rbd中一個操作對象為一個image忆家,這個請求經(jīng)過處理拆分成object對象的請求,拆分后交給Objector進(jìn)行處理德迹,找到目標(biāo)osd的集合及主osd芽卿。
?將請求封裝成MOSDOp消息,交由SimpleMessenger處理胳搞,SimpleMessager會嘗試查找/創(chuàng)建一個OSDSession卸例,并且為這個OSDSession創(chuàng)建一個數(shù)據(jù)通道pipe。消息從SimpleMessager收到后會保存到pipe的outq隊列中肌毅。
?pipe與目標(biāo)osd建立Socket通信通道币厕,并有專門的寫線程writer來負(fù)責(zé)socket通信。writer線程同時監(jiān)視這個outq隊列芽腾,當(dāng)隊列中存在消息等待發(fā)送時,會就將消息寫入socket页衙,發(fā)送給目標(biāo)OSD摊滔。
? OSD將數(shù)據(jù)消息處理完成之后阴绢,進(jìn)行回調(diào),反饋執(zhí)行結(jié)果艰躺。
?關(guān)鍵代碼序列圖如下:
2呻袭、osd上的處理
?OSD接收到message信息以后,解析并將消息轉(zhuǎn)換成OpRequest腺兴,加入dispatch隊列左电。同時從message中得到pool及PG的信息,將message交由PG進(jìn)行相關(guān)處理页响。此時從OSD處理的message轉(zhuǎn)化為了PG處理的op篓足,添加到osd->op_wq隊列中。PG中創(chuàng)建一個OpContext結(jié)構(gòu)闰蚕,接管message中的所有ops的操作栈拖。
?解析出OpRequest中的所有op與data,用Transaction結(jié)構(gòu)進(jìn)行管理没陡,即將ops與Transaction綁定涩哟,將操作和數(shù)據(jù)打包成事務(wù),并發(fā)送給其他副本盼玄,同時管理自己和其他副本的數(shù)據(jù)處理統(tǒng)計贴彼,創(chuàng)建repop所有的applied與commit的管理。
?提交事務(wù)后埃儿,交由filestore進(jìn)行處理器仗。
?如果數(shù)據(jù)處理完成了,使用eval_repop()進(jìn)行收尾的工作蝌箍,將結(jié)果回調(diào)給客戶端青灼。
?關(guān)鍵代碼序列圖如下:
3、filestore上的處理
?當(dāng)數(shù)據(jù)進(jìn)行寫入的時候需要寫到j(luò)ournal中一份妓盲,當(dāng)data數(shù)據(jù)失敗的時候可以從journal中進(jìn)行恢復(fù)杂拨。從_op_journal_transactions()開始激發(fā)寫入日志的操作,回調(diào)函數(shù)C_JournaledAhead的會在日志完成之后進(jìn)行回調(diào)處理悯衬,將data寫入磁盤弹沽。
?將日志保存完成的回調(diào)ondisk交給ondisk_finisher,ondisk注冊回調(diào)為C_OSD_OnOpApplied筋粗,在后續(xù)finisher線程中處理策橘。在該函數(shù)中,循環(huán)處理需要回調(diào)的請求娜亿,回復(fù)剛開始接收到請求的MOSDOp的操作丽已,將請求發(fā)還給客戶端。
?寫完data的回調(diào)函數(shù)注冊的為C_OSD_OnOpCommit买决,該函數(shù)處理并回復(fù)OSD一些狀態(tài)的邏輯沛婴。
?關(guān)鍵代碼序列圖如下: