本文借鑒了ceph官方資料,以及網(wǎng)絡(luò)公開可查的技術(shù)文檔或者圖片,非絕對原創(chuàng),向開源領(lǐng)域的貢獻(xiàn)者和傳播者致敬。
架構(gòu)簡單介紹
Ceph介紹
Ceph是一個(gè)分布式存儲(chǔ)系統(tǒng),提供對象,塊和文件存儲(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í)支持塊、文件、對象接口,支持PB級別擴(kuò)展,規(guī)格上可部署到上千臺(tái)通用服務(wù)器。對象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在一致性哈?;A(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)用接口:對象存儲(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)化的、分布式的對象存儲(chǔ))
顧名思義,這一層本身就是一個(gè)完整的對象存儲(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é)將對RADOS進(jìn)行展開介紹。
基礎(chǔ)庫librados
這一層的功能是對RADOS進(jìn)行抽象和封裝,并向上層提供API,以便直接基于RADOS(而不是整個(gè)Ceph)進(jìn)行應(yīng)用開發(fā)。特別要注意的是,RADOS是一個(gè)對象存儲(chǔ)系統(tǒng),因此,librados實(shí)現(xiàn)的API也只是針對對象存儲(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)的對象存儲(chǔ)應(yīng)用開發(fā)使用。RADOS GW提供的API抽象層次更高,但功能則不如librados強(qiáng)大。因此,開發(fā)者應(yīng)針對自己的需求選擇使用。
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)用層
這一層就是不同場景下對于Ceph各個(gè)應(yīng)用接口的各種應(yīng)用方式,例如基于librados直接開發(fā)的對象存儲(chǔ)應(yīng)用,基于RADOS GW開發(fā)的對象存儲(chǔ)應(yīng)用,基于RBD實(shí)現(xiàn)的云硬盤等等。
在上文的介紹中,有一個(gè)地方可能容易引起困惑:RADOS自身既然已經(jīng)是一個(gè)對象存儲(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同屬分布式對象存儲(chǔ)系統(tǒng),但RADOS提供的功能更為基礎(chǔ)、也更為豐富。這一點(diǎn)可以通過對比看出。
由于Swift和S3支持的API功能近似,這里以Swift舉例說明。Swift提供的API功能主要包括:
用戶管理操作:用戶認(rèn)證、獲取賬戶信息、列出容器列表等;
容器管理操作:創(chuàng)建/刪除容器、讀取容器信息、列出容器內(nèi)對象列表等;
對象管理操作:對象的寫入、讀取、復(fù)制、更新、刪除、訪問許可設(shè)置、元數(shù)據(jù)讀取或更新等。
由此可見,Swift(以及S3)提供的API所操作的“對象”只有三個(gè):用戶賬戶、用戶存儲(chǔ)數(shù)據(jù)對象的容器、數(shù)據(jù)對象。并且,所有的操作均不涉及存儲(chǔ)系統(tǒng) 的底層硬件或系統(tǒng)信息。不難看出,這樣的API設(shè)計(jì)完全是針對對象存儲(chǔ)應(yīng)用開發(fā)者和對象存儲(chǔ)應(yīng)用用戶的,并且假定其開發(fā)者和用戶關(guān)心的內(nèi)容更偏重于賬戶和數(shù)據(jù)的管理,而對底層存儲(chǔ)系統(tǒng)細(xì)節(jié)不感興趣,更不關(guān)心效率、性能等方面的深入優(yōu)化。
而librados API的設(shè)計(jì)思想則與此完全不同。一方面,librados中沒有賬戶、容器這樣的高層概念;另一方面,librados API向開發(fā)者開放了大量的RADOS狀態(tài)信息與配置參數(shù),允許開發(fā)者對RADOS系統(tǒng)以及其中存儲(chǔ)的對象的狀態(tài)進(jìn)行觀察,并強(qiáng)有力地對系統(tǒng)存儲(chǔ)策略進(jìn)行控制。換言之,通過調(diào)用librados API,應(yīng)用不僅能夠?qū)崿F(xiàn)對數(shù)據(jù)對象的操作,還能夠?qū)崿F(xiàn)對RADOS系統(tǒng)的管理和配置。這對于S3和Swift的RESTful API設(shè)計(jì)是不可想像的,也是沒有必要的。
基于上述分析對比,不難看出,librados事實(shí)上更適合對于系統(tǒng)有著深刻理解,同時(shí)對于功能定制擴(kuò)展和性能深度優(yōu)化有著強(qiáng)烈需求的高級用戶。基于librados的開發(fā)可能更適合于在私有Ceph系統(tǒng)上開發(fā)專用應(yīng)用,或者為基于Ceph的公有存儲(chǔ)系統(tǒng)開發(fā)后臺(tái)數(shù)據(jù)管理、處理應(yīng)用。而RADOS GW則更適合于常見的基于web的對象存儲(chǔ)應(yīng)用開發(fā),例如公有云上的對象存儲(chǔ)服務(wù)。
Ceph對象存儲(chǔ)特點(diǎn)
Ceph對象存儲(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級的數(shù)據(jù)。
高可用性
副本數(shù)可以靈活控制。
支持故障域分隔,數(shù)據(jù)強(qiáng)一致性。
多種故障場景自動(dòng)進(jìn)行修復(fù)自愈。
沒有單點(diǎn)故障,自動(dòng)管理。
高可擴(kuò)展性
去中心化。
擴(kuò)展靈活。
隨著節(jié)點(diǎn)增加而線性增長。
Ceph對象存儲(chǔ)架構(gòu)
對象存儲(chǔ)系統(tǒng)架構(gòu)圖如下:

如上圖所示,Ceph對象存儲(chǔ)底層主要有兩個(gè)基本組件實(shí)現(xiàn)
OSD
OSD,Ceph OSD 是由物理磁盤驅(qū)動(dòng)器、在其之上的 Linux 文件系統(tǒng)以及 Ceph OSD 服務(wù)組成。Ceph OSD 將數(shù)據(jù)以對象的形式存儲(chǔ)到集群中的每個(gè)節(jié)點(diǎn)的物理磁盤上,完成存儲(chǔ)數(shù)據(jù)的工作絕大多數(shù)是由 OSD daemon 進(jìn)程實(shí)現(xiàn),用于集群中所有數(shù)據(jù)與對象的存儲(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描述了對象塊存儲(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、對象數(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è)客戶端請求進(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ǔ)或者訪問的文件。對于一個(gè)基于Ceph開發(fā)的對象存儲(chǔ)應(yīng)用而言,這個(gè)file也就對應(yīng)于應(yīng)用中的“對象”,也就是用戶直接操作的“對象”。
Ojbect —— 此處的object是RADOS所看到的“對象”。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ǔ)。為避免混淆,在本文中將盡量避免使用中文的“對象”這一名詞,而直接使用file或object進(jìn)行說明。
PG(Placement Group)—— 顧名思義,PG的用途是對object的存儲(chǔ)進(jìn)行組織和位置映射。具體而言,一個(gè)PG負(fù)責(zé)組織若干個(gè)object(可以為數(shù)千個(gè)甚至更多),但一個(gè)object只能被映射到一個(gè)PG中,即,PG和object之間是“一對多”映射關(guān)系。同時(shí),一個(gè)PG會(huì)被映射到n個(gè)OSD上,而每個(gè)OSD上都會(huì)承載大量的PG,即,PG和OSD之間是“多對多”映射關(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è)的量級才有助于Ceph系統(tǒng)的設(shè)計(jì)發(fā)揮其應(yīng)有的優(yōu)勢。
Failure domain —— 這個(gè)概念在論文中并沒有進(jìn)行定義,好在對分布式存儲(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)一管理,提升效率的作用。相對整體集群規(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對file進(jìn)行切分,相當(dāng)于RAID中的條帶化過程。接著把Object映射到PG,在file被映射為一個(gè)或多個(gè)object之后,就需要將每個(gè)object獨(dú)立地映射到一個(gè)PG中去,計(jì)算object的Hash值并將結(jié)果和PG數(shù)目取余,以得到object對應(yīng)的PG編號。第三次映射就是使用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間是多對多的映射關(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ī)架的層級結(jié)構(gòu),OSD Map包含當(dāng)前所有Pool的狀態(tài)和所有OSD的狀態(tài)。
Crush Rules就是數(shù)據(jù)映射的策略,決定了每個(gè)數(shù)據(jù)對象有多少個(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ī)架的層級結(jié)構(gòu)。
CRUSH Rules:數(shù)據(jù)映射的策略。
層級化的Cluster Map
反映了存儲(chǔ)系統(tǒng)層級的物理拓?fù)浣Y(jié)構(gòu)。定義了OSD集群具有層級關(guān)系的 靜態(tài)拓?fù)浣Y(jié)構(gòu)。OSD層級使得 CRUSH算法在選擇OSD時(shí)實(shí)現(xiàn)了機(jī)架感知能力,也就是通過規(guī)則定義, 使得副本可以分布在不同的機(jī) 架、不同的機(jī)房中、提供數(shù)據(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,即版本號。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中)。因此,對于任意一個(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集群的物理層級關(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)都對應(yīng)一個(gè)隨機(jī)長度的straw,且擁有最長長度的straw會(huì)獲得勝利(被選中),添加或者重新計(jì)算,子樹之間的數(shù)據(jù)移動(dòng)提供最優(yōu)的解決方案。
CRUSH算法案例
說明:
集群中有部分sas和ssd磁盤,現(xiàn)在有個(gè)業(yè)務(wù)線性能及可用性優(yōu)先級高于其他業(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)式建?;蛘叱R?guī)方式分配。無論哪一個(gè)都可以取得完美的隨機(jī)過程。隨著 PG 的增加,差異就下降:對于每個(gè) OSD 100 個(gè) PG的情況下,標(biāo)準(zhǔn)差是 10%;對于1000 個(gè)的情況下為 3%。線性的分布策略極好地將負(fù)載在集群中平衡。但是簡單的哈希函數(shù)無法處理設(shè)備失效以及 OSD 變動(dòng)的情況。因?yàn)閿?shù)據(jù)通過 CRUSH 來進(jìn)行分配,如果哈希比較亂,那么在 PGs 較少的情況下,其吞吐會(huì)有所下降:因?yàn)?OSD 使用的差異變化大,那么會(huì)導(dǎo)致請求隊(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))(對于有 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ò)展、升級、替換。當(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級別。
系統(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對應(yīng)的OSD set中有一個(gè)OSD被標(biāo)記為down時(shí)(假如是Primary被標(biāo)記為down,則某個(gè)Replica會(huì)成為新的Primary,并處理所有讀寫 object請求),則該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對PG的所有objects的狀態(tài)達(dá)成一致),這個(gè)過程叫做Peering。
當(dāng)Peering過程完成之后,PG進(jìn) 入active+recoverying狀態(tài),Primary會(huì)遷移和同步那些降級的objects到所有的replicas上,保證這些objects 的副本數(shù)為N。
數(shù)據(jù)同步機(jī)制
PG同步機(jī)制介紹
在可擴(kuò)展的情形下,為了保證系統(tǒng)的可用性以及數(shù)據(jù)的安全,RADOS 通過可變的主復(fù)本復(fù)制技術(shù)來管理自己的數(shù)據(jù)復(fù)本,同時(shí)利用多個(gè)步驟來保證對性能的影響最小化。
數(shù)據(jù)是根據(jù) PGs 來復(fù)制的,每個(gè) PG 都影射到一個(gè)有序 n 路 OSD中(對于 n 路復(fù)制)??蛻舳藢⑺械膶懓l(fā)送到第一個(gè)未失效的 OSD 的對象 PG 中(主),然后賦給對象以及 PG 一個(gè)版本號,然后將寫轉(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所對應(yīng)OSD set的Primary發(fā)起讀寫請求,這保證了數(shù)據(jù)的強(qiáng)一致性。
由于每個(gè)Object都只有一個(gè)Primary OSD,因此對Object的更新都是順序的,不存在同步問題。
當(dāng)Primary收到Object的寫請求時(shí),它負(fù)責(zé)把數(shù)據(jù)發(fā)送給其他Replicas,只要這個(gè)數(shù)據(jù)被保存在所有的OSD上時(shí),Primary才應(yīng)答Object的寫請求,這保證了副本的一致性。另外client不需要負(fù)責(zé)副本的復(fù)制(由primary負(fù)責(zé)),這降低了client的網(wǎng)絡(luò)消耗。
故障遷移及恢復(fù)
故障遷移及恢復(fù)說明
由于 OSD 的失效,恢復(fù)以及部署新存儲(chǔ)設(shè)備,OSD 集群影射是會(huì)變化的。
Ceph 對這些變化的處理方式都是一樣的。為了快速恢復(fù),OSDs對每一個(gè) PG 的每一個(gè)對象以及最新的更新日志(名字以及更新版本,或者刪除的對象)都維護(hù)了一個(gè)版本號。當(dāng)活動(dòng)的 OSD 收到更新影射的消息,它將遍歷所有的存儲(chǔ)在本地的 PG,并計(jì)算 CRUSH 影射來確定其對哪一個(gè)負(fù)責(zé),是作為主還是做復(fù)本。
如果 PG 的成員有了變化,或者 OSD 剛剛啟動(dòng),那個(gè)這個(gè) OSD 必須與 PG 中的其他 OSD 建立連接端點(diǎn)。對于作為復(fù)本的 PGs,OSD 向主復(fù)本提供當(dāng)前PG 的版本號。如果主復(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è)備后,針對 PG 中對象的 IO才會(huì)被放行。之后,OSDs 將獨(dú)立負(fù)責(zé)從其他對端中取回丟失的數(shù)據(jù)以及更新過時(shí)的數(shù)據(jù)。
如果某個(gè) OSD 收到一個(gè)空白或者丟失的對象的請求,則會(huì)延遲處理,并將這個(gè)對像的恢復(fù)移動(dòng)到處理隊(duì)列的前部。例如,如果 osd1 崩潰了,并且被標(biāo)記為 Down 狀態(tài),osd2 成為 pgA 的主復(fù)本。這時(shí)如果 osd1 恢復(fù)了,在啟動(dòng)后它會(huì)請求最新的影射信息,監(jiān)控器也將其標(biāo)記為啟動(dòng)狀態(tài)。當(dāng) osd2 收到了最終的更新信息,則它會(huì)意識(shí)到自己不再是 pgA 的主復(fù)本,并發(fā)送 pgA 版本號到 osd1。此時(shí) osd1 將從 osd2 中取回 pgA 最新的更新日志記錄,并告訴 osd2 它的內(nèi)容才是最新的,當(dāng)所有對象的恢復(fù)完成后,osd1 才會(huì)處理其他的請求。
由于失效恢復(fù)完全由個(gè)個(gè)的 OSDs 來驅(qū)動(dòng),每個(gè)受失效 OSD 影響的 PG 對于替換的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目前處于降級狀態(tài)(即承載該P(yáng)G的OSD個(gè)數(shù)少于正常值,如正常應(yīng)該是3個(gè),此時(shí)只有2個(gè)或1個(gè)。這種情況通常是OSD故障所致),則其他OSD將把這個(gè)PG內(nèi)的所有對象和元數(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加入,降級的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ù)多副本??膳渲玫膒er-pool副本策略和故障域布局,支持強(qiáng)一致性。
沒有單點(diǎn)故障??梢匀淌茉S多種故障場景;防止腦裂;單個(gè)組件可以滾動(dòng)升級并在線替換。
所有故障的檢測和自動(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一開始只是對于機(jī)械盤進(jìn)行設(shè)計(jì)的,沒有專門針對ssd做優(yōu)化考慮,因此誕生的bluestore初衷就是為了減少寫放大,并針對ssd做優(yōu)化,而且直接管理裸盤,從理論上進(jìn)一步減少文件系統(tǒng)如ext4/xfs等部分的開銷.
BlueStore最早在Jewel版本中引入,用于取代傳統(tǒng)的fileStore,作為新一代高性能對象存儲(chǔ)后端。BlueStore在設(shè)計(jì)中充分考慮了對下一代全SSD以及全NVMe SSD閃存陣列的適配,例如將一直沿用至今,用于高效索引元數(shù)據(jù)的DB引擎由levelDB替換為RocksDB,(RocksDB基于LevelDB發(fā)展而來,并針對直接使用SSD作為后端存儲(chǔ)介質(zhì)的場景做了大量優(yōu)化)。FileStore因?yàn)槿匀恍枰ㄟ^操作系統(tǒng)自帶的本地文件系統(tǒng)間接管理磁盤,所以所有針對RADOS層的對象操作,都需要預(yù)先轉(zhuǎn)換為能夠被本地文件系統(tǒng)識(shí)別,符合POSIX語義的文件操作,這個(gè)轉(zhuǎn)換過程極其繁瑣,效率低下。
針對FileStore的上述缺陷,BlueStore選擇繞過本地文件系統(tǒng),由自身接管裸設(shè)備(例如磁盤),直接進(jìn)行對象操作,這是BlueStore能夠提升性能的根本原因。除此之外,考慮到元數(shù)據(jù)的索引效率對于性能有著致命影響,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對象存儲(chǔ)中的OSDs 可以分布在不同地域的數(shù)據(jù)中心,但是由于系統(tǒng)對文件對象存儲(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對象存儲(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ù)成本更高。