1.2.1 無中心架構
1. 計算模式
Ceph 是無中心分布式存儲系統(計算模式)的典型代表。Ceph架構與 HDFS架構不同的地方在于該存儲架構中沒有中心節點(中繼資料不需要集中儲存),用戶端(Client)通過裝置映射關系及預先定義算法,可直接本地計算出其寫入資料的存儲位置,這樣用戶端可以直接與存儲節點(StorageNode)進行通信互動,避免中繼資料中心節點成為存儲系統的性能瓶頸。Ceph系統架構如圖 1-8所示。

圖 1-8Ceph系統架構
圖 1-9展示了 Ceph 存儲系統的核心元件。
(1) Mon服務
Mon為 Monitor的縮寫,Ceph的 Monitor服務維護存儲叢集狀态的各種圖表,包括:
◆ 螢幕圖(MonitorMap),記錄所有Monitor節點的資訊,如叢集 ID、主機名、IP和端口等。
◆ OSD圖(OSDMap), 記 錄CephPool的 PoolID、名稱、類型、副本、PGP配置,以及 OSD的數量、狀态、最小清理間隔、OSD所在主機資訊等。
◆ 歸置組圖(PGMap),記錄目前的PG版本、時間戳、空間使用比例以及每個PG 的基本資訊。
◆ CRUSH圖(CRUSHMap,CRUSH為ControlledReplicationUnderScalableHashing的 縮寫),記錄叢集儲存設備資訊、故障層次結構以及存儲資料時故障域規則資訊。
這些圖表(Map)儲存着叢集發生在Monitor、PG和 CRUSH 上的每一次狀态變更,這些狀态變更的曆史資訊版本稱為epoch,可以用于叢集的資料定位以及叢集的資料恢複。
Monitor1通過叢集部署的方式保證其自身服務的可用性,由于遵循Pasox 協定來進行leader選舉,Monitor 叢集通常為奇數個節點部署,且部署節點數量不小于 3個。
(2) OSD服務
OSD為 ObjectStorageDevice的縮寫,Ceph的 OSD服務功能是存儲資料、管理磁盤,以實作真正的資料讀寫,OSD 服務處理資料的複制、恢複、回填、再均衡等任務,并通過檢查其他 OSD守護程序的心跳來向 CephMonitor服務提供監控資訊。
通常一個磁盤對應一個OSD 服務,但使用高性能存儲媒體時,也可以将存儲媒體進行分區處理,啟動多個 OSD 守護程序進行磁盤空間管理(每個 OSD守護程序對應一個磁盤分區)。
(3) MDS服務
MDS為MetadataServer 的縮寫,Ceph的MDS服務為Ceph檔案系統存儲中繼資料,即Ceph的塊裝置場景和對象存儲場景不使用 MDS服務。Ceph的 MDS服務主要負責CephFS 叢集中檔案和目錄的管理,記錄資料的屬性,如檔案存儲位置、大小、存儲時間等,同時負責檔案查找、檔案記錄、存儲位置記錄、通路授權等,允許 Ceph的 POSIX檔案系統使用者可以在不對 Ceph存儲叢集造成負擔的前提下,執行諸如檔案的ls、find等基本指令。MDS 通過主備部署的方式保證其自身服務的可用性,程序可以被配置為活躍或者被動狀态,活躍的 MDS為主 MDS,其他的 MDS處于備用狀态,當主 MDS 節點故障時,備用MDS節點會接管其工作并被提升為主節點。
(4) RADOS
RADOS為 ReliableAutonomicDistributedObjectStore 的縮寫,意為可靠、自主的分布式對象存儲,從元件構成圖中可見,RADOS由上述 3種服務(Mon、OSD、MDS)構成,其本質為一套分布式資料存儲系統,即 RADOS 本身也是一套分布式存儲叢集。在 Ceph存儲中所有的資料都以對象形式存在,RADOS負責儲存這些對象,RADOS層可以確定對象資料始終保持一緻性。從這個意義上講,Ceph存儲系統可以認為是在 RADOS對象存儲系統之上的二次封裝。
1Ceph的 Luminous版本推出了 MGR(ManagerDaemon)元件,該元件的主要作用是分擔和擴充 Monitor服務的部分功能,減輕Monitor的負擔,它從 Monitor 服務中拆解出了部分對外暴露的叢集狀态名額,對外提供叢集狀态的統一查詢入口。
RADOS依據 Ceph 的需求進行設計,能夠在動态變化和異構儲存設備之上提供一種穩定、可擴充、高性能的單一邏輯對象存儲接口,并能夠實作節點的自适應和自管理。
(5) librados
librados庫為PHP、Ruby、Java、Python、C、C++ 等語言提供了便捷的通路RADOS接口的方式,即 librados允許使用者不通過 RESTfulAPI、blockAPI或者 POSIX檔案系統接口通路 Ceph存儲叢集。
libradosAPI 可以通路 Ceph 存儲叢集的 Mon、OSD 服務。
(6) RBD
RBD是 RADOSBlockDevice的縮寫,Ceph的RBD 接口可提供可靠的分布式、高性能塊存儲邏輯卷(Volume)給用戶端使用。RBD 塊裝置可以類似于本地磁盤一樣被作業系統挂載,具備快照、克隆、動态擴容、多副本和一緻性等特性,寫入RBD 裝置的資料以條帶化的方式存儲在 Ceph叢集的多個 OSD中。
(7) RGW
RGW是 RADOSGateway的縮寫,Ceph的 RGW接口提供對象存儲服務,RGW基于 librados接口實作了 FastCGI服務封裝,它允許應用程式和 Ceph對象存儲建立連接配接,RGW提供了與AmazonS3和 OpenStackSwift相容的RestfulAPI。對象存儲适用于圖檔、音視訊等檔案的上傳與下載下傳,可以設定相應的檔案通路權限以及資料生命周期。
(8) CephFS
CephFS是 CephFileSystem的縮寫,CephFS接口可提供與 POSIX相容的檔案系統,使用者能夠對 Ceph 存儲叢集上的檔案進行通路。CephFS是 Ceph叢集最早支援的用戶端,但對比 RBD和 RGW,它又是Ceph最晚滿足productionready的一個功能。
回到 Ceph 元件示意圖,用戶端通路存儲叢集的流程可總結如下。
用戶端在啟動後首先通過 RBD/RGW/CephFS接口進入(也可基于 librados自行适配業務進行接口開發),從Mon服務拉取存儲資源布局資訊(叢集運作圖),然後根據該布局資訊和寫入資料的名稱等資訊計算出期望資料的存儲位置(包含具體的實體伺服器資訊和磁盤資訊),然後和該位置資訊對應的OSD服務直接通信,進行資料的讀取或寫入。
Ceph是目前應用最廣泛的開源分布式存儲系統, 它已經成為 Linux作業系統和OpenStack開源雲計算基礎設施的“标配”,并得到了衆多廠商的支援。Ceph可以同時提供對象存儲、塊存儲和檔案系統存儲3 種不同類型的存儲服務,是一套名副其實的統一分布式存儲系統,總結其特點如下。
◆ 高性能
Ceph 存儲系統摒棄了集中式存儲中繼資料尋址的方案,轉而采用私有的 CRUSH算法,中繼資料分布更加均衡,系統 I/O操作并行度更高。
◆ 高可用性
Ceph 存儲系統考慮了容災域的隔離,能夠實作多種資料放置政策規則,例如資料副本跨機房、機架感覺備援等,提升了資料的安全性;同時,Ceph存儲系統中資料副本數可以靈活控制,堅持資料的強一緻性原則,系統沒有單點故障,存儲叢集可進行修複自愈、自動管理,存儲服務可用性高。
◆ 高可擴充性
Ceph 存儲系統采用對稱結構、全分布式設計,叢集無中心節點,擴充靈活,能夠支援上千台存儲節點的規模,支援PB級的資料存儲需求;且随着伺服器節點的不斷加入,存儲系統的容量和 I/O處理能力可獲得線性增長,擁有強大的scaleout能力。
◆ 接口及特性豐富
Ceph 存儲系統支援塊存儲、檔案存儲、對象存儲3種通路類型,且 3 個方向均已生産就緒:對象存儲方面,Ceph支援Swift和 S3的API接口;塊存儲方面,除私有協定挂載外,Ceph社群也在積極推動 iSCSI方案,RBD裝置支援精簡配置、快照、克隆等特性;檔案系統存儲方面,Ceph支援 POSIX 接口,支援快照特性。同時,Ceph通過 librados可實作通路接口自定義,支援多種語言進行驅動開發。
2. 一緻性 Hash模式
Swift是無中心分布式存儲系統(一緻性 Hash)的典型代表。Swift由Rackspace開發,用來為雲計算提供高可擴充性的對象存儲叢集。與 Ceph通過自定義算法獲得資料分布位置的方式不同,Swift通過一緻性 Hash的方式獲得資料存儲位置。一緻性Hash的方式就是将裝置在邏輯上建構成一個Hash環,然後根據資料名稱計算出的 Hash值映射到Hash 環的某個位置,進而實作資料的定位。
Swift中存在兩種映射關系,對于一個檔案,通過 Hash算法(MD5)找到對應的虛節點(一對一的映射關系),虛節點再通過映射關系(Hash環檔案中的二維數組)找到對應的裝置(多對多的映射關系),這樣就完成一個檔案存儲在裝置上的映射。
圖 1-10展示了 Swift分布式存儲系統的架構。
圖 1-10Swft分布式存儲系統架構
Swift主要面向的對象存儲應用場景,和 Ceph 提供的對象存儲服務類似,主要用于解決非結構化資料的存儲問題。
Swift存儲系統和 Ceph 存儲系統主要差別如下。
◆ Swift僅提供對象存儲服務能力,而Ceph在設計之初就比 Swift開放,除支援對象存儲場景外,還支援塊存儲、檔案存儲使用場景;
◆ 資料一緻性方面,Swift 提供資料最終一緻性,在處理海量資料的效率上更占優勢,主要面向對資料一緻性要求不高,但對資料處理效率要求比較高的對象存儲業務,而Ceph存儲系統始終強調資料的強一緻性,更适用于對資料存儲安全性要求較高的場景;
◆ 二者在應用于對象存儲多資料中心場景下時,Swift 叢集支援跨地域部署,允許資料先在本地寫入(資料本地寫入完成後就傳回寫入成功),然後基于一緻性設計在一段時間裡複制到遠端地域,而Ceph 存儲系統則通常需要通過Master-Slave 模型部署兩套叢集,從Master到 Slave 進行資料異步複制,是以在多于兩個地域時,基礎架構上的負載分布會很不均衡 1。