Ceph
Ceph是一個(gè)可靠恼五、自動(dòng)重均衡空执、自動(dòng)恢復(fù)的分布式存儲(chǔ)系統(tǒng),根據(jù)場(chǎng)景劃分可以將Ceph分為三大塊叹侄,分別是對(duì)象存儲(chǔ)吁恍、塊設(shè)備和文件系統(tǒng)服務(wù)。塊設(shè)備存儲(chǔ)是Ceph的強(qiáng)項(xiàng)播演。
Ceph的主要優(yōu)點(diǎn)是分布式存儲(chǔ)冀瓦,在存儲(chǔ)每一個(gè)數(shù)據(jù)時(shí),都會(huì)通過(guò)計(jì)算得出該數(shù)據(jù)存儲(chǔ)的位置写烤,盡量將數(shù)據(jù)分布均衡翼闽,不存在傳統(tǒng)的單點(diǎn)故障的問(wèn)題,可以水平擴(kuò)展洲炊。
Ceph架構(gòu)
RADOS自身是一個(gè)完整的分布式對(duì)象存儲(chǔ)系統(tǒng)感局,它具有可靠、智能暂衡、分布式等特性询微,Ceph的高可靠、高可拓展狂巢、高性能撑毛、高自動(dòng)化都是由這一層來(lái)提供的,用戶數(shù)據(jù)的存儲(chǔ)最終也都是通過(guò)這一層來(lái)進(jìn)行存儲(chǔ)的唧领,RADOS可以說(shuō)就是Ceph的核心組件藻雌。
RADOS系統(tǒng)主要由兩部分組成雌续,分別是OSD和Monitor。
基于RADOS層的上一層是LIBRADOS胯杭,LIBRADOS是一個(gè)庫(kù)驯杜,它允許應(yīng)用程序通過(guò)訪問(wèn)該庫(kù)來(lái)與RADOS系統(tǒng)進(jìn)行交互,支持多種編程語(yǔ)言做个,比如C鸽心、C++、Python等叁温。
基于LIBRADOS層開發(fā)的又可以看到有三層再悼,分別是RADOSGW、RBD和CEPH FS膝但。
RADOSGW:RADOSGW是一套基于當(dāng)前流行的RESTFUL協(xié)議的網(wǎng)關(guān)冲九,并且兼容S3和Swift。
RBD:RBD通過(guò)Linux內(nèi)核客戶端和QEMU/KVM驅(qū)動(dòng)來(lái)提供一個(gè)分布式的塊設(shè)備跟束。
CEPH FS:CEPH FS通過(guò)Linux內(nèi)核客戶端和FUSE來(lái)提供一個(gè)兼容POSIX的文件系統(tǒng)莺奸。
Ceph核心組件RADOS
RADOS系統(tǒng)主要由兩部分組成,分別是OSD和Monitor冀宴。
Ceph OSD:OSD的英文全稱是Object Storage Device灭贷,它的主要功能是存儲(chǔ)數(shù)據(jù)、復(fù)制數(shù)據(jù)略贮、平衡數(shù)據(jù)甚疟、恢復(fù)數(shù)據(jù)等,與其它OSD間進(jìn)行心跳檢查等逃延,并將一些變化情況上報(bào)給Ceph Monitor览妖。一般情況下一塊硬盤對(duì)應(yīng)一個(gè)OSD,由OSD來(lái)對(duì)硬盤存儲(chǔ)進(jìn)行管理揽祥,當(dāng)然一個(gè)分區(qū)也可以成為一個(gè)OSD讽膏。
Ceph Monitor:由該英文名字我們可以知道它是一個(gè)監(jiān)視器,負(fù)責(zé)監(jiān)視Ceph集群拄丰,維護(hù)Ceph集群的健康狀態(tài)府树,同時(shí)維護(hù)著Ceph集群中的各種Map圖,比如OSD Map料按、Monitor Map奄侠、PG Map和CRUSH Map,這些Map統(tǒng)稱為Cluster Map站绪,Cluster Map是RADOS的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)遭铺,管理集群中的所有成員、關(guān)系、屬性等信息以及數(shù)據(jù)的分發(fā)魂挂,比如當(dāng)用戶需要存儲(chǔ)數(shù)據(jù)到Ceph集群時(shí)甫题,OSD需要先通過(guò)Monitor獲取最新的Map圖,然后根據(jù)Map圖和object id等計(jì)算出數(shù)據(jù)最終存儲(chǔ)的位置涂召。
為保證高可用性坠非, Ceph 存儲(chǔ)集群應(yīng)該保存兩份以上的對(duì)象副本。Ceph OSD 守護(hù)進(jìn)程自動(dòng)在其它 Ceph 節(jié)點(diǎn)上創(chuàng)建對(duì)象副本來(lái)確保數(shù)據(jù)安全和高可用性果正。
Ceph 監(jiān)視器維護(hù)著集群運(yùn)行圖的主副本炎码。為保證高可用性,監(jiān)視器也實(shí)現(xiàn)了集群化秋泳。一個(gè)監(jiān)視器集群確保了當(dāng)某個(gè)監(jiān)視器失效時(shí)的高可用性潦闲。
Ceph數(shù)據(jù)分布算法
Ceph是為大規(guī)模分布式存儲(chǔ)而設(shè)計(jì)的,數(shù)據(jù)分布算法必須能夠滿足在大規(guī)模的集群下數(shù)據(jù)依然能夠快速的準(zhǔn)確的計(jì)算存放位置迫皱,同時(shí)能夠在硬件故障或擴(kuò)展硬件設(shè)備時(shí)做到盡可能小的數(shù)據(jù)遷移歉闰,Ceph的CRUSH算法就是精心為這些特性設(shè)計(jì)的。
在說(shuō)明CRUSH算法的基本原理之前卓起,先介紹幾個(gè)概念和它們之間的關(guān)系和敬。
Object: 當(dāng)用戶要將數(shù)據(jù)存儲(chǔ)到Ceph集群時(shí),存儲(chǔ)數(shù)據(jù)都會(huì)被分割成多個(gè)Object戏阅,每個(gè)Object都有一個(gè)object id昼弟,每個(gè)Object的大小是可以設(shè)置的,默認(rèn)是4MB奕筐,Object可以看成是Ceph存儲(chǔ)的最小存儲(chǔ)單元舱痘。
PG:由于Object的數(shù)量很多,所以Ceph引入了PG的概念用于管理Object离赫,每個(gè)Object最后都會(huì)通過(guò)CRUSH計(jì)算映射到某個(gè)PG中衰粹,一個(gè)PG可以包含多個(gè)Object。
PG與OSD的關(guān)系:PG也需要通過(guò)CRUSH計(jì)算映射到OSD中去存儲(chǔ)笆怠,如果是二副本的,則每個(gè)PG都會(huì)映射到二個(gè)OSD誊爹,比如[OSD#1,OSD#2]蹬刷,那么OSD#1是存放該P(yáng)G的主副本,OSD#2是存放該P(yáng)G的從副本频丘,保證了數(shù)據(jù)的冗余办成。
把對(duì)象映射到歸置組在 OSD 和客戶端間創(chuàng)建了一個(gè)間接層。由于 Ceph 集群必須能增大或縮小搂漠、并動(dòng)態(tài)地重均衡迂卢。如果讓客戶端“知道”哪個(gè) OSD 有哪個(gè)對(duì)象,就會(huì)導(dǎo)致客戶端和 OSD 緊耦合;相反而克, CRUSH 算法把對(duì)象映射到歸置組靶壮、然后再把各歸置組映射到一或多個(gè) OSD ,這一間接層可以讓 Ceph 在 OSD 守護(hù)進(jìn)程和底層設(shè)備上線時(shí)動(dòng)態(tài)地重均衡员萍。下列圖表描述了 CRUSH 如何將對(duì)象映射到歸置組腾降、再把歸置組映射到 OSD 。
PG和PGP的關(guān)系:pg是用來(lái)存放object的碎绎,pgp相當(dāng)于是pg存放osd的一種排列組合螃壤,我舉個(gè)例子,比如有3個(gè)osd筋帖,osd.1奸晴、osd.2和osd.3,副本數(shù)是2日麸,如果pgp的數(shù)目為1寄啼,那么pg存放的osd組合就只有一種,可能是[osd.1,osd.2]赘淮,那么所有的pg主從副本分別存放到osd.1和osd.2辕录,如果pgp設(shè)為2,那么其osd組合可以兩種梢卸,可能是[osd.1,osd.2]和[osd.1,osd.3]走诞,是不是很像我們高中數(shù)學(xué)學(xué)過(guò)的排列組合,pgp就是代表這個(gè)意思蛤高。一般來(lái)說(shuō)應(yīng)該將pg和pgp的數(shù)量設(shè)置為相等蚣旱。
本質(zhì)上CRUSH算法是根據(jù)存儲(chǔ)設(shè)備的權(quán)重來(lái)計(jì)算數(shù)據(jù)對(duì)象的分布的恤批,權(quán)重的設(shè)計(jì)可以根據(jù)該磁盤的容量和讀寫速度來(lái)設(shè)置异吻,比如根據(jù)容量大小可以將1T的硬盤設(shè)備權(quán)重設(shè)為1,2T的就設(shè)為2喜庞,在計(jì)算過(guò)程中诀浪,CRUSH是根據(jù)Cluster Map、數(shù)據(jù)分布策略和一個(gè)隨機(jī)數(shù)共同決定數(shù)組最終的存儲(chǔ)位置的延都。
Cluster Map里的內(nèi)容信息包括存儲(chǔ)集群中可用的存儲(chǔ)資源及其相互之間的空間層次關(guān)系雷猪,比如集群中有多少個(gè)支架,每個(gè)支架中有多少個(gè)服務(wù)器晰房,每個(gè)服務(wù)器有多少塊磁盤用以O(shè)SD等求摇。
數(shù)據(jù)分布策略是指可以通過(guò)Ceph管理者通過(guò)配置信息指定數(shù)據(jù)分布的一些特點(diǎn)射沟,比如管理者配置的故障域是Host,也就意味著當(dāng)有一臺(tái)Host起不來(lái)時(shí)与境,數(shù)據(jù)能夠不丟失验夯,CRUSH可以通過(guò)將每個(gè)pg的主從副本分別存放在不同Host的OSD上即可達(dá)到,不單單可以指定Host嚷辅,還可以指定機(jī)架等故障域簿姨,除了故障域,還有選擇數(shù)據(jù)冗余的方式簸搞,比如副本數(shù)或糾刪碼扁位。
下面這個(gè)式子簡(jiǎn)單的表明CRUSH的計(jì)算表達(dá)式:
CRUSH(X) -> (osd.1,osd.2.....osd.n)
式子中的X就是一個(gè)隨機(jī)數(shù)。
下面通過(guò)一個(gè)計(jì)算PG ID的示例來(lái)看CRUSH的一個(gè)計(jì)算過(guò)程:
(1)Client輸入Pool ID和對(duì)象ID趁俊;
(2)CRUSH獲得對(duì)象ID并對(duì)其進(jìn)行Hash運(yùn)算域仇;
(3)CRUSH計(jì)算OSD的個(gè)數(shù),Hash取模獲得PG的ID寺擂,比如0x48暇务;
(4)CRUSH取得該P(yáng)ool的ID,比如是1怔软;
(5)CRUSH預(yù)先考慮到Pool ID相同的PG ID垦细,比如1.48。
一個(gè)栗子
先創(chuàng)建一個(gè)名為testpool包含6個(gè)PG和6個(gè)PGP的存儲(chǔ)池挡逼。
ceph osd pool create testpool 6 6
通過(guò)寫數(shù)據(jù)后我們查看下pg的分布情況:
ceph pg dump pgs | grep ^1 | awk '{print $1,$2,$15}'
dumped pgs in format plain
1.1 75 [3,6,0]
1.0 83 [7,0,6]
1.3 144 [4,1,2]
1.2 146 [7,4,1]
1.5 86 [4,6,3]
1.4 80 [3,0,4]
第1列為pg的id括改,第2列為該pg所存儲(chǔ)的對(duì)象數(shù)目,第3列為該pg所在的osd
我們擴(kuò)大PG再看看:
ceph osd pool set testpool pg_num 12
再次用上面的命令查詢分布情況:
ceph pg dump pgs | grep ^1 | awk '{print $1,$2,$15}'
dumped pgs in format plain
1.1 37 [3,6,0]
1.9 38 [3,6,0]
1.0 41 [7,0,6]
1.8 42 [7,0,6]
1.3 48 [4,1,2]
1.b 48 [4,1,2]
1.7 48 [4,1,2]
1.2 48 [7,4,1]
1.6 49 [7,4,1]
1.a 49 [7,4,1]
1.5 86 [4,6,3]
1.4 80 [3,0,4]
我們可以看到pg的數(shù)量增加到12個(gè)了家坎,pg1.1的對(duì)象數(shù)量本來(lái)是75的嘱能,現(xiàn)在是37個(gè),可以看到它把對(duì)象數(shù)分給新增的pg1.9了虱疏,剛好是38惹骂,加起來(lái)是75,而且可以看到pg1.1和pg1.9的osd盤是一樣的做瞪。而且可以看到osd盤的組合還是那6種对粪。
我們?cè)黾觩gp的數(shù)量來(lái)看下,使用命令:
ceph osd pool set testpool pgp_num 12
再看下:
ceph pg dump pgs | grep ^1 | awk '{print $1,$2,$15}'
dumped pgs in format plain
1.a 49 [1,2,6]
1.b 48 [1,6,2]
1.1 37 [3,6,0]
1.0 41 [7,0,6]
1.3 48 [4,1,2]
1.2 48 [7,4,1]
1.5 86 [4,6,3]
1.4 80 [3,0,4]
1.7 48 [1,6,0]
1.6 49 [3,6,7]
1.9 38 [1,4,2]
1.8 42 [1,2,3]
再看pg1.1和pg1.9装蓬,可以看到pg1.9不在[3,6,0]上衩侥,而在[1,4,2]上了,該組合是新加的矛物,可以知道增加pgp_num其實(shí)是增加了osd盤的組合。
通過(guò)實(shí)驗(yàn)總結(jié):
(1)PG是指定存儲(chǔ)池存儲(chǔ)對(duì)象的目錄有多少個(gè)跪但,PGP是存儲(chǔ)池PG的OSD分布組合個(gè)數(shù)
(2)PG的增加會(huì)引起PG內(nèi)的數(shù)據(jù)進(jìn)行分裂履羞,分裂相同的OSD上新生成的PG當(dāng)中
(3)PGP的增加會(huì)引起部分PG的分布進(jìn)行變化峦萎,但是不會(huì)引起PG內(nèi)對(duì)象的變動(dòng)
Reference
Ceph基礎(chǔ)知識(shí)和基礎(chǔ)架構(gòu)認(rèn)識(shí)
Ceph體系結(jié)構(gòu)
Ceph介紹及原理架構(gòu)分享