Ceph存儲集群由幾個不同的軟件守護進程組成,每個守護進程負責Ceph的一個獨特功能並將值添加到相應的組件中。每個守護進程彼此獨立。
Ceph的組件
-
RADOS(Reliable Autonomic Object Store,可靠、自動、分布式對象存儲)
RADOS是Ceph存儲集群的基礎。Ceph中的一切都以對象的形式存儲,RADOS就負責存儲這些對象,而不用考慮它們的數據類型。RADOS層確保數據一致性和可靠性。對於數據一致性,它執行數據復制、故障檢測和恢復,還包括數據在集群節點間的遷移和再平衡。
RADOS是Ceph存儲系統的核心,Ceph所有優秀特性都是有RADOS提供。Ceph的數據訪問方法(RBD、RGW、CephFS和librados)的所有操作都在RADOS層之上構建的。
-
跨集群存儲
當Ceph集群收到來自客戶端的寫請求時,CRUSH算法首先計算出存儲位置,以此決定將數據寫入什么地方,然后將這些信息傳遞到RADOS層進一步處理。基於CRUSH規則集,RADOS以小對象的形式將數據分發到集群內的所有節點。最后將這些對象存儲在OSD中。
-
可靠性
當配置的復制數大於1時,RADOS復制數據的可靠性。同時,他復制對象,創建副本,並將它們存儲在不同的故障區域中,同一個對象的副本不會存放在同一個故障區域。只要有足夠的設備,RADOS能夠保證一個RADOS集群中的對象副本不少於一個。
-
一致性
在對象不一致的情況下,RADOS將會利用剩下的副本執行恢復操作。
-
-
OSD(對象存儲設備)
應用程序訪問Ceph集群執行寫操作,數據將會以對象的形式存儲在OSD中。OSD是存儲實際用戶數據並響應客戶端讀操作的唯一組件。通常,一個OSD守護進程與集群的一個物理磁盤綁定,所以一般來說,OSD守護進程的個數和物理磁盤的個數是相等的。
-
讀寫操作
對於任何讀或者寫的操作,客戶端首先向monitor請求集群的map,然后,他們就可以直接與OSD進行I/O操作,不需要monitor的干預。正應為如此,Ceph的數據處理速度非常快。
-
Ceph的核心特性(可靠性、自平衡、自恢復和一致性)始於OSD
Ceph通過跨集群節點復制每個對象多次來提供可靠性。OSD上的每個對象都有一個主副本和幾個輔副本,輔副本分散在其他OSD上。存放輔副本的OSD受主副本OSD控制。
當磁盤發生故障時,Ceph的OSD守護進程會自動與其他OSD通信,開始執行恢復操作。這時候,存放故障磁盤對象的輔OSD會被提升為主OSD,同時,在恢復期間為對象生成新的輔副本。
-
Ceph OSD的文件系統
OSD由一個已經存在的Linux文件系統的物理磁盤驅動器和OSD服務組成。Linux文件系統決定它支持哪些擴展屬性。ext4文件系統限制了XTTRA的存儲容量,所以它不能給OSD文件系統提供足夠的XATTR信息的能力,Btrfs和XFS文件系統的XATTR存儲容量上的限額比較大。
-
Ceph OSD日志
在將數據提交的到備用存儲之前,Ceph先將數據寫入一個稱為日志的獨立存儲區域,日志是相同的磁盤或分區上的一小塊緩沖區大小的分區,甚至可以是一個文件。這種機制下,Ceph的所有寫都是先寫日志,再寫到備用存儲。
-
OSD命令
- 檢查單個節點上OSD的狀態
service ceph status osd
- 檢查整個集群的OSD的狀態,ceph.conf文件必須有所有OSD的所有信息(包括主機名)
service ceph -a status osd
- 檢查所有OSD的ID
ceph osd ls
- 檢查OSD map的狀態
ceph osd stat
- 檢查OSD樹形圖
ceph osd tree
-
-
MON(Ceph monitor)
MON組件通過一系列的map來跟蹤整個集群的健康狀態,有這幾個組件的map:OSD、MON、PG、MDS和CRUSH。所有的集群節點都向monitor節點報告狀態,並分享每一個狀態變化的信息。一個monitor為每一個組件維護一個獨立的map。monitor不存儲實際數據。
- monitor map:他維護着monitor節點間端到端的信息,其中包括Ceph集群ID、monitor主機名、IP地址和端口號。他還存儲當前map的創建版本和最后一次修改的信息。可以通過下面命令檢查集群的monitor map:
ceph mon dump
- OSD map:存儲集群ID、OSD map創建版本和最后一個次修改信息,以及與池有關的信息(如池名字、池ID、類型、副本數和歸置組)。還存儲着OSD的一些信息,如數目、狀態、權重、最近處於clean狀態的間隔以及OSD主機等信息。可以通過下面命令獲取集群的OSD map:
ceph osd dump
- PG map:存儲歸置組的版本、時間戳、最新的OSD版本、容量充滿的比例以及容量接近充滿的比例等信息。同事跟蹤每個歸置組的ID、對象數、狀態時間戳、OSD的up集合、OSD的acting集合和清洗等信息。執行下面命令檢查集群的PG map:
ceph pg dump
- CRUSH map:存儲集群的存儲設備信息。故障域層次結構和在故障域中定義如何存儲數據的規則。執行下面命令檢查集群的CRUSH map:
ceph osd crush dump
- MDS map:存儲當前MDS map版本、map的創建和修改時間、數據和元素池的ID、集群中MDS的數目以及MDS的狀態。執行下面命令檢查MDS map:
ceph mds dump
monitor是輕量級的守護進程,通常不需要大量的系統資源。擁有一般性能的CPU、內存和千兆網卡的便宜的入門級服務器足以滿足大多數的場景。monitor節點要有足夠的磁盤空間來存儲集群日志,包括OSD、MDS和monitor日志。
一個典型的Ceph集群通常包括多個monitor節點,生產環境下集群必須至少有三個monitor節點來提供高可用性。
-
monitor相關命令:
- 檢查monitor服務的狀態:
service ceph status mon 或 ceph mon stat 或 ceph mon_status 或 ceph mon dump
-
librados
librados庫目前支持PHP、Ruby、Java、Python、C和C++語言。它提供了Ceph存儲集群的一個本地接口RADOS,並且是RBD、RGW等服務的基礎,以及為CephFS提供POSIX接口。librados API支持直接訪問RADOS。
-
RBD(RADOS塊設備、Ceph塊設備)
RBD對外提供塊存儲,可以被映射、格式化進而像其他磁盤一樣掛載到服務器。
Linux支持內核RBD並通過librados映射Ceph塊設備,然后RADOS將Ceph塊設備的對象以分布式模式存儲在集群中。一旦Ceph塊設備映射到Linux主機,它可以當做裸分區或標記為文件系統,然后進行掛載。
RBD通過librbd庫來獲取RADOS的好處並提供高可靠、完全分布式和基於對象的塊存儲。當客戶想RBD寫入數據時,librbd庫將數據映射到對象進而存儲在Ceph集群中,刪除這些數據對象,並跨集群復制這些對象,從而提供更好的性能和可靠性。RADOS層之上的RBD層支持高效地更新對象。
-
RGW(RADOS網關、Ceph對象網關)
RGW提供了一個兼容Amazon S3和OpenStack對象存儲API(Swift)的restful API接口。RGW還支持多租戶和OpenStack的Keystone身份驗證服務。
RGW是一個代理,將HTTP請求轉換成RADOS,同時也可以將RADOS請求轉換為HTTP請求,從而提供RESTful對象存儲,兼容S3和Swift。Ceph對象存儲使用Ceph對象網關守護進程(radosgw)和(librgw)、librados交互。
-
MDS(Ceph元數據服務器)
MDS跟蹤文件層次結構並存儲只供CephFS使用的元數據。RBD和RGW不需要元數據,所以它們不需要MDS守護進程。MDS不直接給客戶端提供數據,數據通過OSD提供。
MDS作為一個守護進程運行,它允許客戶端掛載一個任意大小的POSIX文件系統。
-
CephFS(Ceph文件系統)
CephFS提供了一個任意大小並且兼容POSIX的分布式文件系統。CephFS依賴MDS來跟蹤文件層次結構。
Linux內核驅動程序支持libcephfs,因此用戶可以使用mount
命令實現掛載。ceph-fuse支持在用戶空間文件系統。CephFS還允許直接與應用程序交互,使用libcephfs庫直接訪問RADOS集群。