對(duì)象存儲(chǔ)系統(tǒng)之二 ceph詳解

本文借鑒了ceph官方資料俭缓,以及網(wǎng)絡(luò)公開可查的技術(shù)文檔或者圖片克伊,非絕對(duì)原創(chuàng),向開源領(lǐng)域的貢獻(xiàn)者和傳播者致敬华坦。



架構(gòu)簡單介紹

Ceph介紹


Ceph是一個(gè)分布式存儲(chǔ)系統(tǒng)愿吹,提供對(duì)象,塊和文件存儲(chǔ)惜姐,是一個(gè)免費(fèi)開源軟件的存儲(chǔ)解決方案犁跪,可以部署于普通的x86兼容服務(wù)器上,可用于解決統(tǒng)一存儲(chǔ)的io問題歹袁。Ceph誕生于2004年耘拇,最早是SageWeil一項(xiàng)關(guān)于存儲(chǔ)系統(tǒng)的PhD研究項(xiàng)目,致力于開發(fā)下一代高性能分布式文件系統(tǒng)的項(xiàng)目宇攻。隨著云計(jì)算的發(fā)展惫叛,ceph乘上了OpenStack的春風(fēng),進(jìn)而成為了開源社區(qū)受關(guān)注較高的項(xiàng)目之一逞刷。

該系統(tǒng)被設(shè)計(jì)成自動(dòng)修復(fù)和智能管理嘉涌,希望減低管理員和預(yù)算開銷。

想達(dá)到的目標(biāo):沒有單點(diǎn)故障的完全分布式存儲(chǔ)系統(tǒng)夸浅,使數(shù)據(jù)能容錯(cuò)和無縫的復(fù)制仑最,可擴(kuò)展EB水平(EB,PB,TB,GB)。

Ceph同時(shí)支持塊帆喇、文件警医、對(duì)象接口,支持PB級(jí)別擴(kuò)展坯钦,規(guī)格上可部署到上千臺(tái)通用服務(wù)器预皇。對(duì)象S3和Swift寫入的數(shù)據(jù)是相互可讀取的。


Ceph邏輯架構(gòu)圖


Ceph特點(diǎn)和優(yōu)勢

1. ?CRUSH算法

Crush算法是ceph的兩大創(chuàng)新之一婉刀,簡單來說吟温,ceph摒棄了傳統(tǒng)的集中式存儲(chǔ)元數(shù)據(jù)尋址的方案,轉(zhuǎn)而使用CRUSH算法完成數(shù)據(jù)的尋址操作突颊。CRUSH在一致性哈下澈溃基礎(chǔ)上很好的考慮了容災(zāi)域的隔離,能夠?qū)崿F(xiàn)各類負(fù)載的副本放置規(guī)則律秃,例如跨機(jī)房爬橡、機(jī)架感知等。Crush算法有相當(dāng)強(qiáng)大的擴(kuò)展性棒动,理論上支持?jǐn)?shù)千個(gè)存儲(chǔ)節(jié)點(diǎn)糙申。

2. 高可用

Ceph中的數(shù)據(jù)副本數(shù)量可以由管理員自行定義,并可以通過CRUSH算法指定副本的物理存儲(chǔ)位置以分隔故障域迁客,支持?jǐn)?shù)據(jù)強(qiáng)一致性郭宝; ceph可以忍受多種故障場景并自動(dòng)嘗試并行修復(fù)。

3. 高擴(kuò)展性

Ceph不同于swift掷漱,客戶端所有的讀寫操作都要經(jīng)過代理節(jié)點(diǎn)粘室。一旦集群并發(fā)量增大時(shí),代理節(jié)點(diǎn)很容易成為單點(diǎn)瓶頸卜范。Ceph本身并沒有主控節(jié)點(diǎn)衔统,擴(kuò)展起來比較容易,并且理論上海雪,它的性能會(huì)隨著磁盤數(shù)量的增加而線性增長锦爵。

4. 特性豐富

Ceph支持三種調(diào)用接口:對(duì)象存儲(chǔ),塊存儲(chǔ)奥裸,文件系統(tǒng)掛載险掀。三種方式可以一同使用。在國內(nèi)一些公司的云環(huán)境中湾宙,通常會(huì)采用ceph作為openstack的唯一后端存儲(chǔ)來提升數(shù)據(jù)轉(zhuǎn)發(fā)效率樟氢。

Ceph整體組件介紹

從下面這張圖來簡單學(xué)習(xí)下,Ceph 的架構(gòu)組件侠鳄。





自下向上埠啃,可以將Ceph系統(tǒng)分為四個(gè)層次:


基礎(chǔ)存儲(chǔ)系統(tǒng)RADOS(Reliable, Autonomic, Distributed Object Store,即可靠的伟恶、自動(dòng)化的碴开、分布式的對(duì)象存儲(chǔ))


顧名思義,這一層本身就是一個(gè)完整的對(duì)象存儲(chǔ)系統(tǒng)博秫,所有存儲(chǔ)在Ceph系統(tǒng)中的用戶數(shù)據(jù)事實(shí)上最終都是由這一層來存儲(chǔ)的潦牛。而Ceph的高可靠、高可擴(kuò)展挡育、高性能罢绽、高自動(dòng)化等等特性本質(zhì)上也是由這一層所提供的。因此静盅,理解RADOS是理解Ceph的基礎(chǔ)與關(guān)鍵良价。


物理上,RADOS由大量的存儲(chǔ)設(shè)備節(jié)點(diǎn)組層蒿叠,每個(gè)節(jié)點(diǎn)擁有自己的硬件資源(CPU明垢、內(nèi)存、硬盤市咽、網(wǎng)絡(luò))痊银,并運(yùn)行著操作系統(tǒng)和文件系統(tǒng)。4.2施绎、4.3節(jié)將對(duì)RADOS進(jìn)行展開介紹溯革。


基礎(chǔ)庫librados


這一層的功能是對(duì)RADOS進(jìn)行抽象和封裝贞绳,并向上層提供API,以便直接基于RADOS(而不是整個(gè)Ceph)進(jìn)行應(yīng)用開發(fā)致稀。特別要注意的是冈闭,RADOS是一個(gè)對(duì)象存儲(chǔ)系統(tǒng),因此抖单,librados實(shí)現(xiàn)的API也只是針對(duì)對(duì)象存儲(chǔ)功能的灾锯。


RADOS采用C++開發(fā)拍柒,所提供的原生librados API包括C和C++兩種,其文檔參見[2]。物理上块攒,librados和基于其上開發(fā)的應(yīng)用位于同一臺(tái)機(jī)器确虱,因而也被稱為本地API补箍。應(yīng)用調(diào)用本機(jī)上的librados API匾七,再由后者通過socket與RADOS集群中的節(jié)點(diǎn)通信并完成各種操作。


高層應(yīng)用接口


這一層包括了三個(gè)部分:RADOS GW(RADOS Gateway)囚玫、 RBD(Reliable Block Device)和Ceph FS(Ceph File System)园匹,其作用是在librados庫的基礎(chǔ)上提供抽象層次更高、更便于應(yīng)用或客戶端使用的上層接口劫灶。


其中裸违,RADOS GW是一個(gè)提供與Amazon S3和Swift兼容的RESTful API的gateway,以供相應(yīng)的對(duì)象存儲(chǔ)應(yīng)用開發(fā)使用本昏。RADOS GW提供的API抽象層次更高供汛,但功能則不如librados強(qiáng)大。因此涌穆,開發(fā)者應(yīng)針對(duì)自己的需求選擇使用怔昨。


RBD則提供了一個(gè)標(biāo)準(zhǔn)的塊設(shè)備接口,常用于在虛擬化的場景下為虛擬機(jī)創(chuàng)建volume宿稀。目前趁舀,Red Hat已經(jīng)將RBD驅(qū)動(dòng)集成在KVM/QEMU中,以提高虛擬機(jī)訪問性能祝沸。


Ceph FS是一個(gè)POSIX兼容的分布式文件系統(tǒng)矮烹。由于還處在開發(fā)狀態(tài),因而Ceph官網(wǎng)并不推薦將其用于生產(chǎn)環(huán)境中罩锐。


應(yīng)用層


這一層就是不同場景下對(duì)于Ceph各個(gè)應(yīng)用接口的各種應(yīng)用方式奉狈,例如基于librados直接開發(fā)的對(duì)象存儲(chǔ)應(yīng)用,基于RADOS GW開發(fā)的對(duì)象存儲(chǔ)應(yīng)用涩惑,基于RBD實(shí)現(xiàn)的云硬盤等等仁期。


在上文的介紹中,有一個(gè)地方可能容易引起困惑:RADOS自身既然已經(jīng)是一個(gè)對(duì)象存儲(chǔ)系統(tǒng),并且也可以提供librados API跛蛋,為何還要再單獨(dú)開發(fā)一個(gè)RADOS GW熬的?


理解這個(gè)問題,事實(shí)上有助于理解RADOS的本質(zhì)赊级,因此有必要在此加以分析押框。粗看起來,librados和RADOS GW的區(qū)別在于此衅,librados提供的是本地API强戴,而RADOS GW提供的則是RESTful API亭螟,二者的編程模型和實(shí)際性能不同挡鞍。而更進(jìn)一步說,則和這兩個(gè)不同抽象層次的目標(biāo)應(yīng)用場景差異有關(guān)预烙。換言之墨微,雖然RADOS和S3、Swift同屬分布式對(duì)象存儲(chǔ)系統(tǒng)扁掸,但RADOS提供的功能更為基礎(chǔ)翘县、也更為豐富。這一點(diǎn)可以通過對(duì)比看出谴分。


由于Swift和S3支持的API功能近似锈麸,這里以Swift舉例說明。Swift提供的API功能主要包括:


用戶管理操作:用戶認(rèn)證牺蹄、獲取賬戶信息忘伞、列出容器列表等;

容器管理操作:創(chuàng)建/刪除容器沙兰、讀取容器信息氓奈、列出容器內(nèi)對(duì)象列表等;

對(duì)象管理操作:對(duì)象的寫入鼎天、讀取舀奶、復(fù)制、更新斋射、刪除育勺、訪問許可設(shè)置、元數(shù)據(jù)讀取或更新等罗岖。

由此可見怀大,Swift(以及S3)提供的API所操作的“對(duì)象”只有三個(gè):用戶賬戶、用戶存儲(chǔ)數(shù)據(jù)對(duì)象的容器呀闻、數(shù)據(jù)對(duì)象化借。并且,所有的操作均不涉及存儲(chǔ)系統(tǒng) 的底層硬件或系統(tǒng)信息捡多。不難看出蓖康,這樣的API設(shè)計(jì)完全是針對(duì)對(duì)象存儲(chǔ)應(yīng)用開發(fā)者和對(duì)象存儲(chǔ)應(yīng)用用戶的铐炫,并且假定其開發(fā)者和用戶關(guān)心的內(nèi)容更偏重于賬戶和數(shù)據(jù)的管理,而對(duì)底層存儲(chǔ)系統(tǒng)細(xì)節(jié)不感興趣蒜焊,更不關(guān)心效率倒信、性能等方面的深入優(yōu)化。


而librados API的設(shè)計(jì)思想則與此完全不同泳梆。一方面鳖悠,librados中沒有賬戶、容器這樣的高層概念优妙;另一方面乘综,librados API向開發(fā)者開放了大量的RADOS狀態(tài)信息與配置參數(shù),允許開發(fā)者對(duì)RADOS系統(tǒng)以及其中存儲(chǔ)的對(duì)象的狀態(tài)進(jìn)行觀察套硼,并強(qiáng)有力地對(duì)系統(tǒng)存儲(chǔ)策略進(jìn)行控制卡辰。換言之,通過調(diào)用librados API邪意,應(yīng)用不僅能夠?qū)崿F(xiàn)對(duì)數(shù)據(jù)對(duì)象的操作九妈,還能夠?qū)崿F(xiàn)對(duì)RADOS系統(tǒng)的管理和配置。這對(duì)于S3和Swift的RESTful API設(shè)計(jì)是不可想像的雾鬼,也是沒有必要的萌朱。


基于上述分析對(duì)比,不難看出策菜,librados事實(shí)上更適合對(duì)于系統(tǒng)有著深刻理解晶疼,同時(shí)對(duì)于功能定制擴(kuò)展和性能深度優(yōu)化有著強(qiáng)烈需求的高級(jí)用戶∽鋈耄基于librados的開發(fā)可能更適合于在私有Ceph系統(tǒng)上開發(fā)專用應(yīng)用冒晰,或者為基于Ceph的公有存儲(chǔ)系統(tǒng)開發(fā)后臺(tái)數(shù)據(jù)管理、處理應(yīng)用竟块。而RADOS GW則更適合于常見的基于web的對(duì)象存儲(chǔ)應(yīng)用開發(fā)壶运,例如公有云上的對(duì)象存儲(chǔ)服務(wù)。


Ceph對(duì)象存儲(chǔ)特點(diǎn)

Ceph對(duì)象存儲(chǔ)主要特點(diǎn)如下:

高性能

?摒棄了傳統(tǒng)的集中式存儲(chǔ)元數(shù)據(jù)尋址的方案浪秘,采用CRUSH算法蒋情,數(shù)據(jù)分布均衡,并行度高耸携。

考慮了容災(zāi)域的隔離棵癣,能夠?qū)崿F(xiàn)各類負(fù)載的副本放置規(guī)則,例如跨機(jī)房夺衍、機(jī)架感知等狈谊。

能夠支持上千個(gè)存儲(chǔ)節(jié)點(diǎn)的規(guī)模,支持TB到PB級(jí)的數(shù)據(jù)。


高可用性

副本數(shù)可以靈活控制河劝。

支持故障域分隔壁榕,數(shù)據(jù)強(qiáng)一致性。

多種故障場景自動(dòng)進(jìn)行修復(fù)自愈赎瞎。

沒有單點(diǎn)故障牌里,自動(dòng)管理。


高可擴(kuò)展性


去中心化务甥。

擴(kuò)展靈活牡辽。

隨著節(jié)點(diǎn)增加而線性增長。


Ceph對(duì)象存儲(chǔ)架構(gòu)

對(duì)象存儲(chǔ)系統(tǒng)架構(gòu)圖如下:




如上圖所示敞临,Ceph對(duì)象存儲(chǔ)底層主要有兩個(gè)基本組件實(shí)現(xiàn)



OSD

OSD态辛,Ceph OSD 是由物理磁盤驅(qū)動(dòng)器、在其之上的 Linux 文件系統(tǒng)以及 Ceph OSD 服務(wù)組成哟绊。Ceph OSD 將數(shù)據(jù)以對(duì)象的形式存儲(chǔ)到集群中的每個(gè)節(jié)點(diǎn)的物理磁盤上因妙,完成存儲(chǔ)數(shù)據(jù)的工作絕大多數(shù)是由 OSD daemon 進(jìn)程實(shí)現(xiàn)痰憎,用于集群中所有數(shù)據(jù)與對(duì)象的存儲(chǔ)票髓。處理集群數(shù)據(jù)的復(fù)制、恢復(fù)铣耘、回填洽沟、再均衡。并向其他osd守護(hù)進(jìn)程發(fā)送心跳蜗细,然后向Mon提供一些監(jiān)控信息裆操。

當(dāng)Ceph存儲(chǔ)集群設(shè)定數(shù)據(jù)有兩個(gè)副本時(shí)(一共存兩份),則至少需要兩個(gè)OSD守護(hù)進(jìn)程即兩個(gè)OSD節(jié)點(diǎn)炉媒,集群才能達(dá)到active+clean狀態(tài)踪区。



Monitor

Monitor, 維護(hù)集群的cluster MAP二進(jìn)制表吊骤,保證集群數(shù)據(jù)?的一致性缎岗。ClusterMAP描述了對(duì)象塊存儲(chǔ)的物理位置,以及一個(gè)將設(shè)備聚合到物理位置的桶列表白粉,信息由維護(hù)集群成員的守護(hù)程序來提供各節(jié)點(diǎn)之間的狀態(tài)传泊、集群配置信息。Ceph monitor map主要包括OSD map鸭巴、PG map眷细、MDS map 和 CRUSH 等,這些 map 被統(tǒng)稱為集群 Map鹃祖。ceph monitor 不存儲(chǔ)任何數(shù)據(jù)溪椎。下面分別開始介紹這些map的功能:


Monitor map:包括有關(guān)monitor 節(jié)點(diǎn)端到端的信息,其中包括 Ceph 集群ID,監(jiān)控主機(jī)名和IP以及端口校读。并且存儲(chǔ)當(dāng)前版本信息以及最新更改信息奔害,通過 "ceph mon dump" 查看 monitor map。

OSD map:包括一些常用的信息地熄,如集群ID华临、創(chuàng)建OSD map的 版本信息和最后修改信息,以及pool相關(guān)信息端考,主要包括pool 名字雅潭、pool的ID、類型却特,副本數(shù)目以及PGP等扶供,還包括數(shù)量、狀態(tài)裂明、權(quán)重椿浓、最新的清潔間隔和OSD主機(jī)信息。

PG map:包括當(dāng)前PG版本闽晦、時(shí)間戳扳碍、最新的OSD Map的版本信息、空間使用比例仙蛉,以及接近占滿比例信息笋敞,同事,也包括每個(gè)PG ID荠瘪、對(duì)象數(shù)目夯巷、狀態(tài)、OSD 的狀態(tài)以及深度清理的詳細(xì)信息哀墓。

CRUSH map: CRUSH map 包括集群存儲(chǔ)設(shè)備信息趁餐,故障域?qū)哟谓Y(jié)構(gòu)和存儲(chǔ)數(shù)據(jù)時(shí)定義失敗域規(guī)則信息。通過 命令 "ceph osd crush map" 查看篮绰。

MDS map:MDS Map 包括存儲(chǔ)當(dāng)前 MDS map 的版本信息后雷、創(chuàng)建當(dāng)前的Map的信息、修改時(shí)間阶牍、數(shù)據(jù)和元數(shù)據(jù)POOL ID喷面、集群MDS數(shù)目和MDS狀態(tài)。


Crush

簡單說下CRUSH走孽,Controlled Replication Under Scalable Hashing惧辈,它表示數(shù)據(jù)存儲(chǔ)的分布式選擇算法, ceph 的高性能/高可用就是采用這種算法實(shí)現(xiàn)磕瓷。CRUSH 算法取代了在元數(shù)據(jù)表中為每個(gè)客戶端請(qǐng)求進(jìn)行查找盒齿,它通過計(jì)算系統(tǒng)中數(shù)據(jù)應(yīng)該被寫入或讀出的位置念逞。CRUSH能夠感知基礎(chǔ)架構(gòu),能夠理解基礎(chǔ)設(shè)施各個(gè)部件之間的關(guān)系边翁。并且CRUSH保存數(shù)據(jù)的多個(gè)副本翎承,這樣即使一個(gè)故障域的幾個(gè)組件都出現(xiàn)故障,數(shù)據(jù)依然可用符匾。CRUSH 算是使得 ceph 實(shí)現(xiàn)了自我管理和自我修復(fù)叨咖。


高性能索引和分布均勻性

CRUSH算法介紹

Crush算法是一種偽隨機(jī)算法,通過權(quán)重決定數(shù)據(jù)存放(如跨機(jī)房啊胶、機(jī)架感知等)甸各,通常采用基于容量的權(quán)重。Crush算法支持副本和EC兩種數(shù)據(jù)冗余方式焰坪,還提供了四種不同類型的Bucket(Uniform趣倾、List、Tree某饰、Straw)儒恋,大多數(shù)情況下的都采用Straw。

在說明CRUSH算法的基本原理之前黔漂,先介紹幾個(gè)概念和它們之間的關(guān)系诫尽。





File —— 此處的file就是用戶需要存儲(chǔ)或者訪問的文件。對(duì)于一個(gè)基于Ceph開發(fā)的對(duì)象存儲(chǔ)應(yīng)用而言瘟仿,這個(gè)file也就對(duì)應(yīng)于應(yīng)用中的“對(duì)象”箱锐,也就是用戶直接操作的“對(duì)象”比勉。


Ojbect —— 此處的object是RADOS所看到的“對(duì)象”劳较。Object與上面提到的file的區(qū)別是,object的最大size由RADOS限定(通常為2MB或4MB)浩聋,以便實(shí)現(xiàn)底層存儲(chǔ)的組織管理观蜗。因此,當(dāng)上層應(yīng)用向RADOS存入size很大的file時(shí)衣洁,需要將file切分成統(tǒng)一大小的一系列object(最后一個(gè)的大小可以不同)進(jìn)行存儲(chǔ)墓捻。為避免混淆,在本文中將盡量避免使用中文的“對(duì)象”這一名詞坊夫,而直接使用file或object進(jìn)行說明砖第。


PG(Placement Group)—— 顧名思義,PG的用途是對(duì)object的存儲(chǔ)進(jìn)行組織和位置映射环凿。具體而言梧兼,一個(gè)PG負(fù)責(zé)組織若干個(gè)object(可以為數(shù)千個(gè)甚至更多),但一個(gè)object只能被映射到一個(gè)PG中智听,即羽杰,PG和object之間是“一對(duì)多”映射關(guān)系渡紫。同時(shí),一個(gè)PG會(huì)被映射到n個(gè)OSD上考赛,而每個(gè)OSD上都會(huì)承載大量的PG,即,PG和OSD之間是“多對(duì)多”映射關(guān)系恢口。在實(shí)踐當(dāng)中呆躲,n至少為2,如果用于生產(chǎn)環(huán)境忍抽,則至少為3欣喧。一個(gè)OSD上的PG則可達(dá)到數(shù)百個(gè)。事實(shí)上梯找,PG數(shù)量的設(shè)置牽扯到數(shù)據(jù)分布的均勻性問題唆阿。關(guān)于這一點(diǎn),下文還將有所展開锈锤。


OSD —— 即object storage device驯鳖,前文已經(jīng)詳細(xì)介紹,此處不再展開久免。唯一需要說明的是浅辙,OSD的數(shù)量事實(shí)上也關(guān)系到系統(tǒng)的數(shù)據(jù)分布均勻性,因此其數(shù)量不應(yīng)太少阎姥。在實(shí)踐當(dāng)中记舆,至少也應(yīng)該是數(shù)十上百個(gè)的量級(jí)才有助于Ceph系統(tǒng)的設(shè)計(jì)發(fā)揮其應(yīng)有的優(yōu)勢。

Failure domain —— 這個(gè)概念在論文中并沒有進(jìn)行定義呼巴,好在對(duì)分布式存儲(chǔ)系統(tǒng)有一定概念的讀者應(yīng)該能夠了解其大意泽腮。


存儲(chǔ)數(shù)據(jù)與object的關(guān)系:

當(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ǔ)單元碧磅。


object與pg的關(guān)系:

由于object的數(shù)量很多,所以Ceph引入了pg的概念用于管理object遵馆,每個(gè)object最后都會(huì)通過CRUSH計(jì)算映射到某個(gè)pg中鲸郊,一個(gè)pg可以包含多個(gè)object。

pg與osd的關(guān)系:

pg也需要通過CRUSH計(jì)算映射到osd中去存儲(chǔ)货邓,如果是二副本的秆撮,則每個(gè)pg都會(huì)映射到二個(gè)osd,比如[osd.1,osd.2]逻恐,那么osd.1是存放該pg的主副本像吻,osd.2是存放該pg的從副本峻黍,保證了數(shù)據(jù)的冗余。

Ceph通過Crush算法拨匆,將若干個(gè)object映射到PG上姆涩,形成一個(gè)object與PG的邏輯集合,并以此作為object與OSD的中間層惭每,將PG根據(jù)所在POOL的副本數(shù)骨饿,復(fù)制到多個(gè)OSD上。PG的用途是將某些東西進(jìn)行邏輯歸組台腥,從而達(dá)到統(tǒng)一管理宏赘,提升效率的作用。相對(duì)整體集群規(guī)模來說黎侈,如果存儲(chǔ)池設(shè)置的PG較少察署,那么在每個(gè)PG上Ceph將會(huì)存儲(chǔ)大量的數(shù)據(jù);如果存儲(chǔ)池設(shè)置的PG過大峻汉,那么Ceph OSD將會(huì)消耗更多的CPU與內(nèi)存贴汪。


pg和pgp的關(guān)系:

pg是用來存放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é)過的排列組合,pgp就是代表這個(gè)意思邀跃。一般來說應(yīng)該將pg和pgp的數(shù)量設(shè)置為相等霉咨。

CRUSH算法尋址流程

在Ceph存儲(chǔ)系統(tǒng)中,數(shù)據(jù)存儲(chǔ)分三個(gè)映射過程拍屑,首先要將用戶要操作的file途戒,映射為RADOS能夠處理的object。就是簡單的按照object的size對(duì)file進(jìn)行切分僵驰,相當(dāng)于RAID中的條帶化過程喷斋。接著把Object映射到PG唁毒,在file被映射為一個(gè)或多個(gè)object之后,就需要將每個(gè)object獨(dú)立地映射到一個(gè)PG中去星爪,計(jì)算object的Hash值并將結(jié)果和PG數(shù)目取余浆西,以得到object對(duì)應(yīng)的PG編號(hào)。第三次映射就是使用CRUSH算法將作為object的邏輯組織單元的PG映射到數(shù)據(jù)的實(shí)際存儲(chǔ)單元OSD顽腾。



文件存入時(shí)近零,首先把File切分為RADOS層面的Object,每個(gè)Object一般為2MB或4MB(大小可設(shè)置)抄肖。每個(gè)Object通過哈希算法映射到唯一的PG久信。每個(gè)PG通過Crush算法映射到實(shí)際存儲(chǔ)單元OSD,PG和OSD間是多對(duì)多的映射關(guān)系漓摩。OSD在物理上可劃分到多個(gè)故障域中裙士,故障域可以跨機(jī)柜和服務(wù)器,通過策略配置使PG的不同副本位于不同的故障域中管毙。

在PG通過Crush算法映射到數(shù)據(jù)的實(shí)際存儲(chǔ)單元OSD時(shí)潮售,需求通過Crush Map、Crush Rules和Crush算法配合才能完成锅风。


Cluster Map用來記錄全局系統(tǒng)狀態(tài)記數(shù)據(jù)結(jié)構(gòu)酥诽,由Crush Map和OSD Map兩部分組成。 Crush Map包含當(dāng)前磁盤皱埠、服務(wù)器肮帐、機(jī)架的層級(jí)結(jié)構(gòu),OSD Map包含當(dāng)前所有Pool的狀態(tài)和所有OSD的狀態(tài)边器。


Crush Rules就是數(shù)據(jù)映射的策略训枢,決定了每個(gè)數(shù)據(jù)對(duì)象有多少個(gè)副本,這些副本如何存儲(chǔ)忘巧。


CRUSH算法因子


CRUSH算法的全稱為:Controlled Scalable Decentralized Placement of Replicated Data恒界,可控的、可擴(kuò)展的砚嘴、分布式的副本數(shù)據(jù)放置算法十酣。

pg到OSD的映射的過程算法叫做CRUSH 算法。(如一個(gè)Object需要保存三個(gè)副本际长,也就是需要保存在三個(gè)osd上)耸采。

CRUSH算法是一個(gè)偽隨機(jī)的過程,他可以從所有的OSD中工育,隨機(jī)性選擇一個(gè)OSD集合虾宇,但是同一個(gè)PG每次隨機(jī)選擇的結(jié)果是不變的,也就是映射的OSD集合是固定的如绸。


(Pool, PG) → OSD set 的映射由四個(gè)因素決定:

CRUSH算法:一種偽隨機(jī)算法嘱朽。

OSD MAP:包含當(dāng)前所有Pool的狀態(tài)和所有OSD的狀態(tài)旭贬。

CRUSH MAP:包含當(dāng)前磁盤、服務(wù)器搪泳、機(jī)架的層級(jí)結(jié)構(gòu)稀轨。

CRUSH Rules:數(shù)據(jù)映射的策略。


層級(jí)化的Cluster Map

反映了存儲(chǔ)系統(tǒng)層級(jí)的物理拓?fù)浣Y(jié)構(gòu)森书。定義了OSD集群具有層級(jí)關(guān)系的 靜態(tài)拓?fù)浣Y(jié)構(gòu)靶端。OSD層級(jí)使得 CRUSH算法在選擇OSD時(shí)實(shí)現(xiàn)了機(jī)架感知能力,也就是通過規(guī)則定義凛膏, 使得副本可以分布在不同的機(jī) 架杨名、不同的機(jī)房中、提供數(shù)據(jù)的安全性 猖毫。


層級(jí)化的Cluster Map


CRUSH Map是一個(gè)樹形結(jié)構(gòu)台谍,OSDMap更多記錄的是OSDMap的屬性(epoch/fsid/pool信息以及osd的ip等等)。

葉子節(jié)點(diǎn)是device(也就是osd)吁断,其他的節(jié)點(diǎn)稱為bucket節(jié)點(diǎn)趁蕊,這些bucket都是虛構(gòu)的節(jié)點(diǎn),可以根據(jù)物理結(jié)構(gòu)進(jìn)行抽象仔役,當(dāng)然樹形結(jié)構(gòu)只有一個(gè)最終的根節(jié)點(diǎn)稱之為root節(jié)點(diǎn)掷伙,中間虛擬的bucket節(jié)點(diǎn)可以是數(shù)據(jù)中心抽象、機(jī)房抽象又兵、機(jī)架抽象任柜、主機(jī)抽象等。


Cluster map的實(shí)際內(nèi)容包括:


Epoch沛厨,即版本號(hào)宙地。Cluster map的epoch是一個(gè)單調(diào)遞增序列。Epoch越大逆皮,則cluster map版本越新宅粥。因此,持有不同版本cluster map的OSD或client可以簡單地通過比較epoch決定應(yīng)該遵從誰手中的版本电谣。而monitor手中必定有epoch最大秽梅、版本最新的cluster map。當(dāng)任意兩方在通信時(shí)發(fā)現(xiàn)彼此epoch值不同時(shí)辰企,將默認(rèn)先將cluster map同步至高版本一方的狀態(tài)风纠,再進(jìn)行后續(xù)操作。


各個(gè)OSD的網(wǎng)絡(luò)地址牢贸。


各個(gè)OSD的狀態(tài)。OSD狀態(tài)的描述分為兩個(gè)維度:up或者down(表明OSD是否正常工作)镐捧,in或者out(表明OSD是否在至少一個(gè)PG中)潜索。因此臭增,對(duì)于任意一個(gè)OSD,共有四種可能的狀態(tài):


—— Up且in:說明該OSD正常運(yùn)行竹习,且已經(jīng)承載至少一個(gè)PG的數(shù)據(jù)誊抛。這是一個(gè)OSD的標(biāo)準(zhǔn)工作狀態(tài);


—— Up且out:說明該OSD正常運(yùn)行整陌,但并未承載任何PG拗窃,其中也沒有數(shù)據(jù)。一個(gè)新的OSD剛剛被加入Ceph集群后泌辫,便會(huì)處于這一狀態(tài)随夸。而一個(gè)出現(xiàn)故障的OSD被修復(fù)后,重新加入Ceph集群時(shí)震放,也是處于這一狀態(tài)宾毒;


—— Down且in:說明該OSD發(fā)生異常,但仍然承載著至少一個(gè)PG殿遂,其中仍然存儲(chǔ)著數(shù)據(jù)诈铛。這種狀態(tài)下的OSD剛剛被發(fā)現(xiàn)存在異常,可能仍能恢復(fù)正常墨礁,也可能會(huì)徹底無法工作幢竹;


—— Down且out:說明該OSD已經(jīng)徹底發(fā)生故障,且已經(jīng)不再承載任何PG恩静。


CRUSH算法配置參數(shù)焕毫。表明了Ceph集群的物理層級(jí)關(guān)系(cluster hierarchy),位置映射規(guī)則(placement rules)蜕企。


數(shù)據(jù)分布策略Placement Rules


數(shù)據(jù)分布策略Placement Rules主要有特點(diǎn):

a. 從CRUSH Map中的哪個(gè)節(jié)點(diǎn)開始查找

b. 使用那個(gè)節(jié)點(diǎn)作為故障隔離域

c. 定位副本的搜索模式(廣度優(yōu)先 or 深度優(yōu)先)


Bucket隨機(jī)算法類型



一般的buckets:適合所有子節(jié)點(diǎn)權(quán)重相同咬荷,而且很少添加刪除item。

list buckets:適用于集群擴(kuò)展類型轻掩。增加item幸乒,產(chǎn)生最優(yōu)的數(shù)據(jù)移動(dòng),查找item唇牧,時(shí)間復(fù)雜度O(n)罕扎。

tree buckets:查找負(fù)責(zé)度是O (log n), 添加刪除葉子節(jié)點(diǎn)時(shí),其他節(jié)點(diǎn)node_id不變丐重。

straw buckets:允許所有項(xiàng)通過類似抽簽的方式來與其他項(xiàng)公平“競爭”腔召。定位副本時(shí),bucket中的每一項(xiàng)都對(duì)應(yīng)一個(gè)隨機(jī)長度的straw扮惦,且擁有最長長度的straw會(huì)獲得勝利(被選中)臀蛛,添加或者重新計(jì)算,子樹之間的數(shù)據(jù)移動(dòng)提供最優(yōu)的解決方案。


CRUSH算法案例

說明:

集群中有部分sas和ssd磁盤浊仆,現(xiàn)在有個(gè)業(yè)務(wù)線性能及可用性優(yōu)先級(jí)高于其他業(yè)務(wù)線客峭,能否讓這個(gè)高優(yōu)業(yè)務(wù)線的數(shù)據(jù)都存放在ssd磁盤上。

普通用戶:


高優(yōu)用戶:


配置規(guī)則:



?總結(jié)


crush算法良好的設(shè)計(jì)理念抡柿,使其具有計(jì)算尋址舔琅,高并發(fā)和動(dòng)態(tài)數(shù)據(jù)均衡,可定制的副本策略等基本特性洲劣,進(jìn)而能夠非常方便的實(shí)現(xiàn)諸如去中心化备蚓,有效抵御物理結(jié)構(gòu)變化,并保證性能隨著集群規(guī)模呈線性擴(kuò)展囱稽,高可靠等特性郊尝,因而非常適合ceph這類可擴(kuò)展,性能和可靠性都有嚴(yán)苛要求的大型分布式存儲(chǔ)系統(tǒng)粗悯。


由于篇幅有限虚循,未能從代碼實(shí)現(xiàn)層面詳解straw算法實(shí)現(xiàn),后續(xù)專題講解样傍。


存儲(chǔ)容量及可擴(kuò)展性(extendibility)

存儲(chǔ)容量及可擴(kuò)展性

Ceph 的性能和存儲(chǔ)容量隨 OSD 的擴(kuò)展幾乎是線性增加横缔。

CRUSH 通過一種偽隨機(jī)的方式將數(shù)據(jù)進(jìn)行分布,因此 OSD 的利用就能夠準(zhǔn)確地通過二項(xiàng)式建纳栏纾或者常規(guī)方式分配茎刚。無論哪一個(gè)都可以取得完美的隨機(jī)過程。隨著 PG 的增加撤逢,差異就下降:對(duì)于每個(gè) OSD 100 個(gè) PG的情況下膛锭,標(biāo)準(zhǔn)差是 10%;對(duì)于1000 個(gè)的情況下為 3%蚊荣。線性的分布策略極好地將負(fù)載在集群中平衡初狰。但是簡單的哈希函數(shù)無法處理設(shè)備失效以及 OSD 變動(dòng)的情況。因?yàn)閿?shù)據(jù)通過 CRUSH 來進(jìn)行分配互例,如果哈希比較亂奢入,那么在 PGs 較少的情況下,其吞吐會(huì)有所下降:因?yàn)?OSD 使用的差異變化大媳叨,那么會(huì)導(dǎo)致請(qǐng)求隊(duì)列的長度會(huì)在我們客戶端的散亂的負(fù)載下發(fā)生抖動(dòng)(飄移)腥光。因?yàn)樵O(shè)備有可能變得過滿或者使用過度,從而拖累性能糊秆,CRUSH 通過卸載所有的分配碎片到一個(gè)特定的 OSD 上從而來修正這樣的問題武福。與哈希以及線性策略不同,CRUSH 同時(shí)也最小化了數(shù)據(jù)在集群擴(kuò)展產(chǎn)生的遷移痘番,同時(shí)又保證了負(fù)載的平衡捉片。CRUSH 的計(jì)算復(fù)雜度為 O(log(n))(對(duì)于有 n 個(gè) OSD 的集群),因此只需要 10 幾個(gè)微秒就可以使集群增長到好幾千個(gè) OSDs。

Ceph不同于swift界睁,客戶端所有的讀寫操作都要經(jīng)過代理節(jié)點(diǎn)觉增。一旦集群并發(fā)量增大時(shí)兵拢,代理節(jié)點(diǎn)很容易成為單點(diǎn)瓶頸翻斟。Ceph本身并沒有主控節(jié)點(diǎn),擴(kuò)展起來比較容易说铃,并且理論上访惜,它的性能會(huì)隨著磁盤數(shù)量的增加而線性增長。

綜上腻扇,ceph的擴(kuò)展性具備以下特點(diǎn):

高度并行债热。沒有單個(gè)中心控制組件。所有負(fù)載都能動(dòng)態(tài)的劃分到各個(gè)服務(wù)器上幼苛。把更多的功能放到OSD上窒篱,讓OSD更智能。


自管理舶沿。容易擴(kuò)展墙杯、升級(jí)、替換括荡。當(dāng)組件發(fā)生故障時(shí)高镐,自動(dòng)進(jìn)行數(shù)據(jù)的重新復(fù)制。當(dāng)組件發(fā)生變化時(shí)(添加/刪除)畸冲,自動(dòng)進(jìn)行數(shù)據(jù)的重分布嫉髓。


由于Monitor和OSD節(jié)點(diǎn)都具備平行擴(kuò)展的條件匣吊,因此存儲(chǔ)容量理論上可以達(dá)到EB篇亭,PB級(jí)別儡炼。


系統(tǒng)可用性(Availability)

系統(tǒng)可用性保證

在分布式系統(tǒng)中测萎,常見的故障有網(wǎng)絡(luò)中斷撵儿、掉電蜈块、服務(wù)器宕機(jī)俐东、硬盤故障等间景,Ceph能夠容忍這些故障鲸阔,并進(jìn)行自動(dòng)修復(fù)偷霉,保證數(shù)據(jù)的可靠性和系統(tǒng)可用性褐筛。

Monitors是Ceph管家,維護(hù)著Ceph的全局狀態(tài)渔扎。Monitors的功能和zookeeper類似,它們使用Quorum和Paxos算法去建立全局狀態(tài)的共識(shí)残吩。


OSDs可以進(jìn)行自動(dòng)修復(fù),而且是并行修復(fù)即彪。


故障檢測:

OSD之間有心跳檢測活尊,當(dāng)OSD A檢測到OSD B沒有回應(yīng)時(shí),會(huì)報(bào)告給Monitors說OSD B無法連接深胳,則Monitors給OSD B標(biāo)記為down狀態(tài)铜犬,并更新OSD Map。當(dāng)過了M秒之后還是無法連接到OSD B敛劝,則Monitors給OSD B標(biāo)記為out狀態(tài)(表明OSD B不能工作)煎谍,并更新OSD Map。

備注:可以在Ceph中配置M的值满俗。


故障恢復(fù):

當(dāng)某個(gè)PG對(duì)應(yīng)的OSD set中有一個(gè)OSD被標(biāo)記為down時(shí)(假如是Primary被標(biāo)記為down作岖,則某個(gè)Replica會(huì)成為新的Primary,并處理所有讀寫 object請(qǐng)求)痘儡,則該P(yáng)G處于active+degraded狀態(tài)沉删,也就是當(dāng)前PG有效的副本數(shù)是N-1。

過了M秒之后矾瑰,假如還是無法連接該OSD,則它被標(biāo)記為out凉夯,Ceph會(huì)重新計(jì)算PG到OSD set的映射(當(dāng)有新的OSD加入到集群時(shí),也會(huì)重新計(jì)算所有PG到OSD set的映射)震桶,以此保證PG的有效副本數(shù)是N征绎。

新OSD set的Primary先從舊的OSD set中收集PG log,得到一份Authoritative History(完整的淤堵、全序的操作序列)顷扩,并讓其他Replicas同意這份Authoritative History(也就是其他Replicas對(duì)PG的所有objects的狀態(tài)達(dá)成一致)慰毅,這個(gè)過程叫做Peering。

當(dāng)Peering過程完成之后婶芭,PG進(jìn) 入active+recoverying狀態(tài)着饥,Primary會(huì)遷移和同步那些降級(jí)的objects到所有的replicas上,保證這些objects 的副本數(shù)為N呵哨。


數(shù)據(jù)同步機(jī)制

PG同步機(jī)制介紹

在可擴(kuò)展的情形下轨奄,為了保證系統(tǒng)的可用性以及數(shù)據(jù)的安全,RADOS 通過可變的主復(fù)本復(fù)制技術(shù)來管理自己的數(shù)據(jù)復(fù)本挨务,同時(shí)利用多個(gè)步驟來保證對(duì)性能的影響最小化玉组。


數(shù)據(jù)是根據(jù) PGs 來復(fù)制的,每個(gè) PG 都影射到一個(gè)有序 n 路 OSD中(對(duì)于 n 路復(fù)制)朝巫《执眨客戶端將所有的寫發(fā)送到第一個(gè)未失效的 OSD 的對(duì)象 PG 中(主)户辱,然后賦給對(duì)象以及 PG 一個(gè)版本號(hào)糙臼,然后將寫轉(zhuǎn)發(fā)到所有其他復(fù)本 OSDs 中。當(dāng)所有的復(fù)本都已經(jīng)應(yīng)用并且更新回得到了主復(fù)本必逆,則主復(fù)本在本地應(yīng)用更新揽乱,然后將寫確認(rèn)發(fā)送到客戶端凰棉。讀則將被定向到主復(fù)本。這樣的方式使用客戶端不要關(guān)心數(shù)據(jù)在不同版本之間序列化以及同步的復(fù)雜性撒犀,這些復(fù)雜性會(huì)在其他的寫者到來或者失效恢復(fù)情況下更加嚴(yán)重或舞。同時(shí),這也將由復(fù)本所消耗的帶寬由客戶端移到了 OSD 集群的內(nèi)部網(wǎng)絡(luò)映凳,這樣我們可以期望整個(gè)資源的最大可用性诈豌。

數(shù)據(jù)一致性保證(Consistency)

最終一致性


如圖所示Ceph的讀寫操作采用Primary-Replica模型,Client只向Object所對(duì)應(yīng)OSD set的Primary發(fā)起讀寫請(qǐng)求派桩,這保證了數(shù)據(jù)的強(qiáng)一致性蚌斩。

由于每個(gè)Object都只有一個(gè)Primary OSD,因此對(duì)Object的更新都是順序的员魏,不存在同步問題叠聋。

當(dāng)Primary收到Object的寫請(qǐng)求時(shí),它負(fù)責(zé)把數(shù)據(jù)發(fā)送給其他Replicas虏束,只要這個(gè)數(shù)據(jù)被保存在所有的OSD上時(shí),Primary才應(yīng)答Object的寫請(qǐng)求照藻,這保證了副本的一致性汗侵。另外client不需要負(fù)責(zé)副本的復(fù)制(由primary負(fù)責(zé)),這降低了client的網(wǎng)絡(luò)消耗。


故障遷移及恢復(fù)

故障遷移及恢復(fù)說明

由于 OSD 的失效发乔,恢復(fù)以及部署新存儲(chǔ)設(shè)備雪猪,OSD 集群影射是會(huì)變化的浪蹂。

Ceph 對(duì)這些變化的處理方式都是一樣的。為了快速恢復(fù)坤次,OSDs對(duì)每一個(gè) PG 的每一個(gè)對(duì)象以及最新的更新日志(名字以及更新版本缰猴,或者刪除的對(duì)象)都維護(hù)了一個(gè)版本號(hào)疤剑。當(dāng)活動(dòng)的 OSD 收到更新影射的消息,它將遍歷所有的存儲(chǔ)在本地的 PG疑故,并計(jì)算 CRUSH 影射來確定其對(duì)哪一個(gè)負(fù)責(zé)弯菊,是作為主還是做復(fù)本管钳。

如果 PG 的成員有了變化,或者 OSD 剛剛啟動(dòng)牛曹,那個(gè)這個(gè) OSD 必須與 PG 中的其他 OSD 建立連接端點(diǎn)醇滥。對(duì)于作為復(fù)本的 PGs超营,OSD 向主復(fù)本提供當(dāng)前PG 的版本號(hào)演闭。如果主復(fù)本沒有最近的 PG 狀態(tài)书妻,為了確定正確 PG 的正確內(nèi)容(最近的)則從當(dāng)前的或者前一個(gè) PG 的 OSD 中取得 PG 變更的日志(如果必要的話,也取得完整的內(nèi)容)躲履。主復(fù)本將數(shù)據(jù)的增量更新日志(如果必要工猜,連同完整的內(nèi)容)發(fā)送給其他的復(fù)本設(shè)備,這樣每一部份都將取得 PG 的內(nèi)容史侣,就算它們本地的內(nèi)容是有差異的魏身。只有在主復(fù)本確認(rèn)的正確的 PG 狀態(tài),并且將其共享給了其他的復(fù)本設(shè)備后税朴,針對(duì) PG 中對(duì)象的 IO才會(huì)被放行家制。之后颤殴,OSDs 將獨(dú)立負(fù)責(zé)從其他對(duì)端中取回丟失的數(shù)據(jù)以及更新過時(shí)的數(shù)據(jù)。

如果某個(gè) OSD 收到一個(gè)空白或者丟失的對(duì)象的請(qǐng)求杈绸,則會(huì)延遲處理贤笆,并將這個(gè)對(duì)像的恢復(fù)移動(dòng)到處理隊(duì)列的前部芥永。例如,如果 osd1 崩潰了埋涧,并且被標(biāo)記為 Down 狀態(tài)奇瘦,osd2 成為 pgA 的主復(fù)本劲弦。這時(shí)如果 osd1 恢復(fù)了耳标,在啟動(dòng)后它會(huì)請(qǐng)求最新的影射信息,監(jiān)控器也將其標(biāo)記為啟動(dòng)狀態(tài)邑跪。當(dāng) osd2 收到了最終的更新信息次坡,則它會(huì)意識(shí)到自己不再是 pgA 的主復(fù)本画畅,并發(fā)送 pgA 版本號(hào)到 osd1砸琅。此時(shí) osd1 將從 osd2 中取回 pgA 最新的更新日志記錄轴踱,并告訴 osd2 它的內(nèi)容才是最新的症脂,當(dāng)所有對(duì)象的恢復(fù)完成后,osd1 才會(huì)處理其他的請(qǐng)求淫僻。

由于失效恢復(fù)完全由個(gè)個(gè)的 OSDs 來驅(qū)動(dòng)诱篷,每個(gè)受失效 OSD 影響的 PG 對(duì)于替換的OSD 來講都是并行恢復(fù)。這種基于FaRM(Fast Revovery ? Mechanism) 的方式雳灵,減少了恢復(fù)的時(shí)間,提高了數(shù)據(jù)的整體安全性悯辙。


OSD新增或者故障遷移中橙凳,cluster map的關(guān)鍵作用

一個(gè)新的OSD上線后,首先根據(jù)配置信息與monitor通信笑撞。Monitor將其加入cluster map,并設(shè)置為up且out狀態(tài)钓觉,再將最新版本的cluster map發(fā)給這個(gè)新OSD。

收到monitor發(fā)來的cluster map之后,這個(gè)新OSD計(jì)算出自己所承載的PG(為簡化討論,此處我們假定這個(gè)新的OSD開始只承載一個(gè)PG),以及和自己承載同一個(gè)PG的其他OSD信姓。然后,新OSD將與這些OSD取得聯(lián)系外驱。如果這個(gè)PG目前處于降級(jí)狀態(tài)(即承載該P(yáng)G的OSD個(gè)數(shù)少于正常值,如正常應(yīng)該是3個(gè),此時(shí)只有2個(gè)或1個(gè)杭煎。這種情況通常是OSD故障所致)儡毕,則其他OSD將把這個(gè)PG內(nèi)的所有對(duì)象和元數(shù)據(jù)復(fù)制給新OSD。數(shù)據(jù)復(fù)制完成后倒槐,新OSD被置為up且in狀態(tài)永毅。而cluster map內(nèi)容也將據(jù)此更新着逐。這事實(shí)上是一個(gè)自動(dòng)化的failure recovery過程。當(dāng)然,即便沒有新的OSD加入吩翻,降級(jí)的PG也將計(jì)算出其他OSD實(shí)現(xiàn)failure recovery搏予。

如果該P(yáng)G目前一切正常,則這個(gè)新OSD將替換掉現(xiàn)有OSD中的一個(gè)(PG內(nèi)將重新選出Primary OSD),并承擔(dān)其數(shù)據(jù)仿粹。在數(shù)據(jù)復(fù)制完成后擂橘,新OSD被置為up且in狀態(tài)仿吞,而被替換的OSD將退出該P(yáng)G(但狀態(tài)通常仍然為up且in,因?yàn)檫€要承載其他PG)彤避。而cluster map內(nèi)容也將據(jù)此更新蒿褂。這事實(shí)上是一個(gè)自動(dòng)化的數(shù)據(jù)re-balancing過程。

如果一個(gè)OSD發(fā)現(xiàn)和自己共同承載一個(gè)PG的另一個(gè)OSD無法聯(lián)通,則會(huì)將這一情況上報(bào)monitor。此外,如果一個(gè)OSD deamon發(fā)現(xiàn)自身工作狀態(tài)異常,也將把異常情況主動(dòng)上報(bào)給monitor。在上述情況下,monitor將把出現(xiàn)問題的OSD的狀態(tài)設(shè)為down且in无蜂。 如果超過某一預(yù)訂時(shí)間期限累驮,該OSD仍然無法恢復(fù)正常午绳,則其狀態(tài)將被設(shè)置為down且out耕漱。反之,如果該OSD能夠恢復(fù)正常,則其狀態(tài)會(huì)恢復(fù)為up且in辈赋。在上述這些狀態(tài)變化發(fā)生之后篷就,monitor都將更新cluster map并進(jìn)行擴(kuò)散未辆。這事實(shí)上是自動(dòng)化的failure detection過程炕桨。


數(shù)據(jù)持久及可靠性(Durability)

數(shù)據(jù)持久及可靠性保證

數(shù)據(jù)多副本姊途」泵可配置的per-pool副本策略和故障域布局,支持強(qiáng)一致性渊季。


沒有單點(diǎn)故障病涨±剑可以忍受許多種故障場景嗅骄;防止腦裂窑眯;單個(gè)組件可以滾動(dòng)升級(jí)并在線替換。


所有故障的檢測和自動(dòng)恢復(fù)饵逐。恢復(fù)不需要人工介入彪标,在恢復(fù)期間倍权,可以保持正常的數(shù)據(jù)訪問。


并行恢復(fù)捞烟。并行的恢復(fù)機(jī)制極大的降低了數(shù)據(jù)恢復(fù)時(shí)間薄声,提高數(shù)據(jù)的可靠性。

高性能傳輸

高性能傳輸特性

Client和OSD直接通信题画,不需要代理和轉(zhuǎn)發(fā)默辨。


多個(gè)OSD帶來的高并發(fā)度。objects是分布在所有OSD上苍息。


負(fù)載均衡缩幸。每個(gè)OSD都有權(quán)重值(現(xiàn)在以容量為權(quán)重)。


client不需要負(fù)責(zé)副本的復(fù)制(由primary負(fù)責(zé)),這降低了client的網(wǎng)絡(luò)消耗竞思。

高性能存儲(chǔ)(包括元數(shù)據(jù)存儲(chǔ)機(jī)制)


ceph后端支持多種存儲(chǔ)引擎表谊,以插件式的方式來進(jìn)行管理使用,目前支持filestore盖喷,kvstore爆办,memstore以及最新的bluestore,目前默認(rèn)使用的filestore课梳,但是因?yàn)閒ilestore在寫數(shù)據(jù)前需要先寫journal距辆,會(huì)有一倍的寫放大余佃,并且filestore一開始只是對(duì)于機(jī)械盤進(jìn)行設(shè)計(jì)的,沒有專門針對(duì)ssd做優(yōu)化考慮跨算,因此誕生的bluestore初衷就是為了減少寫放大咙冗,并針對(duì)ssd做優(yōu)化,而且直接管理裸盤漂彤,從理論上進(jìn)一步減少文件系統(tǒng)如ext4/xfs等部分的開銷.

BlueStore最早在Jewel版本中引入,用于取代傳統(tǒng)的fileStore灾搏,作為新一代高性能對(duì)象存儲(chǔ)后端挫望。BlueStore在設(shè)計(jì)中充分考慮了對(duì)下一代全SSD以及全NVMe SSD閃存陣列的適配,例如將一直沿用至今狂窑,用于高效索引元數(shù)據(jù)的DB引擎由levelDB替換為RocksDB媳板,(RocksDB基于LevelDB發(fā)展而來,并針對(duì)直接使用SSD作為后端存儲(chǔ)介質(zhì)的場景做了大量優(yōu)化)泉哈。FileStore因?yàn)槿匀恍枰ㄟ^操作系統(tǒng)自帶的本地文件系統(tǒng)間接管理磁盤蛉幸,所以所有針對(duì)RADOS層的對(duì)象操作,都需要預(yù)先轉(zhuǎn)換為能夠被本地文件系統(tǒng)識(shí)別丛晦,符合POSIX語義的文件操作奕纫,這個(gè)轉(zhuǎn)換過程極其繁瑣,效率低下烫沙。

針對(duì)FileStore的上述缺陷匹层,BlueStore選擇繞過本地文件系統(tǒng),由自身接管裸設(shè)備(例如磁盤)锌蓄,直接進(jìn)行對(duì)象操作升筏,這是BlueStore能夠提升性能的根本原因。除此之外瘸爽,考慮到元數(shù)據(jù)的索引效率對(duì)于性能有著致命影響您访,BlueStore在設(shè)計(jì)中將元數(shù)據(jù)和用戶數(shù)據(jù)嚴(yán)格分離,因此BlueStore中的元數(shù)據(jù)可以單獨(dú)采用高速固態(tài)存儲(chǔ)涉筆剪决,例如使用NVMe SSD進(jìn)行存儲(chǔ)灵汪,能夠起到性能加速的作用,另外Ceph支持通過xattrs擴(kuò)展屬性的方式保存元數(shù)據(jù)昼捍。




跨地域支持


???????Ceph對(duì)象存儲(chǔ)中的OSDs 可以分布在不同地域的數(shù)據(jù)中心识虚,但是由于系統(tǒng)對(duì)文件對(duì)象存儲(chǔ)強(qiáng)一致性的要求,副本在不同地域的OSDs之間同步妒茬,存在延時(shí)担锤,因此,跨地域的響應(yīng)實(shí)時(shí)性方面乍钻,較swift差肛循,更適合在同一個(gè)數(shù)據(jù)中心的大型集群铭腕。

成熟穩(wěn)定度

可以看到國內(nèi)ceph用戶如:中國移動(dòng)、騰訊多糠、阿里累舷、網(wǎng)易、樂視夹孔、攜程被盈、今日頭條、中國電信搭伤、中興只怎、恒豐銀行、平安科技怜俐、YY身堡、B站、360等拍鲤。正是由于眾多用戶的使用驗(yàn)證了它的穩(wěn)定性和可靠性的同時(shí)也促進(jìn)了Ceph的進(jìn)步贴谎,使其出現(xiàn)了很多新東西,如 SPDK季稳、BlueStore擅这、RDMA等等這些高性能底層技術(shù)。(摘抄自騰訊云網(wǎng)站的公開文章)绞幌,另外據(jù)公開資料顯示蕾哟,國外的雅虎,Intel等公司均使用ceph作為共有或者私有云存儲(chǔ)的基礎(chǔ)組建莲蜘。

其他特性

Ceph對(duì)象存儲(chǔ)還支持糾刪碼機(jī)制谭确,替代多副本機(jī)制,實(shí)現(xiàn)數(shù)據(jù)的一致性保證票渠,和存儲(chǔ)可靠性逐哈。

Ceph提供基于dmClock算法的存儲(chǔ)服務(wù)質(zhì)量QoS機(jī)制,來實(shí)現(xiàn)平衡后端I/O資源的調(diào)度策略

由于篇幅有限问顷,后續(xù)可專題介紹昂秃。

可維護(hù)性

Ceph由于支持特性較多,代碼和功能較swift更豐富杜窄,因此學(xué)習(xí)和維護(hù)成本更高肠骆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市塞耕,隨后出現(xiàn)的幾起案子蚀腿,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莉钙,死亡現(xiàn)場離奇詭異廓脆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)磁玉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門停忿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚊伞,你說我怎么就攤上這事岸蜗∈幔” “怎么了臣嚣?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵熊杨,是天一觀的道長。 經(jīng)常有香客問我别垮,道長,這世上最難降的妖魔是什么扎谎? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任碳想,我火速辦了婚禮,結(jié)果婚禮上毁靶,老公的妹妹穿的比我還像新娘胧奔。我一直安慰自己,他們只是感情好预吆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布龙填。 她就那樣靜靜地躺著,像睡著了一般拐叉。 火紅的嫁衣襯著肌膚如雪岩遗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天凤瘦,我揣著相機(jī)與錄音宿礁,去河邊找鬼。 笑死蔬芥,一個(gè)胖子當(dāng)著我的面吹牛梆靖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笔诵,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼返吻,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了乎婿?” 一聲冷哼從身側(cè)響起测僵,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎次酌,沒想到半個(gè)月后恨课,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舆乔,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年剂公,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了希俩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纲辽,死狀恐怖颜武,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拖吼,我是刑警寧澤鳞上,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站吊档,受9級(jí)特大地震影響篙议,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怠硼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一鬼贱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧香璃,春花似錦这难、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眯牧,卻和暖如春蹋岩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背学少。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國打工星澳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旱易。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓禁偎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阀坏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子如暖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容