Ceph介紹
Ceph是一種熱門的軟件定義存儲(SDS)技術,可以運行在幾乎所有主流的 Linux 發行版(比如CentOS和Ubuntu)和其它類UNIX操作系統(典型如FreeBSD)。Ceph是一個開源項目,爲塊存儲、文件存儲和對象存儲提供了統一的軟件定義存儲解決方案,既支持傳統的塊、文件存儲協議,例如 SAN 和 NAS ;也支持對象存儲協議,例如S3和Swift。Ceph具有如下特點:
- Ceph是一個真正的SDS解決方案,它可以從軟件層面正確提供所有的企業級存儲特性:低成本、可靠性、可擴展性是Ceph的主要特點。
- Ceph是一個真正的統一存儲解決方案,它從單一統一軟件層提供對象、塊和文件存儲。
- Ceph通過一個算法來動態計算存儲和獲取某個對象的位置,消除了中心節點(中心節點往往是性能的瓶頸)。
傳統的存儲系統並不具備更智能地管理元數據的方法。傳統的存儲系統通過維護一張集中的查找表來跟蹤它們的元數據。客戶端每次發出讀寫操作請求時,存儲系統首先要查找這個巨大的元數據表,得到結果之後它才能執行客戶端請求的操作。對於一個小的存儲系統而言,也許不會感覺到性能問題,但對於一個大的存儲集羣來說,將會受制於這種方法的性能限制,進而限制系統的擴展性。
Ceph引入了一個叫CRUSH的新算法,而不是保存和操縱元數據
CRUSH 是 Controlled Replication Under Scalable Hashing 的縮寫,即基於可擴展哈希的受控副本分佈策略,CRUSH 算法在後臺計算數據存儲和讀取的位置,而不是爲每個客戶端請求執行元數據表的查找。通過動態計算元數據,不需要管理一個集中式的元數據表。
此外,CRUSH 使得 Ceph 能夠自我管理和自我治癒。當故障區域中的組件故障時,CRUSH 能夠感知哪個組件故障了,並確定其對集羣的影響。無須管理員的任何干預,CRUSH 就會進行自我管理和自我療愈,爲因故障而丟失的數據執行恢復操作。
Ceph架構
Ceph 的架構如下圖所示:
下面,我們對圖中的Ceph組件做一一介紹:
- MON 監視器:即 Ceph monitor ,通過保存一份集羣狀態映射(Cluster Map)來維護整個集羣的健康狀態,並分別爲每個組件維護映射信息:OSD map、MON map、PG map、CRUSH map。所有節點都向 MON 節點彙報狀態信息,並分享它們狀態中的任何變化。Ceph mon 不存儲數據:這是Ceph osd 的任務。
- OSD 對象存儲設備:只要應用程序向 Ceph 集羣發出寫操作,數據就會被以對象形式存儲在 OSD 中。OSD 是 Ceph集羣中唯一能存儲用戶數據對的組件,同時用戶也可以發送讀命令來讀取數據。通常,一個 OSD 守護進程會被捆綁到集羣中的一塊物理磁盤上,因此,通常情況下,Ceph集羣中的物理磁盤總數,與在磁盤上運行的存儲用戶數據的 OSD 守護進程的數量是相同的。
- MDS 元數據服務器:MDS 只爲 CephFS 文件系統跟蹤文件的層次結構和存儲元數據。Ceph 塊設備和 RADOS GW並不需要元數據,因此也並不需要 Ceph MDS 守護進程。MDS 不直接提供數據給客戶端,從而消除了系統中的故障單點。
- RADOS:RADOS 是 Ceph 存儲集羣的基礎。在 Ceph 中,所有數據都以對象形式存儲,並且無論是哪種類型,RADOS 對象存儲都將負責保存這些對象。RADOS 層可以確保數據始終保持一致,爲此 RADOS 層須進行數據複製、故障檢測和恢復,以及數據遷移和在所有集羣節點實現再平衡。
- LIBRADOS:librados 庫爲PHP、Ruby、Java、Python、C 和 C++ 這些編程語言提供了方便地訪問 RADOS 接口的方式。同時它還爲諸如 RBD、RGW 和 CephFS 這些組件提供了原生的接口。librados 還支持直接使用 RADOS 來節省HTTP開銷。
- RBD RADOS塊設備:RBD 提供持久塊存儲,它是自動精簡配置並可調整大小的,並將數據分散存儲在多個OSD上。RBD服務被封裝成了基於 librados 的一個原生接口。
- RGW RADOS網關接口:RGW提供對象存儲服務,使用 librgw 和 librados ,允許應用程序與 Ceph 對象存儲建立連接。RGW 提供了與 Amazon S3 和 OpenStack Swift 兼容的 RESTful API。
- CEPH FS 文件系統:Ceph 文件系統提供了一個使用 Ceph 存儲集羣存儲用戶數據,並與 POSIX 兼容的文件系統。和 RBD、RGW 一樣,CephFS也是基於 librados 封裝了原生接口。
POSIX:可移植操作系統接口Portable Operating System Interface of UNIX,POSIX標準定義了操作系統應該爲應用程序提供的接口標準,是IEEE爲要在各種UNIX操作系統上運行的軟件而定義的一系列API標準的總稱。
Ceph集羣存儲協議:RBD、CephFS、RGW
Ceph 塊存儲:RBD
數據以塊的形式存儲在卷裏,卷會掛載到節點上,這些塊形成的卷會映射到操作系統中,並被文件系統層控制。Ceph 引入了一個新的 RBD 協議,也就是 Ceph 塊設備。RBD 爲客戶端提供了可靠、分佈式、高性能的塊存儲。RBD 已經被 Linux 內核支持,幾乎所有的 Linux 操作系統發行版都原生支持RBD。除了可靠性和性能之外,RBD也支持其他的企業級特性,如完整和增量式快照,精簡的配置,寫時複製式克隆以及全內存是緩存。
Ceph RBD支持的最大鏡像爲16EB。這些鏡像可以作爲磁盤映射到物理機裸機、虛擬機或者其他主機用。
Ceph 文件系統:CephFS
Ceph文件系統也就是 CephFS ,利用 Ceph 存儲集羣來保存用戶數據。Linux 內核驅動程序支持 CephFS ,這也使得 CephFS 高度適用於各大 Linux 操作系統發行版。CephFS 將數據和元數據分開存儲,爲上層的應用程序提供較高的性能以及可靠性。
在 Ceph 集羣內部,Ceph文件系統庫(libcephfs)運行在 RADOS 庫(librados)之上,後者是 Ceph 存儲集羣協議,由文件、塊和對象存儲共用。要使用 CephFS ,集羣節點上最少要配置一個 Ceph 元數據服務器(MDS),客戶端可以採用多種方式使用CephFS。
如果要把 Ceph 掛在成文件系統,客戶端可以使用本地 Linux 內核的功能或者使用 Ceph 社區提供的ceph-fuse驅動。除此之外,客戶端可以使用第三方開源程序,例如 NFS 的 ganesha 和 SMB/CIFS 的 Samba。這些程序通過libcephfs 將用戶數據存入可靠的分佈式Ceph存儲集羣。CephFS 可以用來替代 HDFS 。也是通過libcephfs組件將數據存入Ceph集羣。
Ceph 對象存儲:RGW
Ceph 是一個分佈式對象存儲系統,通過它的對象網關(object gateway),即 RADOS 網關(radosgw)提供對象存儲接口。RADOS網關利用 librgw 庫和 librados 這些庫,允許應用程序跟 Ceph 對象存儲建立連接。Ceph 通過 Restful AP I讓用戶的應用程序將數據存儲到Ceph集羣中。RADOS網關接口滿足以下特點:
- 兼容Swift:爲 OpenStack Swift API 提供的對象存儲功能;
- 兼容S3:爲 Amazon S3 API 提供的對象存儲功能;
- Admin API:這也稱爲管理API或者原生API,應用程序可以直接使用它來獲取訪問存儲系統的權限以管理存儲系統。
爲什麼要有RBD、CephFs以及RGW
爲什麼Ceph的塊設備接口不具有共享性,而Ceph的文件系統接口具有呢?
- 對於Ceph的塊設備接口,文件系統的結構狀態是維護在各用戶機內存中的,假設Ceph塊設備同時掛載到了用戶機1和用戶機2,當在用戶機1上的文件系統中寫入數據後,更新了用戶機1的內存中文件系統狀態,最終數據存儲到了Ceph集羣中,但是此時用戶機2內存中的文件系統並不能得知底層Ceph集羣數據已經變化而維持數據結構不變,因此用戶無法從用戶機2上讀取用戶機1上新寫入的數據。
- 對於Ceph的文件系統接口,文件系統的結構狀態是維護在遠端Ceph集羣中的,並且是集羣層面的。Ceph文件系統同時掛載到了用戶機1和用戶機2,當往用戶機1的掛載點寫入數據後,遠端Ceph集羣中的文件系統狀態結構隨之更新,當從用戶機2的掛載點訪問數據時會去遠端Ceph集羣取數據,由於遠端Ceph集羣已更新,所以用戶機2能夠獲取最新的數據。
Ceph有了塊設備接口,在塊設備上完全可以構建一個文件系統,那麼Ceph爲什麼還需要文件系統接口呢?
- 主要是因爲應用場景的不同,Ceph的塊設備具有優異的讀寫性能,但不能多處掛載同時讀寫,目前主要用在OpenStack上作爲虛擬磁盤,而Ceph的文件系統接口讀寫性能較塊設備接口差,但具有優異的共享性。
- Ceph的文件系統接口彌補了Ceph的塊設備接口在共享性方面的不足,Ceph的文件系統接口符合POSIX標準,用戶可以像使用本地存儲目錄一樣使用Ceph的文件系統的掛載目錄。簡單來說,即無需修改你的程序,就可以將程序的底層存儲換成空間無限並可多處共享讀寫的Ceph集羣文件系統。
RGW的由來?
綜上,Ceph的塊設備存儲具有優異的存儲性能但不具有共享性,而Ceph的文件系統具有共享性然而性能較塊設備存儲差。那麼,爲什麼不權衡一下存儲性能和共享性,整個具有共享性而存儲性能好於文件系統存儲的存儲呢,因此對象存儲就這樣出現了。Ceph的對象存儲接口即RGW(RADOS GATEWAY),RGW不能像文件系統的磁盤那樣被操作系統直接訪問,相反,它只能通過 HTTP 協議上傳/下載/刪除對象(文件即對象),即只能使用 API 在應用層面被訪問,並且該API 接口與 RESTful S3 、Swift 兼容。
體驗 Ceph 集羣
有了可運行的 Ceph 集羣后,我們可以用一些簡單的命令來體驗Ceph:
Ceph命令 | 說明 |
---|---|
ceph -s 或 ceph status | 檢查 Ceph 的安裝狀態 |
ceph quorum_status | json_pp | 檢查 Ceph monitor 仲裁狀態(如:ceph mon發生了幾次選舉) |
ceph mon dump | 導出 Ceph monitor 的信息 |
ceph df | 檢查集羣的使用狀態 |
ceph mon stat | 檢查 Ceph monitor 狀態 |
ceph osd stat | 檢查 Ceph osd 狀態 |
ceph pg stat | 檢查 Ceph pg(配置組)狀態 |
ceph pg dump | 列表 PG(pg的數量通常都比較龐大,可以使用 ceph pg dump | less 命令查看) |
ceph osd lspools | 列表 Ceph存儲池 |
ceph osd tree | 檢查 OSD 的 CRUSH map(描述了存儲的拓撲結構) |