簡介
- Ceph是一個可靠地、自動重均衡、自動恢復的分布式存儲系統,根據場景划分可以將Ceph分為三大塊,分別是對象存儲、塊設備存儲和文件系統服務。
- 在虛擬化領域里,比較常用到的是Ceph的塊設備存儲,比如在OpenStack項目里,Ceph的塊設備存儲可以對接OpenStack的cinder后端存儲、Glance的鏡像存儲和虛擬機的數據存儲。
- 比較直觀的是Ceph集群可以提供一個raw格式的塊存儲來作為虛擬機實例的硬盤。
- 與其他存儲相比的優勢:
- 充分利用了存儲節點上的計算能力
- 在存儲每一個數據時,都會通過計算得出該數據存儲的位置,盡量將數據分布均衡。
- 不存在傳統的單點故障的問題,且隨着規模的擴大性能並不會受到影響。
- 采用了CRUSH算法、HASH環等方法。
- 充分利用了存儲節點上的計算能力
核心組件
- Ceph OSD(Object Storage Device):
- 主要功能是存儲數據、復制數據、平衡數據、恢復數據等,與其它OSD間進行心跳檢查等,並將一些變化情況上報給Ceph Monitor。
- 一般情況下一塊硬盤對應一個OSD,由OSD來對硬盤存儲進行管理,當然一個分區也可以成為一個OSD。
- Ceph OSD的架構實現由物理磁盤驅動器、Linux文件系統和Ceph OSD服務組成。
- 對於Ceph OSD Deamon而言,Linux文件系統顯性的支持了其拓展性,一般Linux文件系統有好幾種,比如有BTRFS、XFS、Ext4等,BTRFS。
- 雖然它們有很多優點特性,但現在還沒達到生產環境所需的穩定性,一般比較推薦使用XFS。
- 一般寫數據到Ceph集群時,都是先將數據寫入到Journal盤中,然后每隔一段時間比如5秒再將Journal盤中的數據刷新到文件系統中。
- 一般為了使讀寫時延更小,Journal盤都是采用SSD,一般分配10G以上,當然分配多點那是更好。
- Ceph中引入Journal盤的概念是因為Journal允許Ceph OSD功能很快做小的寫操作。
- 一個隨機寫入首先寫入在上一個連續類型的journal,然后刷新到文件系統。
- 這給了文件系統足夠的時間來合並寫入磁盤,一般情況下使用SSD作為OSD的journal可以有效緩沖突發負載。
- Ceph Moniter
- 是一個監視器,負責監視Ceph集群,維護Ceph集群的健康狀態,同時維護着Ceph集群中的各種Map圖,比如OSD Map、Monitor Map、PG Map和CRUSH Map。
- 這些Map統稱為Cluster Map,Cluster Map是RADOS的關鍵數據結構,管理集群中的所有成員、關系、屬性等信息以及數據的分發。
- 比如當用戶需要存儲數據到Ceph集群時,OSD需要先通過Monitor獲取最新的Map圖,然后根據Map圖和object id等計算出數據最終存儲的位置。
- Ceph MDS(MetaData Server)
- 主要保存的文件系統服務的元數據,但對象存儲和塊存儲設備是不需要使用該服務的。
- 查看各種Map的信息: ceph osd(mon、pg) dump
基礎架構組件
-
組件圖
-
Rados
- 是一個完整的分布式對象存儲系統,它具有可靠、智能、分布式等特性。
- Ceph的高可靠、高可拓展、高性能、高自動化都是由這一層來提供的
- 用戶數據的存儲最終也都是通過這一層來進行存儲的,RADOS可以說就是Ceph的核心。
-
LibRados
- 是一個庫,它允許應用程序通過訪問該庫來與RADOS系統進行交互,支持多種編程語言,比如C、C++、Python等。
-
RadosSGW
- 一套基於當前流行的RESTFUL協議的網關,並且兼容Amazon S3和Swift。
-
RBD(Reliable Distributed Block)
- 通過Linux內核客戶端和QEMU/KVM驅動來提供一個分布式的塊設備。
-
Ceph Fs(File System)
- 通過Linux內核客戶端和FUSE來提供一個兼容POSIX的文件系統
數據分布算法
-
在分布式存儲系統中比較關注的一點是如何使得數據能夠分布得更加均衡,常見的數據分布算法有一致性Hash和Ceph的Crush算法。
-
Ceph是為大規模分布式存儲而設計的,數據分布算法必須能夠滿足在大規模的集群下數據依然能夠快速的准確的計算存放位置,同時能夠在硬件故障或擴展硬件設備時做到盡可能小的數據遷移。
-
Crush是一種偽隨機的控制數據分布、復制的算法。它就是精心為這些特性設計的,可以說CRUSH算法也是Ceph的核心之一。
-
基本概念理解:
-
存儲數據與object的關系
- 當用戶要將數據存儲到Ceph集群時,存儲數據都會被分割成多個object,每個object都有一個object id,每個object的大小是可以設置的,默認是4MB,object可以看成是Ceph存儲的最小存儲單元。
-
object與pg的關系
- 由於object的數量很多,所以Ceph引入了pg的概念用於管理object,每個object最后都會通過CRUSH計算映射到某個pg中,一個pg可以包含多個object。
-
pg與osd的關系
- pg也需要通過CRUSH計算映射到osd中去存儲,如果是二副本的,則每個pg都會映射到二個osd,比如[osd.1,osd.2],那么osd.1是存放該pg的主副本,osd.2是存放該pg的從副本,保證了數據的冗余。
-
pg和pgp的關系
- pg是用來存放object的,pgp相當於是pg存放osd的一種排列組合。
- PG是指定存儲池存儲對象的目錄有多少個,PGP是存儲池PG的OSD分布組合個數
- PG的增加會引起PG內的數據進行分裂,分裂相同的OSD上新生成的PG當中
- PGP的增加會引起部分PG的分布進行變化,但是不會引起PG內對象的變動
-
pg和pool的關系
- pool也是一個邏輯存儲概念,我們創建存儲池pool的時候,都需要指定pg和pgp的數量,邏輯上來說pg是屬於某個存儲池的,就有點像object是屬於某個pg的。
-
存儲數據, object, pg, pool, osd, 存儲磁盤的關系
-
-
本質上CRUSH算法是根據存儲設備的權重來計算數據對象的分布的。
- 權重的設計可以根據該磁盤的容量和讀寫速度來設置,比如根據容量大小可以將1T的硬盤設備權重設為1,2T的就設為2。
- 在計算過程中,CRUSH是根據Cluster Map、數據分布策略和一個隨機數共同決定數組最終的存儲位置的。
-
Cluster Map里的內容信息包括存儲集群中可用的存儲資源及其相互之間的空間層次關系
- 比如集群中有多少個支架,每個支架中有多少個服務器,每個服務器有多少塊磁盤用以OSD等
-
數據分布策略是指可以通過Ceph管理者通過配置信息指定數據分布的一些特點
- 比如管理者配置的故障域是Host,也就意味着當有一台Host起不來時,數據能夠不丟失
- CRUSH可以通過將每個pg的主從副本分別存放在不同Host的OSD上即可達到,不單單可以指定Host,還可以指定機架等故障域
- 除了故障域,還有選擇數據冗余的方式,比如副本數或糾刪碼
-
CRUSH計算表達式簡單表示:
CRUSH(x) -> (osd.1, osd.2......osd.n)
- X為隨機數