本書(shū)作者通過(guò)多年的開(kāi)發(fā)經(jīng)驗(yàn),總結(jié)了自己使用Ceph的實(shí)戰(zhàn)經(jīng)驗(yàn),并對(duì)Ceph的框架和主要源代碼進(jìn)行了分析,為開(kāi)發(fā)分布式系統(tǒng)提供了重要參考。主要內(nèi)容包括:Ceph整體架構(gòu)、Ceph通用模塊、Ceph網(wǎng)絡(luò)通信模塊、Ceph客戶(hù)端實(shí)現(xiàn)、CephCRUSH算法、Ceph底層對(duì)象存儲(chǔ)機(jī)制、CephOsd、Cephmon等。
前 言
隨著云計(jì)算技術(shù)的興起和普及,云計(jì)算基石:分布式共享存儲(chǔ)系統(tǒng)受到業(yè)界的重視。Ceph以其穩(wěn)定、高可用、可擴(kuò)展的特性,乘著開(kāi)源云計(jì)算管理系統(tǒng)OpenStack的東風(fēng),迅速成為最熱門(mén)的開(kāi)源分布式存儲(chǔ)系統(tǒng)。
Ceph作為一個(gè)開(kāi)源的分布式存儲(chǔ)系統(tǒng),人人都可以免費(fèi)獲得其源代碼,并能夠安裝部署,但是并不等于人人都能用起來(lái),人人都能用好。用好一個(gè)開(kāi)源分布式存儲(chǔ)系統(tǒng),首先要對(duì)其架構(gòu)、功能原理等方面有比較好的了解,其次要有修復(fù)漏洞的能力。這些都是在采用開(kāi)源分布式存儲(chǔ)系統(tǒng)時(shí)所面臨的挑戰(zhàn)。
要用好Ceph,就必須深入了解和掌握Ceph源代碼。Ceph源代碼的實(shí)現(xiàn)被公認(rèn)為比較復(fù)雜,閱讀難度較大。閱讀Ceph源代碼,不但需要對(duì)C++語(yǔ)言以及boost庫(kù)和STL庫(kù)非常熟悉,還需要有分布式存儲(chǔ)系統(tǒng)相關(guān)的基礎(chǔ)知識(shí)以及對(duì)實(shí)現(xiàn)原理的深刻理解,最后還需要對(duì)Ceph框架和設(shè)計(jì)原理以及具體的實(shí)現(xiàn)細(xì)節(jié)有很好的把握。所以Ceph源代碼的閱讀是相當(dāng)有挑戰(zhàn)性的。
本著對(duì)Ceph源代碼的濃厚興趣以及實(shí)踐工作的需要,需要對(duì)Ceph在源代碼層級(jí)有比較深入的了解。當(dāng)時(shí)筆者盡可能地搜索有關(guān)Ceph源代碼的介紹,發(fā)現(xiàn)這方面的資料比較少,筆者只能自己對(duì)著Ceph源代碼開(kāi)始了比較艱辛的閱讀之旅。在這個(gè)過(guò)程中,每一個(gè)小的進(jìn)步都來(lái)之不易,理解一些實(shí)現(xiàn)細(xì)節(jié),都需要對(duì)源代碼進(jìn)行反復(fù)地推敲和琢磨。自己在閱讀的過(guò)程中,特別希望有人能夠幫助理清整體代碼的思路,能夠解答一下關(guān)鍵的實(shí)現(xiàn)細(xì)節(jié)。本書(shū)就是秉承這樣一個(gè)簡(jiǎn)單的目標(biāo),希望指引和幫助廣大Ceph愛(ài)好者更好地理解和掌握Ceph源代碼。
本書(shū)面向熱愛(ài)Ceph的開(kāi)發(fā)者,想深入了解Ceph原理的高級(jí)運(yùn)維人員,想基于Ceph做優(yōu)化和定制的開(kāi)發(fā)人員,以及想對(duì)社區(qū)提交代碼的研究人員。官網(wǎng)上有比較詳細(xì)的介紹Ceph安裝部署以及操作相關(guān)的知識(shí),希望閱讀本書(shū)的人能夠自己動(dòng)手實(shí)踐,對(duì)Ceph進(jìn)一步了解。本書(shū)基于目前最新的Ceph 10.2.1版本進(jìn)行分析。
本書(shū)著重介紹Ceph的整體框架和各個(gè)實(shí)現(xiàn)模塊的實(shí)現(xiàn)原理,對(duì)核心源代碼進(jìn)行分析,包括一些關(guān)鍵的實(shí)現(xiàn)細(xì)節(jié)。存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)都是圍繞數(shù)據(jù)以及對(duì)數(shù)據(jù)的操作來(lái)展開(kāi),只要理解核心的數(shù)據(jù)結(jié)構(gòu),以及數(shù)據(jù)結(jié)構(gòu)的相關(guān)操作就可以大致了解核心的實(shí)現(xiàn)和功能。本書(shū)的寫(xiě)作思路是先介紹框架和原理,其次介紹相關(guān)的數(shù)據(jù)結(jié)構(gòu),最后基于數(shù)據(jù)結(jié)構(gòu),介紹相關(guān)的操作實(shí)現(xiàn)流程。
最后感謝一起工作過(guò)的同事們,同他們?cè)贑eph技術(shù)上進(jìn)行交流溝通并加以驗(yàn)證實(shí)踐,使我受益匪淺。感謝機(jī)械工業(yè)出版社的編輯吳怡對(duì)本書(shū)出版所做的努力,以及不斷提出的寶貴意見(jiàn)。感謝我的妻子孫盛南女士在我寫(xiě)作期間默默的付出,對(duì)本書(shū)的寫(xiě)作提供了堅(jiān)強(qiáng)的后盾。
由于Ceph源代碼比較多,也比較復(fù)雜,寫(xiě)作的時(shí)間比較緊,加上個(gè)人的水平有限,錯(cuò)誤和疏漏在所難免,懇請(qǐng)讀者批評(píng)指正。有任何的意見(jiàn)和建議都可發(fā)送到我的郵箱changtao381@163.com,歡迎讀者與我交流Ceph相關(guān)的任何問(wèn)題。
常濤2016年6月于北京
序 言自從2013年加入Ceph社區(qū)以來(lái),我一直想寫(xiě)一本分析Ceph源碼的書(shū),但是兩年多來(lái)提交了數(shù)萬(wàn)行的代碼后,我漸漸放下了這個(gè)事情。Ceph每個(gè)月、每周都會(huì)發(fā)生巨大變化,我總是想讓Ceph源碼愛(ài)好者看到最新最棒的設(shè)計(jì)和實(shí)現(xiàn),社區(qū)一線的模塊維護(hù)和每周數(shù)十個(gè)代碼提交集的閱讀,讓我很難有時(shí)間回顧和把握其他Ceph愛(ài)好者的疑問(wèn)和需求點(diǎn)。
今天看到這本書(shū)讓我非常意外,作者常濤把整個(gè)Ceph源碼樹(shù)肢解得恰到好處,如庖丁解牛般將Ceph的核心思想和實(shí)現(xiàn)展露出來(lái)。雖然目前Ceph分分鐘都有新的變化,但無(wú)論是新的模塊設(shè)計(jì),還是重構(gòu)已有邏輯,都是已有思想的翻新和延續(xù),這些才是眾多Ceph開(kāi)發(fā)者能十年如一日改進(jìn)的秘密!
我跟作者常濤雖然只有一面之緣,但是在開(kāi)源社區(qū)中的交流已經(jīng)足夠成為彼此的相知。他對(duì)于分布式存儲(chǔ)的設(shè)計(jì)和實(shí)現(xiàn)都有獨(dú)到見(jiàn)解,其代碼閱讀和理解靈感更是超群。我在年前看到他一些對(duì)Ceph核心模塊的創(chuàng)新性理解,相信這些都通過(guò)這本書(shū)展現(xiàn)出來(lái)了。
這本書(shū)是目前我所看到的從代碼角度解讀Ceph的最好作品,即使在全球范圍內(nèi),都沒(méi)有類(lèi)似的書(shū)籍能夠與之媲美。相信每個(gè)Ceph愛(ài)好者都能從這本書(shū)中找到自己心中某些疑問(wèn)的解答途徑。
作為Ceph社區(qū)的主要開(kāi)發(fā)者,我也想在這里強(qiáng)調(diào)Ceph的魅力,希望每個(gè)讀者都能充分感受到Ceph社區(qū)生機(jī)勃勃的態(tài)勢(shì)。Ceph是開(kāi)源世界中存儲(chǔ)領(lǐng)域的一個(gè)里程碑!在過(guò)去很難想像,從IT巨無(wú)霸們組成的巨大存儲(chǔ)壁壘中能夠誕生一個(gè)真正被大量用戶(hù)使用并投入生產(chǎn)環(huán)境的開(kāi)源存儲(chǔ)項(xiàng)目,而Ceph這個(gè)開(kāi)源存儲(chǔ)項(xiàng)目已經(jīng)成為全球眾多海量存儲(chǔ)項(xiàng)目的主要選擇。
眾所周知,在過(guò)去十年里,IT技術(shù)領(lǐng)域中巨大的創(chuàng)新項(xiàng)目很多來(lái)自于開(kāi)源世界,從壟斷大數(shù)據(jù)的Hadoop、Spark,到風(fēng)靡全球的Docker,都證明了開(kāi)源力量推動(dòng)了新技術(shù)的產(chǎn)生與發(fā)展。而再往以前看十年,從Unix到Linux,從Oracle到MySQL/PostgreSQL,從 VMWare到KVM,開(kāi)源世界從傳統(tǒng)商業(yè)技術(shù)繼承并給用戶(hù)帶來(lái)更多的選擇。處于開(kāi)源社區(qū)一線的我欣喜地看到,在IT基礎(chǔ)設(shè)施領(lǐng)域,越來(lái)越多的創(chuàng)業(yè)公司從創(chuàng)立之初就以開(kāi)源為基石,而越來(lái)越多的商業(yè)技術(shù)公司也受益于開(kāi)源,大量的復(fù)雜商業(yè)軟件基于開(kāi)源分布式數(shù)據(jù)庫(kù)、緩存存儲(chǔ)、中間件構(gòu)建。相信開(kāi)源的Ceph也將成為IT創(chuàng)新的驅(qū)動(dòng)力。正如Sage Weil在2016 Ceph Next會(huì)議上所說(shuō),Ceph將成為存儲(chǔ)里的Linux!
王豪邁,XSKY公司CTO2016年9月8日
查看全部↓
序言
前言
第1章 Ceph整體架構(gòu)1
1.1 Ceph的發(fā)展歷程1
1.2 Ceph的設(shè)計(jì)目標(biāo)2
1.3 Ceph基本架構(gòu)圖2
1.4 Ceph客戶(hù)端接口3
1.4.1 RBD4
1.4.2 CephFS4
1.4.3 RadosGW4
1.5 RADOS6
1.5.1 Monitor6
1.5.2 對(duì)象存儲(chǔ)7
1.5.3 pool和PG的概念7
1.5.4 對(duì)象尋址過(guò)程8
1.5.5 數(shù)據(jù)讀寫(xiě)過(guò)程9
1.5.6 數(shù)據(jù)均衡10
1.5.7 Peering11
1.5.8 Recovery和Backfill11
1.5.9 糾刪碼11
1.5.10 快照和克隆12
1.5.11 Cache Tier12
1.5.12 Scrub13
1.6 本章小結(jié)13
第2章 Ceph通用模塊14
2.1 Object14
2.2 Buffer16
2.2.1 buffer::raw16
2.2.2 buffer::ptr17
2.2.3 buffer::list17
2.3 線程池19
2.3.1 線程池的啟動(dòng)20
2.3.2 工作隊(duì)列20
2.3.3 線程池的執(zhí)行函數(shù)21
2.3.4 超時(shí)檢查22
2.3.5 ShardedThreadPool22
2.4 Finisher23
2.5 Throttle23
2.6 SafeTimer24
2.7 本章小結(jié)25
第3章 Ceph網(wǎng)絡(luò)通信26
3.1 Ceph網(wǎng)絡(luò)通信框架26
3.1.1 Message27
3.1.2 Connection29
3.1.3 Dispatcher 29
3.1.4 Messenger29
3.1.5 網(wǎng)絡(luò)連接的策略30
3.1.6 網(wǎng)絡(luò)模塊的使用30
3.2 Simple實(shí)現(xiàn)32
3.2.1 SimpleMessager33
3.2.2 Accepter33
3.2.3 DispatchQueue33
3.2.4 Pipe34
3.2.5 消息的發(fā)送35
3.2.6 消息的接收36
3.2.7 錯(cuò)誤處理37
3.3 本章小結(jié)38
第4章 CRUSH數(shù)據(jù)分布算法39
4.1 數(shù)據(jù)分布算法的挑戰(zhàn)39
4.2 CRUSH算法的原理40
4.2.1 層級(jí)化的Cluster Map40
4.2.2 Placement Rules42
4.2.3 Bucket隨機(jī)選擇算法46
4.3 代碼實(shí)現(xiàn)分析49
4.3.1 相關(guān)的數(shù)據(jù)結(jié)構(gòu)49
4.3.2 代碼實(shí)現(xiàn)50
4.4 對(duì)CRUSH算法的評(píng)價(jià)52
4.5 本章小結(jié)52
第5章 Ceph客戶(hù)端53
5.1 Librados53
5.1.1 RadosClient54
5.1.2 IoCtxImpl56
5.2 OSDC56
5.2.1 ObjectOperation56
5.2.2 op_target57
5.2.3 Op57
5.2.4 Striper58
5.2.5 ObjectCacher59
5.3 客戶(hù)寫(xiě)操作分析59
5.3.1 寫(xiě)操作消息封裝60
5.3.2 發(fā)送數(shù)據(jù)op_submit61
5.3.3 對(duì)象尋址_calc_target61
5.4 Cls62
5.4.1 模塊以及方法的注冊(cè)62
5.4.2 模塊的方法執(zhí)行63
5.4.3 舉例說(shuō)明64
5.5 Librbd65
5.5.1 RBD的相關(guān)的對(duì)象65
5.5.2 RBD元數(shù)據(jù)操作66
5.5.3 RBD數(shù)據(jù)操作67
5.5.4 RBD的快照和克隆69
5.6 本章小結(jié)71
第6章 Ceph的數(shù)據(jù)讀寫(xiě)72
6.1 OSD模塊靜態(tài)類(lèi)圖72
6.2 相關(guān)數(shù)據(jù)結(jié)構(gòu)73
6.2.1 Pool74
6.2.2 PG75
6.2.3 OSDMap75
6.2.4 OSDOp77
6.2.5 Object_info_t77
6.2.6 ObjectState78
6.2.7 SnapSetContext79
6.2.8 ObjectContext79
6.2.9 Session80
6.3 讀寫(xiě)操作的序列圖81
6.4 讀寫(xiě)流程代碼分析83
6.4.1 階段1:接收請(qǐng)求83
6.4.2 階段2:OSD的op_wq處理85
6.4.3 階段3:PGBackend的處理95
6.4.4 從副本的處理95
6.4.5 主副本接收到從副本的應(yīng)答95
6.5 本章小結(jié)96
第7章 本地對(duì)象存儲(chǔ)97
7.1 基本概念介紹98
7.1.1 對(duì)象的元數(shù)據(jù)98
7.1.2 事務(wù)和日志的基本概念98
7.1.3 事務(wù)的封裝99
7.2 ObjectStore對(duì)象存儲(chǔ)接口100
7.2.1 對(duì)外接口說(shuō)明101
7.2.2 ObjectStore代碼示例101
7.3 日志的實(shí)現(xiàn)102
7.3.1 Jouanal對(duì)外接口102
7.3.2 FileJournal103
7.4 FileStore的實(shí)現(xiàn)109
7.4.1 日志的三種類(lèi)型110
7.4.2 JournalingObjectStore111
7.4.3 Filestore的更新操作112
7.4.4 日志的應(yīng)用115
7.4.5 日志的同步115
7.5 omap的實(shí)現(xiàn)116
7.5.1 omap存儲(chǔ)117
7.5.2 omap的克隆118
7.5.3 部分代碼實(shí)現(xiàn)分析119
7.6 CollectionIndex120
7.6.1 CollectIndex接口122
7.6.2 HashIndex123
7.6.3 LFNIndex124
7.7 本章小結(jié)124
第8章 Ceph糾刪碼125
8.1 EC的基本原理125
8.2 EC的不同插件126
8.2.1 RS編碼126
8.2.2 LRC編碼126
8.2.3 SHEC編碼128
8.2.4 EC和副本的比較129
8.3 Ceph中EC的實(shí)現(xiàn)129
8.3.1 Ceph中EC的基本概念129
8.3.2 EC支持的寫(xiě)操作130
8.3.3 EC的回滾機(jī)制131
8.4 EC的源代碼分析132
8.4.1 EC的寫(xiě)操作132
8.4.2 EC的write_full133
8.4.3 ECBackend133
8.5 本章小結(jié)133
第9章 Ceph快照和克隆134
9.1 基本概念134
9.1.1 快照和克隆134
9.1.2 RDB的快照和克隆比較135
9.2 快照實(shí)現(xiàn)的核心數(shù)據(jù)結(jié)構(gòu)137
9.3 快照的工作原理139
9.3.1 快照的創(chuàng)建139
9.3.2 快照的寫(xiě)操作139
9.3.3 快照的讀操作140
9.3.4 快照的回滾141
9.3.5 快照的刪除141
9.4 快照讀寫(xiě)操作源代碼分析141
9.4.1 快照的寫(xiě)操作141
9.4.2 make_writeable函數(shù)142
9.4.3 快照的讀操作145
9.5 本章小結(jié)146
第10章 Ceph Peering機(jī)制147
10.1 statechart狀態(tài)機(jī)147
10.1.1 狀態(tài)147
10.1.2 事件 148
10.1.3 狀態(tài)響應(yīng)事件148
10.1.4 狀態(tài)機(jī)的定義149
10.1.5 context函數(shù)150
10.1.6 事件的特殊處理150
10.2 PG狀態(tài)機(jī)151
10.3 PG的創(chuàng)建過(guò)程151
10.3.1 PG在主OSD上的創(chuàng)建151
10.3.2 PG在從OSD上的創(chuàng)建153
10.3.3 PG的加載154
10
查看全部↓