技術(shù)棧 | Ceph構(gòu)件及組件分析
Ceph存儲(chǔ)架構(gòu)
Ceph 存儲(chǔ)集群由幾個(gè)不同的daemon組成,每個(gè)daemon負(fù)責(zé)Ceph 的一個(gè)獨(dú)特功能并。每個(gè)守護(hù)進(jìn)程是彼此獨(dú)立的。
下面將簡(jiǎn)要介紹每個(gè)Ceph組件的功能:
RADOS(Reliable Autonomic Distributed Object Store, RADOS)
RADOS是Ceph 存儲(chǔ)集群的基礎(chǔ)。Ceph 中的一切都以對(duì)象的形式存儲(chǔ),而RADOS 就負(fù)責(zé)存儲(chǔ)這些對(duì)象,而不考慮它們的數(shù)據(jù)類型。RADOS 層確保數(shù)據(jù)一致性和可靠性。對(duì)于數(shù)據(jù)一致性,它執(zhí)行數(shù)據(jù)復(fù)制、故障檢測(cè)和恢復(fù)。還包括數(shù)據(jù)在集群節(jié)點(diǎn)間的recovery。
OSD
實(shí)際存儲(chǔ)數(shù)據(jù)的進(jìn)程。通常一個(gè)OSD daemon綁定一個(gè)物理磁盤。Client write/read 數(shù)據(jù)最終都會(huì)走到OSD去執(zhí)行write/read操作。
MON(monitor)
Monitor在Ceph集群中扮演者管理者的角色,維護(hù)了整個(gè)集群的狀態(tài),是Ceph集群中最重要的組件。
Mon保證集群的相關(guān)組件在同一時(shí)刻能夠達(dá)成一致,相當(dāng)于集群的領(lǐng)導(dǎo)層,負(fù)責(zé)收集、更新和發(fā)布集群信息。為了規(guī)避單點(diǎn)故障,在實(shí)際的Ceph部署環(huán)境中會(huì)部署多個(gè)Mon,同樣會(huì)引來多個(gè)Mon之前如何協(xié)同工作的問題。在一個(gè)標(biāo)準(zhǔn)的Ceph環(huán)境中,Monitor的功能可以分為以下兩點(diǎn)
- 管好自己
多個(gè)monitor之間如何協(xié)同工作,怎么同步數(shù)據(jù);
- 管理集群信息
數(shù)據(jù)的存儲(chǔ),保證數(shù)據(jù)存儲(chǔ)的正確性等等。
Librados
簡(jiǎn)化訪問RADOS的一種方法,目前支持PHP、Ruby、Java、Python、C和C++語言。它提供了Ceph 存儲(chǔ)集群的一個(gè)本地接口RADOS ,并且是其他服務(wù)(如RBD 、RGW) 的基礎(chǔ),以及為CephFS 提供POSIX 接口。librados API 支持直接訪問RADOS ,使得開發(fā)者能夠創(chuàng)建自己的接口來訪問Ceph 集群存儲(chǔ)。
RBD
Ceph塊設(shè)備。對(duì)外提供塊存儲(chǔ)??梢韵翊疟P一樣被映射、格式化已經(jīng)掛載到服務(wù)器上。支持snapshot。
RGW
Ceph對(duì)象網(wǎng)關(guān),提供了一個(gè)兼容S3和Swift的restful API接口。RGW還支持多租戶和Openstack的keyston身份驗(yàn)證服務(wù)。
MDS
Ceph元數(shù)據(jù)服務(wù)器,跟蹤文件層次結(jié)構(gòu)并存儲(chǔ)只供CephFS使用的元數(shù)據(jù)。Ceph塊設(shè)備和RADOS網(wǎng)關(guān)不需要元數(shù)據(jù)。MDS不直接給client提供數(shù)據(jù)服務(wù)。
CephFS
提供了一個(gè)任意大小且兼容POSlX的分布式文件系統(tǒng)。CephFS 依賴Ceph MDS 來跟蹤文件層次結(jié)構(gòu),即元數(shù)據(jù)。
Ceph RADOS
RADOS 是Ceph 存儲(chǔ)系統(tǒng)的核心,也稱為Ceph 存儲(chǔ)集群。Ceph 的所有優(yōu)秀特性都是由RADOS 提供的,包括分布式對(duì)象存儲(chǔ)、高可用性、高可靠性、沒有單點(diǎn)故障、向我修復(fù)以及自我管理等。RADOS 層在Ceph 存儲(chǔ)架構(gòu)中扮演著舉足輕重的角色。Ceph 的數(shù)據(jù)訪問方法(如RBD 、CephFS 、RADOS GW 和librados ) 的所有操作都是在RADOS 層之上構(gòu)建的。
當(dāng)Ceph 集群接收到來向客戶端的寫請(qǐng)求時(shí),CRUSH 算法首先計(jì)算出存儲(chǔ)位置,以此決定應(yīng)該將數(shù)據(jù)寫入什么地方。然后這些信息傳遞到隊(duì)DOS 層進(jìn)行進(jìn)一步處理?;贑RUSH 規(guī)則集,RADOS 以小對(duì)象的形式將數(shù)據(jù)分發(fā)到集群內(nèi)的所有節(jié)點(diǎn)。最后,將這些對(duì)象存儲(chǔ)在OSD 中。
當(dāng)配置的復(fù)制數(shù)大于1時(shí),隊(duì)DOS 負(fù)責(zé)數(shù)據(jù)的可靠性。同時(shí),它復(fù)制對(duì)象,創(chuàng)建副本,并將它們存儲(chǔ)在不同的故障區(qū)域中,換言之,同一個(gè)對(duì)象的副本不會(huì)存放在同一個(gè)故障區(qū)域中。然而,如果有更多個(gè)性化需求和更高的可靠性,就需要根據(jù)實(shí)際需求和基礎(chǔ)架構(gòu)來優(yōu)化CRUSH 規(guī)則集。RADOS 能夠保證在一個(gè)RADOS 集群中的對(duì)象副本總是不少于一個(gè),只要你有足夠的設(shè)備。
除了跨集群存儲(chǔ)和復(fù)制對(duì)象之外,RADOS 也確保對(duì)象狀態(tài)的一致性。在對(duì)象不一致的情況下,將會(huì)利用剩下的副本執(zhí)行恢復(fù)操作。這個(gè)操作自動(dòng)執(zhí)行,對(duì)于用戶而言是透明的,從而為Ceph 提供了自我管理和自我修復(fù)的能力。如果仔細(xì)分析Ceph 的架構(gòu)圖,你會(huì)發(fā)現(xiàn)它有兩部分: RADOS 在最下部,它完全處于Ceph集群的內(nèi)部,沒有提供給客戶端直接接口;另一部分就是在RADOS 之上的面向所有客戶端的接口。
Ceph 對(duì)象存儲(chǔ)設(shè)備
Ceph 的OSD 是Ceph 存儲(chǔ)集群中最重要的一個(gè)基礎(chǔ)組件,它負(fù)責(zé)將實(shí)際的數(shù)據(jù)以對(duì)象的形式存儲(chǔ)在每一個(gè)集群節(jié)點(diǎn)的物理磁盤驅(qū)動(dòng)器中。Ceph 集群中的大部分工作是由OSD 守護(hù)進(jìn)程完成的。存儲(chǔ)用戶數(shù)據(jù)是真正最耗時(shí)的部分。
Ceph OSD 以對(duì)象的形式存儲(chǔ)所有客戶端數(shù)據(jù),并在客戶端發(fā)起數(shù)據(jù)請(qǐng)求時(shí)提供相同的數(shù)據(jù)。Ceph 集群包含多個(gè)OSD 。對(duì)于任何讀或?qū)懖僮?,客戶端首先向monitor 請(qǐng)求集群的map ,然后,它們就可以無須monitor 的干預(yù)直接與OSD 進(jìn)行I/O操作也正是因?yàn)楫a(chǎn)生數(shù)據(jù)的客戶端能夠直接寫入存儲(chǔ)數(shù)據(jù)的OSD 而沒有任何額外的數(shù)據(jù)處理層,才使得數(shù)據(jù)事務(wù)處理速度如此之快。與其他存儲(chǔ)解決方案相比,這種類型的數(shù)據(jù)存儲(chǔ)和取回機(jī)制是Ceph 所獨(dú)有的。
Ceph 的核心特性(比如可靠性、自平衡、自恢復(fù)和一致性)都始于OSD 。根據(jù)配置的副本數(shù), Ceph通過跨集群節(jié)點(diǎn)復(fù)制每個(gè)對(duì)象多次來提供可靠性,同時(shí)使其具有高可用性容錯(cuò)性。OSD 上的每個(gè)對(duì)象都有一個(gè)主副本和幾個(gè)輔副本,輔副本分散在其他OSD 上。由于Ceph 是一個(gè)分布式系統(tǒng)且對(duì)象分布在多個(gè)OSD 上,因此每一個(gè)OSD 對(duì)于一些對(duì)象而言是主副本。但同時(shí)對(duì)于其他對(duì)象而言就是輔副本,存放輔副本的OSD 受主副本OSD 控制;然而,它們也可能又成為主副本OSD 。
Ceph的OSD由一個(gè)已經(jīng)存在Linux 文件系統(tǒng)的物理磁盤驅(qū)動(dòng)器和10SD 服務(wù)組成。
Linux文件系統(tǒng)對(duì)于OSD 守護(hù)進(jìn)程而言是相當(dāng)重要的,因?yàn)樗鼪Q定了支持哪些擴(kuò)展屬性( XATTR) 。這些文件系統(tǒng)擴(kuò)展屬性能夠?yàn)镺SD 守護(hù)進(jìn)程提供內(nèi)部對(duì)象的狀態(tài)、快照、元數(shù)據(jù)和ACL 等信息.這有助于數(shù)據(jù)管理。
OSD在擁有有效Linux 分區(qū)的物理磁盤驅(qū)動(dòng)器上進(jìn)行操作。Linux 分區(qū)可以是Btrfs (B樹文件系統(tǒng))、XFS 或ext4。Ceph 集群的性能基準(zhǔn)測(cè)試的主要標(biāo)準(zhǔn)之一就是文件系統(tǒng)的選擇。
Btrfs
與使用XFS 和ext4 文件系統(tǒng)的OSD 相比,使用Btrfs 文件系統(tǒng)的OSD 能夠提供更佳的性能。使用Btrfs 最主要的一個(gè)優(yōu)點(diǎn)是支持寫時(shí)復(fù)制和可寫的快照,這對(duì)于慮擬機(jī)的部署和克隆非常有用。在文件系統(tǒng)中它還支持透明的壓縮、普遍的校驗(yàn)和多設(shè)備的統(tǒng)一管理。還支持高效的XATTR 、對(duì)于小文件的合井,還有SSD上所熟知的集成卷管理,并支持在線fsck 的特性。然而,盡管有如此多的新特性,Btrfs 目前還不具備應(yīng)用于生產(chǎn)系統(tǒng)的條件,但對(duì)于測(cè)試而言它是一個(gè)很好的選擇。
XFS
這是一個(gè)可靠、成熟且非常穩(wěn)定的文件系統(tǒng),因此,我們推薦在生產(chǎn)環(huán)境的Ceph 集群中使用它。XFS 是Ceph存儲(chǔ)中最常用的文件系統(tǒng).也是推薦OSD 使用的文件系統(tǒng)。然而,從另一個(gè)方面來看,XFS 又不如Btrfs。XFS 在元數(shù)據(jù)擴(kuò)展性上存在性能問題,XFS 也是一種日志文件系統(tǒng), 也就是說.每次客戶端發(fā)送數(shù)據(jù)以寫入Ceph 集群時(shí),肯先需要寫人口志空間,然后再寫入XFS 文件系統(tǒng)這樣的兩次寫入操作增加了開銷從而使得XFS 的性能不如Btrfs,Btrfs 沒有使用日志。
Ext4
ext4 文件系統(tǒng)也是一種日志文件系統(tǒng),是一個(gè)遠(yuǎn)合生產(chǎn)環(huán)境下Ceph OSD 使用的文件系統(tǒng);然而,它的受歡迎程度不如XFS 。從性能的角度來看,ext4 文件系統(tǒng)也不如Btrfs。
Ceph OSD 使用諸如Btrfs 和XFS 的日志文件系統(tǒng)。在將數(shù)據(jù)提交到備用存儲(chǔ)之前,Ceph 首先將數(shù)據(jù)寫入一個(gè)稱為日志( journal) 的獨(dú)立存儲(chǔ)區(qū)域,日志是相同的機(jī)械磁盤(如OSD) 或不同的SSD 磁盤或分區(qū)上一小塊緩沖區(qū)大小的分區(qū),甚至也可以是文件系統(tǒng)上的一個(gè)文件。在這種機(jī)制中,Ceph 的所有寫都是先到日志,然后再到備用存儲(chǔ),如下圖所示。
Ceph Monitor
顧名思義,Ceph monitor 負(fù)責(zé)監(jiān)控整個(gè)集群的健康狀況。它們以守護(hù)進(jìn)程的形式存在,這些守護(hù)進(jìn)程通過存儲(chǔ)集群的關(guān)鍵信息來維護(hù)集群成員狀態(tài)、對(duì)等節(jié)點(diǎn)狀態(tài),以及集群配置信息。Ceph monitor 通過維護(hù)整個(gè)集群狀態(tài)的主副本來完成它的任務(wù)。集群map 包括monitor 、OSD 、PG 、CRUSH 和MDS map o 所有這些map 統(tǒng)稱為集群map 。讓我們簡(jiǎn)單地瀏覽一下每個(gè)map 的功能。
monitor map
它維護(hù)著monitor 節(jié)點(diǎn)間端到端的信息,其中包括Ceph 集群ID 、monitor 主機(jī)名、IP 地址及端口號(hào)。它還存儲(chǔ)著當(dāng)前map 的創(chuàng)建版本和最后一次修改的信息??梢酝ㄟ^下面的命令檢查集群的monitor map:
- # ceph mon dump
OSD map :
它存儲(chǔ)著一些常見的信息,如集群ID、OSD map 創(chuàng)建版本和最后一次修改信息,以及與池相關(guān)的信息(如池名字、池ID 、類型、副本數(shù)和歸置組) 。它還存儲(chǔ)著OSD 的一些信息,如數(shù)目、狀態(tài)、權(quán)重、最近處于clean 狀態(tài)的間隔以及OSD 主機(jī)等信息??梢酝ㄟ^執(zhí)行以下命令獲取集群的OSD map:
- # ceph osd dump
PG map :
它存儲(chǔ)著歸置組的版本、時(shí)間戳、最新的OSD map 版本、容量充滿的比例以及容量接近充滿的比例等信息。它同時(shí)也跟蹤每個(gè)歸置組的ID 、對(duì)象數(shù)、狀態(tài)狀態(tài)時(shí)間戳、OSD 的叩集合、OSD 的acting 集合,最后還有清洗等信息。要檢查集群的PG map ,執(zhí)行:
- # ceph pg dump
CRUSH map:
它存儲(chǔ)著集群的存儲(chǔ)設(shè)備信息、故障域?qū)哟谓Y(jié)構(gòu)以及在故障域中定義如何存儲(chǔ)數(shù)據(jù)的規(guī)則。要查看集群的CRUSH map ,執(zhí)行:
- # ceph osd crush dump
MDS map:
它存儲(chǔ)著當(dāng)前MDS map 的版本,map 的創(chuàng)建和修改時(shí)間,數(shù)據(jù)和元數(shù)據(jù)池的ID ,集群中MDS 的數(shù)目以及MDS 的狀態(tài)。要查看集群MDS map ,執(zhí)行:
- # ceph mds dump
一個(gè)典型的Ceph 集群通常包含多個(gè)monitor 節(jié)點(diǎn)。多monitor 的Ceph 架構(gòu)使用了仲
裁( quorum ) ,使用Paxos 算法為集群提供了分布式?jīng)Q策機(jī)制。集群中monitor 數(shù)目應(yīng)該是奇數(shù),最低要求是一個(gè)monitor 節(jié)點(diǎn),推薦的數(shù)是3 。自monitor開始仲裁操作,至少需要保證一半以上的monitor 始終處于可用狀態(tài),這樣才可以防止其他系統(tǒng)可以看到的腦裂問題。
這就是為什么推薦使用奇數(shù)個(gè)monitor。在所有的集群monitor 巾,其中有一個(gè)是領(lǐng)導(dǎo)者( leader ) 。如果領(lǐng)導(dǎo)者monitor不可用其他monitor 節(jié)點(diǎn)也有權(quán)成為領(lǐng)導(dǎo)者。生產(chǎn)環(huán)境下的集群必須至少有三個(gè)monitor節(jié)點(diǎn)來提供高可用性。
對(duì)于企業(yè)級(jí)生產(chǎn)環(huán)境,建議使用專門的monitor 節(jié)點(diǎn)。這樣, 一旦你的OSD 節(jié)點(diǎn)發(fā)生
故障,只要你有足夠的monitor 運(yùn)行在獨(dú)立的機(jī)器上,你仍然可以連接到你的Ceph 集群。在存儲(chǔ)的規(guī)劃階段,也應(yīng)該考慮物理機(jī)架的布局。你應(yīng)該將monitor節(jié)點(diǎn)分散到所有的故障域中,例如,不同的開關(guān)、電源和物理機(jī)架。如果你有多個(gè)數(shù)據(jù)中心連接在同一個(gè)高速網(wǎng)絡(luò),monitor 節(jié)點(diǎn)應(yīng)該放到不同的數(shù)據(jù)中心。
Ceph塊存儲(chǔ)
塊存儲(chǔ)是企業(yè)環(huán)境中最常見的一種數(shù)據(jù)存儲(chǔ)格式。Ceph 塊設(shè)備也稱為RADOS 塊設(shè)備(RBD) ;它為物理層的虛擬機(jī)監(jiān)控程序以及虛擬機(jī)提供塊存儲(chǔ)解決方案。Ceph 的RBD 驅(qū)動(dòng)程序已經(jīng)被集成到Linux 內(nèi)核( 2.6.39 或更高版本)中,而且已經(jīng)被QEMU/KVM 支持,它們能無縫地訪問Ceph 塊設(shè)備。
Linux主機(jī)能全力支持內(nèi)核RBD (KRB D ) 并通過librados 映射Ceph 塊設(shè)備。然后RADOS將Ceph 塊設(shè)備的對(duì)象以分布式模式存儲(chǔ)在集群中。一旦Ceph 塊設(shè)備映射到Linux主機(jī),它也可以當(dāng)作裸分區(qū)或標(biāo)記為文件系統(tǒng),然后進(jìn)行掛載。
Ceph對(duì)象網(wǎng)關(guān)
Ceph 對(duì)象網(wǎng)關(guān),也稱做RADOS 網(wǎng)關(guān),它是一個(gè)代理,可以將HTTP 請(qǐng)求轉(zhuǎn)換為RADOS ,同時(shí)也可以把RADOS 請(qǐng)求轉(zhuǎn)換為HTTP 請(qǐng)求,從而提供RESTful 對(duì)象存儲(chǔ),這兼容S3 和Swift。Ceph 對(duì)象存儲(chǔ)使用Ceph 對(duì)象網(wǎng)關(guān)守護(hù)進(jìn)程( radosgw) 與librgw 、librados (Ceph 集群)交互。這是使用libfcgi 作為FastCGI的一個(gè)模塊來實(shí)現(xiàn)的,并且可以被任何支持FastCGl的Web 服務(wù)器使用。
Ceph文件系統(tǒng)
CephFS 在RADOS 層之上提供了一個(gè)兼容POSIX 的文件系統(tǒng)。它使用MDS 作為守護(hù)進(jìn)程,負(fù)責(zé)管理其元數(shù)據(jù)并將它和其他數(shù)據(jù)分開,這有助于降低復(fù)雜性并提高可靠性。CephFS 繼承了RADOS 的特性并為數(shù)據(jù)提供了動(dòng)態(tài)再平衡。
以上是對(duì)Ceph的架構(gòu)和組件做了一些介紹,后續(xù)我們將對(duì)里面的技術(shù)細(xì)節(jié)進(jìn)行詳細(xì)的討論。