CEPH簡介
- 不管你是想為雲平台提供Ceph 對象存儲和/或 Ceph 塊設備(下一篇介紹其差別),還是想部署一個 Ceph 文件系統或者把 Ceph 作為他用,所有 Ceph 存儲集群的部署都始於部署一個個 Ceph 節點、網絡和 Ceph 存儲集群。 Ceph 存儲集群至少需要一個 Ceph Monitor 和兩個 OSD 守護進程。而運行 Ceph 文件系統客戶端時,則必須要有元數據服務器( Metadata Server )。
- 所有 Ceph 部署都始於 Ceph 存儲集群。基於 RADOS(什么是RADOS) 的 Ceph 對象存儲集群包括兩類守護進程:term:對象存儲守護進程( OSD )把存儲節點上的數據存儲為對象; term:Ceph 監視器( MON )維護集群運行圖的主拷貝。一個 Ceph 集群可以包含數千個存儲節點,最簡系統至少需要一個監視器和兩個 OSD 才能做到數據復制。
- 某種意義上,RADOS也可以理解為等同於CEPH,他是CEPH中的一個核心子項目,同樣實現了分布式存儲系統。RADOS即Reliable, Autonomic Distributed Object Store,RADOS將文件映射到Objects后利用Cluster Map通過CRUSH計算而不是查找表方式定位文件數據在存儲設備中的位置。省去了傳統的File到Block的映射和BlockMap管理。
CEPH存儲集群
Ceph 存儲集群包含兩種類型的守護進程:
- Ceph 監視器
- Ceph OSD 守護進程
Ceph 監視器維護着集群運行圖的主副本。一個監視器集群確保了當某個監視器失效時的高可用性。存儲集群客戶端向 Ceph 監視器索取集群運行圖的最新副本。
Ceph OSD 守護進程檢查自身狀態、以及其它 OSD 的狀態,並報告給監視器們。
存儲集群的客戶端和各個Ceph OSD 守護進程使用 CRUSH 算法高效地計算數據位置,而不是依賴於一個中心化的查詢表。它的高級功能包括:基於 librados的原生存儲接口、和多種基於 librados 的服務接口。
CEPH OSDs
Ceph OSD 守護進程( Ceph OSD )的功能是存儲數據,處理數據的復制、恢復、回填、再均衡,並通過檢查其他OSD 守護進程的心跳來向 Ceph Monitors 提供一些監控信息。當 Ceph 存儲集群設定為有2個副本時,至少需要2個 OSD 守護進程,集群才能達到 active+clean 狀態( Ceph 默認有3個副本,但你可以調整副本數)。
CEPH Monitors
Ceph Monitor維護着展示集群狀態的各種圖表,包括監視器圖、 OSD 圖、歸置組( PG )圖、和 CRUSH 圖。 Ceph 保存着發生在Monitors 、 OSD 和 PG上的每一次狀態變更的歷史信息(稱為 epoch )。
CEPH MDSs
Ceph 元數據服務器( MDS )為 Ceph 文件系統存儲元數據(也就是說,Ceph 塊設備和 Ceph 對象存儲不使用MDS )。元數據服務器使得 POSIX 文件系統的用戶們,可以在不對 Ceph 存儲集群造成負擔的前提下,執行諸如 ls、find 等基本命令。
CEPH 文件系統
Ceph 文件系統( Ceph FS )是個 POSIX 兼容的文件系統,它使用 Ceph 存儲集群來存儲數據。 Ceph 文件系統與 Ceph 塊設備、同時提供 S3 和 Swift API 的 Ceph 對象存儲、或者原生庫( librados )一樣,都使用着相同的 Ceph 存儲集群系統。
- 要運行 Ceph 文件系統,你必須先裝起至少帶一個 Ceph 元數據服務器的 Ceph 存儲集群。
- 一旦有了健康的 Ceph 存儲集群,及其配套的元數據服務器,你就可以創建並掛載自己的 Ceph 文件系統了。首先確認下你的客戶端的網絡連通性和認證密鑰。
CEPH 塊設備
塊是一個字節序列(例如,一個 512 字節的數據塊)。基於塊的存儲接口是最常見的存儲數據方法,它們基於旋轉介質,像硬盤、 CD 、軟盤、甚至傳統的 9 磁道磁帶。無處不在的塊設備接口使虛擬塊設備成為與 Ceph 這樣的海量存儲系統交互的理想之選。
Ceph 塊設備是精簡配置的、大小可調且將數據條帶化存儲到集群內的多個 OSD 。 Ceph 塊設備利用 RADOS 的多種能力,如快照、復制和一致性。 Ceph 的 RADOS 塊設備( RBD )使用內核模塊或 librbd 庫與 OSD 交互。
Ceph 塊設備靠無限伸縮性提供了高性能,如向內核模塊、或向 abbr:KVM (kernel virtual machines) (如 Qemu 、 OpenStack 和 CloudStack 等雲計算系統通過 libvirt 和 Qemu 可與 Ceph 塊設備集成)。你可以用同一個集群同時運行 Ceph RADOS 網關、 Ceph FS 文件系統、和 Ceph 塊設備。
RBD不在項目中應用,所以也沒有深入探究,有涉及的時候再繼續深究。
CEPH 對象網關
CEPH對象網關是一個構建在 librados 之上的對象存儲接口,它為應用程序訪問Ceph 存儲集群提供了一個 RESTful 風格的網關 。支持 2 種接口:
- 兼容S3: 提供了對象存儲接口,兼容 亞馬遜S3 RESTful 接口的一個大子集。
- 兼容Swift: 提供了對象存儲接口,兼容 Openstack Swift 接口的一個大子集。
Ceph 對象存儲使用 Ceph 對象網關守護進程( radosgw ),它是個與 Ceph 存儲集群交互的 FastCGI 模塊。因為它提供了與 OpenStack Swift 和 Amazon S3 兼容的接口, RADOS 要有它自己的用戶管理。 Ceph 對象網關可與 Ceph FS 客戶端或 Ceph 塊設備客戶端共用一個存儲集群。 S3 和 Swift 接口共用一個通用命名空間,所以你可以用一個接口寫如數據、然后用另一個接口取出數據。
CEPH CRUSH(重要)
- Ceph 消除了集中網關,允許客戶端直接和 Ceph OSD 守護進程通訊。 Ceph OSD 守護進程自動在其它 Ceph 節點上創建對象副本來確保數據安全和高可用性;為保證高可用性,監視器也實現了集群化。為消除中心節點, Ceph 使用了 CRUSH 算法。
- Ceph 客戶端和 OSD 守護進程都用 CRUSH 算法來計算對象的位置信息,而不是依賴於一個中心化的查詢表。與以往方法相比, CRUSH 的數據管理機制更好,它很干脆地把工作分配給集群內的所有客戶端和 OSD 來處理,因此具有極大的伸縮性。 CRUSH 用智能數據復制確保彈性,更能適應超大規模存儲。
CEPH 集群運行圖
Ceph 依賴於 Ceph 客戶端和 OSD ,因為它們知道集群的拓撲,這個拓撲由 5 張圖共同描述,統稱為“集群運行圖”:
- Montior Map: 包含集群的 fsid 、位置、名字、地址和端口,也包括當前版本、創建時間、最近修改時間。要查看監視器圖,用 ceph mon dump 命令。
- OSD Map: 包含集群 fsid 、創建時間、最近修改時間、存儲池列表、副本數量、歸置組數量、 OSD 列表及其狀態(如 up 、 in )。要查看OSD運行圖,用 ceph osd dump 命令。
- PG Map::** 包含歸置組版本、其時間戳、最新的 OSD 運行圖版本、占滿率、以及各歸置組詳情,像歸置組 ID 、 up set 、 acting set 、 PG 狀態(如 active+clean ),和各存儲池的數據使用情況統計。
- CRUSH Map::** 包含存儲設備列表、故障域樹狀結構(如設備、主機、機架、行、房間、等等)、和存儲數據時如何利用此樹狀結構的規則。要查看 CRUSH 規則,執行 ceph osd getcrushmap -o {filename} 命令;然后用 crushtool -d {comp-crushmap-filename} -o {decomp-crushmap-filename} 反編譯;然后就可以用 cat 或編輯器查看了。
- MDS Map: 包含當前 MDS 圖的版本、創建時間、最近修改時間,還包含了存儲元數據的存儲池、元數據服務器列表、還有哪些元數據服務器是 up 且 in 的。要查看 MDS 圖,執行 ceph mds dump 。
各運行圖維護着各自運營狀態的變更, Ceph 監視器維護着一份集群運行圖的主拷貝,包括集群成員、狀態、變更、以及 Ceph 存儲集群的整體健康狀況。
CEPH POOL(存儲池)
Ceph 存儲系統支持“池”概念,它是存儲對象的邏輯分區。
Ceph 客戶端從監視器獲取一張集群運行圖,並把對象寫入存儲池。存儲池的 size 或副本數、 CRUSH 規則集和歸置組數量決定着 Ceph 如何放置數據。
存儲池至少可設置以下參數:
- 對象的所有權/訪問權限;
- 歸置組數量;以及,
- 使用的 CRUSH 規則集。
CEPH PG(存儲組)
每個存儲池都有很多歸置組, CRUSH 動態的把它們映射到 OSD 。 Ceph 客戶端要存對象時, CRUSH 將把各對象映射到某個歸置組。
把對象映射到歸置組在 OSD 和客戶端間創建了一個間接層。由於 Ceph 集群必須能增大或縮小、並動態地重均衡。如果讓客戶端“知道”哪個 OSD 有哪個對象,就會導致客戶端和 OSD 緊耦合;相反, CRUSH 算法把對象映射到歸置組、然后再把各歸置組映射到一或多個 OSD ,這一間接層可以讓 Ceph 在 OSD 守護進程和底層設備上線時動態地重均衡。下列圖表描述了 CRUSH 如何將對象映射到歸置組、再把歸置組映射到 OSD 。
有了集群運行圖副本和 CRUSH 算法,客戶端就能精確地計算出到哪個 OSD 讀、寫某特定對象。
Ceph 客戶端綁定到某監視器時,會索取最新的集群運行圖副本,有了此圖,客戶端就能知道集群內的所有監視器、 OSD 、和元數據服務器。然而它對對象的位置一無所知。
客戶端只需輸入對象 ID 和存儲池,此事簡單: Ceph 把數據存在某存儲池(如 liverpool )中。當客戶端想要存命名對象(如 john 、 paul 、 george 、 ringo 等等)時,它用對象名,一個哈希值、 存儲池中的歸置組數、存儲池名計算歸置組。 Ceph 按下列步驟計算 PG ID 。
- 客戶端輸入存儲池 ID 和對象 ID (如 pool=”liverpool” 和 object-id=”john” );
- CRUSH 拿到對象 ID 並哈希它;
- CRUSH 用 PG 數(如 58 )對哈希值取模,這就是歸置組 ID ;
- CRUSH 根據存儲池名取得存儲池 ID (如liverpool = 4 );
- CRUSH 把存儲池 ID 加到PG ID(如 4.58 )之前。
計算對象位置遠快於查詢定位, CRUSH 算法允許客戶端計算對象應該存到哪里,並允許客戶端連接主 OSD 來存儲或檢索對象。