1. 簡介
在傳統(tǒng)分布式存儲架構(gòu)中芬膝,存儲節(jié)點往往僅作為被動查詢對象來使用述呐,隨著存儲規(guī)模的增加,數(shù)據(jù)一致性的管理會出現(xiàn)很多問題祈远。
而新型的存儲架構(gòu)傾向于將基本的塊分配決策和安全保證等操作交給存儲節(jié)點來做胯舷,然后通過提倡客戶端和存儲節(jié)點直接交互來簡化數(shù)據(jù)布局并減小io瓶頸。
RADOS就是這樣一個可用于PB級規(guī)模數(shù)據(jù)存儲集群的可伸縮的绊含、可靠的對象存儲服務桑嘶。它包含兩類節(jié)點:存儲節(jié)點、管理節(jié)點躬充。它通過利用存儲設(shè)備的智能性逃顶,將諸如一致性數(shù)據(jù)訪問、冗余存儲充甚、錯誤檢測以政、錯誤恢復分布到包含了上千存儲節(jié)點的集群中,而不是僅僅依靠少數(shù)管理節(jié)點來處理伴找。
RADOS中的存儲節(jié)點被稱為OSD(object storage device)盈蛮,它可以僅由很普通的組件來構(gòu)成,只需要包含CPU技矮、網(wǎng)卡抖誉、本地緩存和一個磁盤或者RAID,并將傳統(tǒng)的塊存儲方式替換成面向?qū)ο蟮拇鎯Α?/p>
在PB級的存儲規(guī)模下衰倦,存儲系統(tǒng)一定是動態(tài)的:系統(tǒng)會隨著新設(shè)備的部署和舊設(shè)備的淘汰而增長或收縮袒炉,系統(tǒng)內(nèi)的設(shè)備會持續(xù)地崩潰和恢復,大量的數(shù)據(jù)被創(chuàng)建或者刪除樊零。RADOS通過 cluster map來實現(xiàn)這些我磁,cluster map會被復制到集群中的所有部分(存儲節(jié)點、控制節(jié)點驻襟,甚至是客戶端)夺艰,并且通過怠惰地傳播小增量更新而更新。cluster map中存儲了整個集群的數(shù)據(jù)的分布以及成員沉衣。
通過在每個存儲節(jié)點存儲完整的cluster map郁副,存儲設(shè)備可以表現(xiàn)的半自動化,通過peer-to-peer的方式(比如定義協(xié)議)來進行數(shù)據(jù)備份厢蒜、更新霞势,錯誤檢測、數(shù)據(jù)遷移等等操作斑鸦。這無疑減輕了占少數(shù)的monitor cluster(管理節(jié)點組成的集群)的負擔愕贡。
2. 設(shè)計
一個RADOS系統(tǒng)包含大量的OSDs 和 很少的用于管理OSD集群成員的monitors。OSD的組成如簡介所說巷屿。而monitor是一些獨立的進程固以,以及少量的本地存儲,monitor之間通過一致性算法保證數(shù)據(jù)的一致性。
2.1 Cluster Map
存儲節(jié)點集群通過monitor集群操作cluster map來實現(xiàn)成員的管理憨琳。cluster map 描述了哪些OSD被包含進存儲集群以及所有數(shù)據(jù)在存儲集群中的分布诫钓。
cluster map不僅存儲在monitor節(jié)點,它被復制到集群中的每一個存儲節(jié)點篙螟,以及和集群交互的client菌湃。
當因為一些原因,比如設(shè)備崩潰遍略、數(shù)據(jù)遷移等惧所,cluster map的內(nèi)容需要改變時,cluster map的版本號被增加绪杏,map的版本號可以使通信的雙方確認自己的map是否是最新的下愈,版本舊的一方會先將map更新成對方的map,然后才會進行后續(xù)操作蕾久。
2.2 Data Placement
首先势似,如下圖,總體說下RADOS的存儲層次僧著,RADOS中基本的存儲單位是對象履因,一般為2MB或4MB,當一個文件要存入RADOS時霹抛,首先會被切分成大小固定的對象(最后一個對象大小可能不同)搓逾,然后將對象分配到一個PG(Placement Group)中卷谈,然后PG會復制幾份杯拐,偽隨機地派給不同的存儲節(jié)點。當新的存儲節(jié)點被加入集群世蔗,會在已有數(shù)據(jù)中隨機抽取一部分數(shù)據(jù)遷移到新節(jié)點端逼。這種概率平衡的分布方式可以保證設(shè)備在潛在的高負載下正常工作。更重要的是污淋,數(shù)據(jù)的分布過程僅需要做幾次隨機映射顶滩,不需要大型的集中式分配表。
對于每個層次的詳細說明:
- File—— 用戶需要存儲或者訪問的文件寸爆。
2.Object—— RADOS的基本存儲單元礁鲁。Object與上面提到的file的區(qū)別是,object的最大size由RADOS限定(通常為2MB或4MB)赁豆,以便實現(xiàn)底層存儲的組織管理仅醇。因此,當上層應用向RADOS存入size很大的file時魔种,需要將file切分成統(tǒng)一大小的一系列object(最后一個的大小可以不同)進行存儲析二。
PG(Placement Group)—— 對object的存儲進行組織和位置映射。具體而言,一個PG負責組織若干個object(可以為數(shù)千個甚至更多)叶摄,但一個object只能被映射到一個PG中属韧,即,PG和object之間是“一對多”映射關(guān)系蛤吓。同時宵喂,一個PG會被映射到n個OSD上,而每個OSD上都會承載大量的PG会傲,即樊破,PG和OSD之間是“多對多”映射關(guān)系。在實踐當中唆铐,n至少為2(n代表冗余的份數(shù))哲戚,如果用于生產(chǎn)環(huán)境,則至少為3艾岂。一個OSD上的PG則可達到數(shù)百個顺少。事實上,PG數(shù)量的設(shè)置牽扯到數(shù)據(jù)分布的均勻性問題王浴。
OSD—— 即object storage device脆炎,前文已經(jīng)詳細介紹,此處不再展開氓辣。唯一需要說明的是秒裕,OSD的數(shù)量事實上也關(guān)系到系統(tǒng)的數(shù)據(jù)分布均勻性,因此其數(shù)量不應太少钞啸。在實踐當中几蜻,至少也應該是數(shù)十上百個的量級才有助于Ceph系統(tǒng)的設(shè)計發(fā)揮其應有的優(yōu)勢。
各層次之間的映射關(guān)系:
file -> object
object的最大size是由RADOS配置的体斩,當用戶要存儲一個file梭稚,需要將file切分成幾個object。object -> PG
每個object都會被映射到一個PG中絮吵,然后以PG為單位進行備份以及進一步映射到具體的OSD上弧烤。
至于具體的映射方式,直接引用論文吧蹬敲,以防歧義(才不是我懶)暇昂。
Each object’s PG is determined by a hash of the object name o, the desired level of replication r, and a bit mask m that controls the total number of placement groups in the system. That is, pgid = (r, hash(o)&m), where & is a bit-wise AND and the mask m = 2k ?1, constraining the number of PGs by a power of two. As the cluster scales, it is periodically necessary to adjust the total number of placement groups by changing m; this is done gradually to throttle the resulting migration of PGs between devices.
- PG -> OSD
根據(jù)用戶設(shè)置的冗余存儲的個數(shù)r,PG會最終存儲到r個OSD上伴嗡,這個映射是通過一種偽隨機的映射算法 CRUSH 來實現(xiàn)的急波,這個算法的特點是可以進行配置。具體請看Ceph的另一篇論文闹究。關(guān)于如何將數(shù)據(jù)拷貝到多個OSD上幔崖,RADOS有三種方式,具體查閱論文吧,一般的數(shù)據(jù)一致性思想赏寇。
集群維護
前面的介紹中已經(jīng)提到吉嫩,由若干個monitor共同負責整個RADOS集群中所有OSD狀態(tài)的發(fā)現(xiàn)與記錄,并且共同形成cluster map的master版本嗅定,然后擴散至全體OSD以及client自娩。OSD使用cluster map進行數(shù)據(jù)的維護,而client使用cluster map進行數(shù)據(jù)的尋址渠退。
monitor并不主動輪詢各個OSD的當前狀態(tài)忙迁。相反,OSD需要向monitor上報狀態(tài)信息碎乃。常見的上報有兩種情況:一是新的OSD被加入集群姊扔,二是某個OSD發(fā)現(xiàn)自身或者其他OSD發(fā)生異常。在收到這些上報信息后梅誓,monitor將更新cluster map信息并加以擴散恰梢。其細節(jié)將在下文中加以介紹。
Cluster map的實際內(nèi)容包括:
(1) Epoch梗掰,即版本號嵌言。cluster map的epoch是一個單調(diào)遞增序列。epoch越大及穗,則cluster map版本越新摧茴。因此,持有不同版本cluster map的OSD或client可以簡單地通過比較epoch決定應該遵從誰手中的版本埂陆。而monitor手中必定有epoch最大苛白、版本最新的cluster map。當任意兩方在通信時發(fā)現(xiàn)彼此epoch值不同時猜惋,將默認先將cluster map同步至高版本一方的狀態(tài)丸氛,再進行后續(xù)操作。
(2)各個OSD的網(wǎng)絡(luò)地址著摔。
(3)各個OSD的狀態(tài)。OSD狀態(tài)的描述分為兩個維度:up或者down(表明OSD是否正常工作)定续,in或者out(表明OSD是否在至少一個PG中)践险。因此痘拆,對于任意一個OSD,共有四種可能的狀態(tài):
up且in:說明該OSD正常運行,且已經(jīng)承載至少一個PG的數(shù)據(jù)慎王。這是一個OSD的標準工作狀態(tài);
up且out:說明該OSD正常運行特漩,但并未承載任何PG纤怒,其中也沒有數(shù)據(jù)。一個新的OSD剛剛被加入Ceph集群后,便會處于這一狀態(tài)克滴。而一個出現(xiàn)故障的OSD被修復后逼争,重新加入Ceph集群時,也是處于這一狀態(tài)劝赔;
down且in:說明該OSD發(fā)生異常誓焦,但仍然承載著至少一個PG,其中仍然存儲著數(shù)據(jù)着帽。這種狀態(tài)下的OSD剛剛被發(fā)現(xiàn)存在異常杂伟,可能仍能恢復正常,也可能會徹底無法工作仍翰;
down且out:說明該OSD已經(jīng)徹底發(fā)生故障赫粥,且已經(jīng)不再承載任何PG。
(4)CRUSH算法配置參數(shù)予借。表明了Ceph集群的物理層級關(guān)系(cluster hierarchy)傅是,位置映射規(guī)則(placement rules)。
根據(jù)cluster map的定義可以看出蕾羊,其版本變化通常只會由(3)和(4)兩項信息的變化觸發(fā)喧笔。而這兩者相比,(3)發(fā)生變化的概率更高一些龟再。這可以通過下面對OSD工作狀態(tài)變化過程的介紹加以反映书闸。
一個新的OSD上線后,首先根據(jù)配置信息與monitor通信利凑。Monitor將其加入cluster map浆劲,并設(shè)置為up且out狀態(tài),再將最新版本的cluster map發(fā)給這個新OSD哀澈。
收到monitor發(fā)來的cluster map之后牌借,這個新OSD計算出自己所承載的PG(為簡化討論,此處我們假定這個新的OSD開始只承載一個PG)割按,以及和自己承載同一個PG的其他OSD膨报。然后,新OSD將與這些OSD取得聯(lián)系适荣。如果這個PG目前處于降級狀態(tài)(即承載該PG的OSD個數(shù)少于正常值现柠,如正常應該是3個,此時只有2個或1個弛矛。這種情況通常是OSD故障所致)够吩,則其他OSD將把這個PG內(nèi)的所有對象和元數(shù)據(jù)復制給新OSD。數(shù)據(jù)復制完成后丈氓,新OSD被置為up且in狀態(tài)周循。而cluster map內(nèi)容也將據(jù)此更新强法。這事實上是一個自動化的failure recovery過程。當然湾笛,即便沒有新的OSD加入饮怯,降級的PG也將計算出其他OSD實現(xiàn)failure recovery。
如果該PG目前一切正常迄本,則這個新OSD將替換掉現(xiàn)有OSD中的一個(PG內(nèi)將重新選出Primary OSD)硕淑,并承擔其數(shù)據(jù)。在數(shù)據(jù)復制完成后嘉赎,新OSD被置為up且in狀態(tài)置媳,而被替換的OSD將退出該PG(但狀態(tài)通常仍然為up且in,因為還要承載其他PG)公条。而cluster map內(nèi)容也將據(jù)此更新拇囊。這事實上是一個自動化的數(shù)據(jù)re-balancing過程。
如果一個OSD發(fā)現(xiàn)和自己共同承載一個PG的另一個OSD無法聯(lián)通靶橱,則會將這一情況上報monitor寥袭。此外,如果一個OSD deamon發(fā)現(xiàn)自身工作狀態(tài)異常关霸,也將把異常情況主動上報給monitor传黄。在上述情況下,monitor將把出現(xiàn)問題的OSD的狀態(tài)設(shè)為down且in队寇。如果超過某一預訂時間期限膘掰,該OSD仍然無法恢復正常,則其狀態(tài)將被設(shè)置為down且out佳遣。反之识埋,如果該OSD能夠恢復正常,則其狀態(tài)會恢復為up且in零渐。在上述這些狀態(tài)變化發(fā)生之后窒舟,monitor都將更新cluster map并進行擴散。這事實上是自動化的failure detection過程诵盼。
對于一個RADOS集群而言惠豺,即便由數(shù)千個甚至更多OSD組成,cluster map的數(shù)據(jù)結(jié)構(gòu)大小也并不驚人拦耐。同時耕腾,cluster map的狀態(tài)更新并不會頻繁發(fā)生。即便如此杀糯,Ceph依然對cluster map信息的擴散機制進行了優(yōu)化,以便減輕相關(guān)計算和通信壓力:
首先苍苞,cluster map信息是以增量形式擴散的固翰。如果任意一次通信的雙方發(fā)現(xiàn)其epoch不一致狼纬,則版本更新的一方將把二者所擁有的cluster map的差異發(fā)送給另外一方。
其次骂际,cluster map信息是以異步且lazy的形式擴散的疗琉。也即,monitor并不會在每一次cluster map版本更新后都將新版本廣播至全體OSD歉铝,而是在有OSD向自己上報信息時盈简,將更新回復給對方。類似的太示,各個OSD也是在和其他OSD通信時柠贤,將更新發(fā)送給版本低于自己的對方。
基于上述機制类缤,Ceph避免了由于cluster map版本更新而引起的廣播風暴臼勉。這雖然是一種異步且lazy的機制,但根據(jù)論文中的結(jié)論餐弱,對于一個由n個OSD組成的Ceph集群宴霸,任何一次版本更新能夠在O(log(n))時間復雜度內(nèi)擴散到集群中的任何一個OSD上。
一個可能被問到的問題是:既然這是一種異步和lazy的擴散機制膏蚓,則在版本擴散過程中瓢谢,系統(tǒng)必定出現(xiàn)各個OSD看到的cluster map不一致的情況,這是否會導致問題驮瞧?答案是:不會氓扛。事實上,如果一個client和它要訪問的PG內(nèi)部的各個OSD看到的cluster map狀態(tài)一致剧董,則訪問操作就可以正確進行幢尚。而如果這個client或者PG中的某個OSD和其他幾方的cluster map不一致,則根據(jù)Ceph的機制設(shè)計翅楼,這幾方將首先同步cluster map至最新狀態(tài)尉剩,并進行必要的數(shù)據(jù)re-balancing操作,然后即可繼續(xù)正常訪問毅臊。