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