深入理解Ceph存儲(chǔ)架構(gòu)


本文是一篇Ceph存儲(chǔ)架構(gòu)技術(shù)文章,內(nèi)容深入到每個(gè)存儲(chǔ)特性,文章由Ceph中國(guó)社區(qū)穆艷學(xué)翻譯,耿航校稿,以下是具體內(nèi)容:
目錄
第1章 概覽
第2章 存儲(chǔ)集群架構(gòu)
2.1 存儲(chǔ)池
2.2 身份認(rèn)證
2.3 PG(s)
2.4 CRUSH
2.5 I/O操作
2.5.1 副本I/O
2.5.2 糾刪碼I/O
2.6 自管理的內(nèi)部操作
2.6.1 心跳
2.6.2 同步
2.6.3 數(shù)據(jù)再平衡與恢復(fù)
2.6.4 校驗(yàn)(或擦除)
2.7 高可用
2.7.1 數(shù)據(jù)副本
2.7.2 Mon集群
2.7.3 CephX
第3章 客戶端架構(gòu)
3.1 本地協(xié)議與Librados
3.2 對(duì)象的監(jiān)視與通知
3.3 獨(dú)占鎖
3.4 對(duì)象映射索引
3.5 數(shù)據(jù)條帶化
第4章 加密
第1章 概覽
Red Hat Ceph是一個(gè)分布式的數(shù)據(jù)對(duì)象存儲(chǔ),系統(tǒng)設(shè)計(jì)旨在性能、可靠性和可擴(kuò)展性上能夠提供優(yōu)秀的存儲(chǔ)服務(wù)。分布式對(duì)象存儲(chǔ)是存儲(chǔ)的未來(lái),因?yàn)樗鼈冞m應(yīng)非結(jié)構(gòu)化數(shù)據(jù),并且客戶端可以同時(shí)使用現(xiàn)代及傳統(tǒng)的對(duì)象接口進(jìn)行數(shù)據(jù)存取。例如:
本地語(yǔ)言綁定接口(C/C++、Java、Python)
RESTful 接口(S3/Swift)
塊設(shè)備接口
文件系統(tǒng)接口
Red Hat Ceph所具備的強(qiáng)大功能可以改變您公司(或組織)的IT基礎(chǔ)架構(gòu)和管理海量數(shù)據(jù)的能力,特別是對(duì)于像RHEL OSP這樣的云計(jì)算平臺(tái)。
Red Hat Ceph具有非常好的可擴(kuò)展性——數(shù)以千計(jì)的客戶端可以訪問(wèn)PB級(jí)到EB級(jí)甚至更多的數(shù)據(jù)。
譯者注: 數(shù)據(jù)的規(guī)模可以用KB、MB、GB、TB、PB、EB、YB等依次表示,比如1TB = 1024GB。
每一個(gè)Ceph部署的核心就是Ceph存儲(chǔ)集群。 集群主要是由2類后臺(tái)守護(hù)進(jìn)程組成:
Ceph OSD守護(hù)進(jìn)程:Ceph OSD為Ceph客戶端存儲(chǔ)數(shù)據(jù)提供支持。另外,Ceph OSD利用Ceph節(jié)點(diǎn)的CPU和內(nèi)存來(lái)執(zhí)行數(shù)據(jù)復(fù)制、數(shù)據(jù)再平衡、數(shù)據(jù)恢復(fù)、狀態(tài)監(jiān)視以及狀態(tài)上報(bào)等功能。
Ceph 監(jiān)視器:Ceph監(jiān)視器使用存儲(chǔ)集群的當(dāng)前狀態(tài)維護(hù)Ceph存儲(chǔ)集群映射關(guān)系的一份主副本。

Ceph客戶端接口與Ceph存儲(chǔ)集群進(jìn)行數(shù)據(jù)讀寫上的交互。客戶端要與Ceph存儲(chǔ)集群通信,則需要具備以下條件:
Ceph配置文件,或者集群名稱(通常名稱為ceph)與監(jiān)視器地址
存儲(chǔ)池名稱
用戶名及密鑰所在路徑
Ceph客戶端維護(hù)對(duì)象ID和存儲(chǔ)對(duì)象的存儲(chǔ)池名稱,但它們既不需要維護(hù)對(duì)象到OSD的索引,也不需要與一個(gè)集中的對(duì)象索引進(jìn)行通信來(lái)查找數(shù)據(jù)對(duì)象的位置。
為了能夠存儲(chǔ)并獲取數(shù)據(jù),Ceph客戶端首先會(huì)訪問(wèn)一臺(tái)Ceph mon并得到最新的存儲(chǔ)集群映射關(guān)系,然后Ceph客戶端可以通過(guò)提供的對(duì)象名稱與存儲(chǔ)池名稱,使用集群映射關(guān)系和CRUSH算法(可控的、可擴(kuò)展的、分布式的副本數(shù)據(jù)放置算法)來(lái)計(jì)算出提供對(duì)象所在的PG和主Ceph OSD,最后,Ceph客戶端連接到可執(zhí)行讀寫操作的主OSD上進(jìn)而達(dá)到數(shù)據(jù)的存儲(chǔ)與獲取。客戶端和OSD之間沒(méi)有中間服務(wù)器,中間件或總線。
當(dāng)一個(gè)OSD需要存儲(chǔ)數(shù)據(jù)時(shí)(無(wú)論客戶端是Ceph Block設(shè)備,Ceph對(duì)象網(wǎng)關(guān)或其他接口),從客戶端接收數(shù)據(jù)然后將數(shù)據(jù)存儲(chǔ)為對(duì)象。每一個(gè)對(duì)象相當(dāng)于文件系統(tǒng)中存放于如磁盤等存儲(chǔ)設(shè)備上的一個(gè)文件。

注: 一個(gè)對(duì)象的ID在整個(gè)集群中是唯一的,(全局唯一)而不僅僅是本地文件系統(tǒng)中的唯一。
Ceph OSD將所有數(shù)據(jù)作為對(duì)象存儲(chǔ)在扁平結(jié)構(gòu)的命名空間中(例如,沒(méi)有目錄層次結(jié)構(gòu))。對(duì)象在集群范圍內(nèi)具有唯一的標(biāo)識(shí)、二進(jìn)制數(shù)據(jù)、以及由一組名稱/值的鍵值對(duì)組成的元數(shù)據(jù)。而這些語(yǔ)義完全取決于Ceph的客戶端。例如,Ceph塊設(shè)備將塊設(shè)備鏡像映射到集群中存儲(chǔ)的一系列對(duì)象上。

注: 由唯一ID、數(shù)據(jù)、名稱/值構(gòu)成鍵值對(duì)的元數(shù)據(jù)組成的對(duì)象可以表示結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù),以及前沿新的數(shù)據(jù)存儲(chǔ)接口或者原始老舊的數(shù)據(jù)存儲(chǔ)接口。
第2章 存儲(chǔ)集群架構(gòu)
為了有效的實(shí)現(xiàn)無(wú)限可擴(kuò)展性、高可用性以及服務(wù)性能,Ceph存儲(chǔ)集群可以包含大量的Ceph節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)利用商業(yè)硬件以及智能的Ceph守護(hù)進(jìn)程實(shí)現(xiàn)彼此之間的通信:
存儲(chǔ)和檢索數(shù)據(jù)
數(shù)據(jù)復(fù)制
監(jiān)控并報(bào)告集群運(yùn)行狀況(心跳)
動(dòng)態(tài)的重新分布數(shù)據(jù)(回填)
確保數(shù)據(jù)完整性(清理及校驗(yàn))
失敗恢復(fù)
對(duì)于讀寫數(shù)據(jù)的Ceph客戶端接口來(lái)說(shuō),Ceph存儲(chǔ)集群看起來(lái)就像一個(gè)存儲(chǔ)數(shù)據(jù)的簡(jiǎn)單存儲(chǔ)池。然而,存儲(chǔ)集群背后卻是對(duì)客戶端接口完全透明的方式并且會(huì)執(zhí)行許多復(fù)雜的操作。Ceph客戶端和Ceph OSD都使用CRUSH算法(可控的、可擴(kuò)展的、分布式的副本數(shù)據(jù)放置算法),后面的章節(jié)會(huì)詳細(xì)講解CRUSH算法。
2.1 存儲(chǔ)池
Ceph存儲(chǔ)集群通過(guò)‘存儲(chǔ)池’這一邏輯劃分的概念對(duì)數(shù)據(jù)對(duì)象進(jìn)行存儲(chǔ)。可以為特定類型的數(shù)據(jù)創(chuàng)建存儲(chǔ)池,比如塊設(shè)備、對(duì)象網(wǎng)關(guān),亦或僅僅是為了將一組用戶與另一組用戶分開。
從Ceph客戶端來(lái)看,存儲(chǔ)集群非常簡(jiǎn)單。當(dāng)有Ceph客戶端想讀寫數(shù)據(jù)時(shí)(例如,會(huì)調(diào)用I/O上下文),客戶端總是會(huì)連接到存儲(chǔ)集群中的一個(gè)存儲(chǔ)池上。客戶端指定存儲(chǔ)池名稱、用戶以及密鑰,所以存儲(chǔ)池會(huì)充當(dāng)邏輯劃分的角色,這一角色使得對(duì)數(shù)據(jù)對(duì)象訪問(wèn)進(jìn)行控制。
實(shí)際上,存儲(chǔ)池不只是存儲(chǔ)對(duì)象數(shù)據(jù)的邏輯劃分,它還扮演著Ceph存儲(chǔ)集群是如何分布及存儲(chǔ)數(shù)據(jù)的角色,當(dāng)然了,這些復(fù)雜的操作對(duì)客戶端來(lái)說(shuō)也是透明的。Ceph存儲(chǔ)池定義了:
存儲(chǔ)池類型:在以前的老版本中,一個(gè)存儲(chǔ)池只是簡(jiǎn)單的維護(hù)對(duì)象的多個(gè)深拷貝。而現(xiàn)在,Ceph能夠維護(hù)一個(gè)對(duì)象的多個(gè)副本,或者能夠使用糾刪碼。正因?yàn)楸WC數(shù)據(jù)持久化的2種方法(副本方式與糾刪碼方式)存在差異,所以Ceph 支持存儲(chǔ)池類型。存儲(chǔ)池類型對(duì)于客戶端也是透明的。
PG:在EB規(guī)模的存儲(chǔ)集群中,一個(gè)Ceph存儲(chǔ)池可能會(huì)存儲(chǔ)數(shù)百萬(wàn)或更多的數(shù)據(jù)對(duì)象。因?yàn)镃eph必須處理數(shù)據(jù)持久化(副本或糾刪碼數(shù)據(jù)塊)、清理校驗(yàn)、復(fù)制、重新再平衡以及數(shù)據(jù)恢復(fù),因此在每個(gè)對(duì)象基礎(chǔ)上的管理就會(huì)出現(xiàn)擴(kuò)展性和性能上的瓶頸。Ceph通過(guò)散列存儲(chǔ)池到PG的方式來(lái)解決這個(gè)瓶頸問(wèn)題。CRUSH則分配每一個(gè)對(duì)象到指定的PG中,每個(gè)PG再到一組OSD中。
CRUSH規(guī)則集:Ceph中,高可用、持久化能力以及性能是非常重要的。CRUSH算法計(jì)算用于存儲(chǔ)對(duì)象的PG,同時(shí)也用于計(jì)算出PG的OSD Acting Set
譯者注:acting set即為活躍的osd集合,集合中第一個(gè)編號(hào)的osd即為主primary OSD。
CRUSH也扮演著其他重要角色:即CRUSH可以識(shí)別故障域和性能域(例如,存儲(chǔ)介質(zhì)類型、nodes, racks, rows等等)。CRUSH使得客戶端可以跨故障域(rooms, racks, rows等等)完成數(shù)據(jù)的寫入以便當(dāng)節(jié)點(diǎn)出現(xiàn)粒度比較大的問(wèn)題時(shí)(例如,rack出問(wèn)題)集群仍然可以以降級(jí)的狀態(tài)提供服務(wù)直至集群狀態(tài)恢復(fù)。CRUSH也可使客戶端能夠?qū)?shù)據(jù)寫入特定類型的硬件中(性能域),例如SSD或具有SSD日志的硬盤驅(qū)動(dòng)器,亦或具有與數(shù)據(jù)驅(qū)動(dòng)相同驅(qū)動(dòng)的日志硬盤驅(qū)動(dòng)器。對(duì)于存儲(chǔ)池來(lái)說(shuō),CRUSH規(guī)則集決定了故障域以及性能域。
數(shù)據(jù)持久化方式:在EB規(guī)模的存儲(chǔ)集群中,硬件故障因?yàn)榭深A(yù)期所以一般并不算異常。當(dāng)使用數(shù)據(jù)對(duì)象表示較大粒度的存儲(chǔ)接口時(shí)(例如塊設(shè)備),對(duì)于這種大粒度存儲(chǔ)接口來(lái)說(shuō),對(duì)象的丟失(不管是1個(gè)還是多個(gè))都可能破壞數(shù)據(jù)的完整性進(jìn)而導(dǎo)致數(shù)據(jù)不可用。因此,數(shù)據(jù)丟失是不可容忍也是不能接受的。Ceph提供了2種持久化方式:第1種為副本存儲(chǔ)池方式,這種方式將多份相同內(nèi)容的數(shù)據(jù)對(duì)象通過(guò)CRUSH進(jìn)行故障域的隔離來(lái)存儲(chǔ)到不同的節(jié)點(diǎn)上(比如將對(duì)象分別存儲(chǔ)在硬件相互隔離的不同節(jié)點(diǎn)上),這樣即使硬件問(wèn)題也不會(huì)對(duì)數(shù)據(jù)的持久化能力產(chǎn)生什么大的影響;第2種為糾刪碼存儲(chǔ)池方式,這種方式將對(duì)象存儲(chǔ)到K+M?個(gè)塊中,其中K表示數(shù)據(jù)塊,M?表示編碼塊。K+M的和表示總的OSD數(shù)量,可以支持最多同時(shí)有M?個(gè)OSD出現(xiàn)問(wèn)題,數(shù)據(jù)也不會(huì)丟失。
從客戶端角度來(lái)看,Ceph對(duì)外呈現(xiàn)顯得優(yōu)雅而簡(jiǎn)單。客戶端只需要讀取或?qū)懭霐?shù)據(jù)到存儲(chǔ)池。但是,存儲(chǔ)池在數(shù)據(jù)持久化,性能以及高可用方面發(fā)揮著重要的作用。
2.2 身份認(rèn)證
為了識(shí)別用戶并防止中間人攻擊,Ceph提供了cephx認(rèn)證系統(tǒng)來(lái)驗(yàn)證用戶和守護(hù)進(jìn)程。
注: Cephx協(xié)議并不處理傳輸中的數(shù)據(jù)加密(例如SSL/TLS)也不處理靜態(tài)數(shù)據(jù)加密。
Cephx使用共享的密鑰進(jìn)行認(rèn)證,這也意味著客戶端和mon都會(huì)有客戶端密鑰副本。認(rèn)證協(xié)議也就是雙方都能夠向?qū)Ψ阶C明他們擁有密鑰的副本,而不會(huì)實(shí)際泄露密鑰。這種方式提供了相互認(rèn)證的機(jī)制,意味著集群確信用戶擁有密鑰以及用戶確信集群擁有密鑰的副本。
2.3 PG(s)
Ceph將存儲(chǔ)池分片處理成在集群中均勻且偽隨機(jī)分布的PG。CRUSH算法將每個(gè)對(duì)象分配到一個(gè)指定的PG中,并且將每個(gè)PG分配到對(duì)應(yīng)的Acting Set集合中—也就是在Ceph客戶端和存儲(chǔ)對(duì)象副本的OSD之間創(chuàng)建一個(gè)間接層。 如果Ceph客戶端直接就能知道對(duì)象存放到具體的哪個(gè)OSD中的話,那么Ceph客戶端和Ceph OSD之間耦合性就太強(qiáng)了。
相反的,CRUSH算法會(huì)動(dòng)態(tài)的將對(duì)象分配到PG中,然后再將PG分配到一組Ceph的OSD中。有了這個(gè)間接層之后,當(dāng)新Ceph OSD加入或者Ceph OSD出現(xiàn)問(wèn)題時(shí),Ceph存儲(chǔ)集群就可以動(dòng)態(tài)的進(jìn)行數(shù)據(jù)再平衡。通過(guò)在數(shù)百到數(shù)千個(gè)放置組的環(huán)境中管理數(shù)百萬(wàn)個(gè)對(duì)象,Ceph存儲(chǔ)集群可以高效地增長(zhǎng)和收縮以及從故障中恢復(fù)。
下面的圖描述了CRUSH是如何將對(duì)象分配到PG中,以及PG分配到OSD中的。?

相對(duì)整體集群規(guī)模來(lái)說(shuō),如果存儲(chǔ)池設(shè)置的PG較少,那么在每個(gè)PG上Ceph將會(huì)存儲(chǔ)大量的數(shù)據(jù);如果存儲(chǔ)池設(shè)置的PG過(guò)大,那么Ceph OSD將會(huì)消耗更多的CPU與內(nèi)存,不管哪一種情況都不會(huì)有較好的處理性能。 所以,為每個(gè)存儲(chǔ)池設(shè)置適當(dāng)數(shù)量的PG,以及分配給集群中每個(gè)OSD的PG數(shù)量的上限對(duì)Ceph性能至關(guān)重要。
譯者注: PG是對(duì)象的集合, 在同一個(gè)集合里的對(duì)象放置規(guī)則都一樣(比如同一集合中的對(duì)象統(tǒng)一都存儲(chǔ)到osd.1、osd.5、osd.8這幾臺(tái)機(jī)器中);同時(shí),一個(gè)對(duì)象只能屬于一個(gè)PG,而一個(gè)PG又對(duì)應(yīng)于所放置的OSD列表;另外就是每個(gè)OSD上一般會(huì)分布很多個(gè)PG。
2.4 CRUSH
Ceph會(huì)將CRUSH規(guī)則集分配給存儲(chǔ)池。當(dāng)Ceph客戶端存儲(chǔ)或檢索存儲(chǔ)池中的數(shù)據(jù)時(shí),Ceph會(huì)自動(dòng)識(shí)別CRUSH規(guī)則集、以及存儲(chǔ)和檢索數(shù)據(jù)這一規(guī)則中的頂級(jí)bucket。當(dāng)Ceph處理CRUSH規(guī)則時(shí),它會(huì)識(shí)別出包含某個(gè)PG的主OSD,這樣就可以使客戶端直接與主OSD進(jìn)行連接進(jìn)行數(shù)據(jù)的讀寫。
為了將PG映射到OSD上,CRUSH 映射關(guān)系定義了bucket類型的層級(jí)列表(例如在CRUSH映射關(guān)系中的types以下部分)。創(chuàng)建bucket層級(jí)結(jié)構(gòu)的目的是通過(guò)其故障域和(或)性能域(例如驅(qū)動(dòng)器類型、hosts、chassis、racks、pdu、pods、rows、rooms、data centers)來(lái)隔離葉子節(jié)點(diǎn)。
除了代表OSD的葉子節(jié)點(diǎn)之外,層次結(jié)構(gòu)的其余部分可以是任意的,如果默認(rèn)類型不符合你的要求,可以根據(jù)自己的需要來(lái)定義它。 CRUSH支持一個(gè)有向無(wú)環(huán)圖的拓?fù)浣Y(jié)構(gòu),它可以用來(lái)模擬你的Ceph OSD節(jié)點(diǎn)在層級(jí)結(jié)構(gòu)中的分布情況。?
因此,可以在單個(gè)CRUSH映射關(guān)系中支持具有多個(gè)Root節(jié)點(diǎn)的多個(gè)層級(jí)結(jié)構(gòu)。例如,可以創(chuàng)建SSD的層級(jí)結(jié)構(gòu)、使用SSD日志的硬盤層級(jí)結(jié)構(gòu)等等。
譯者注: CRUSH的目的很明確, 就是一個(gè)PG如何與OSD建立起對(duì)應(yīng)的關(guān)系。
2.5 I/O操作
Ceph客戶端從Ceph mon獲取‘集群映射關(guān)系Cluster map,然后對(duì)存儲(chǔ)池中的對(duì)象執(zhí)行I/O操作。對(duì)于Ceph如何將數(shù)據(jù)存于目標(biāo)中來(lái)說(shuō),存儲(chǔ)池的CRUSH規(guī)則集和PG數(shù)的設(shè)置起主要的作用。擁有最新的集群映射關(guān)系,客戶端就會(huì)知道集群中所有的mon和OSD的信息。但是,客戶端并不知道對(duì)象具體的存儲(chǔ)位置(不知道對(duì)象具體存在哪個(gè)OSD上)。
對(duì)于客戶端來(lái)說(shuō),需要的輸入?yún)?shù)僅僅是對(duì)象ID和存儲(chǔ)池名稱。邏輯上也比較簡(jiǎn)單:Ceph將數(shù)據(jù)存儲(chǔ)在指定名稱的存儲(chǔ)池中(例如存儲(chǔ)池名稱為livepool)。當(dāng)客戶端想要存儲(chǔ)一個(gè)對(duì)象時(shí)(比如對(duì)象名叫 “john”、“paul”、"george”、 “ringo”等),客戶端則會(huì)以對(duì)象名、根據(jù)對(duì)象名信息計(jì)算的hash碼、存儲(chǔ)池中的PG數(shù)、以及存儲(chǔ)池名稱這些信息作為輸入?yún)?shù),然后CRUSH(可控的、可擴(kuò)展的、分布式的副本數(shù)據(jù)放置算法)就會(huì)計(jì)算出PG的ID(PG_ID)及PG對(duì)應(yīng)的主OSD信息。
譯者注:根據(jù)設(shè)置的副本數(shù)(比如3副本)則計(jì)算出的列表如(osd.1、osd.3、osd.8), 這里的第一個(gè)osd.1就是主OSD。
Ceph客戶端經(jīng)過(guò)以下步驟來(lái)計(jì)算出PG ID信息。
客戶端輸入存儲(chǔ)池ID以及對(duì)象ID(例如,存儲(chǔ)池pool=”liverpool”, 對(duì)象ID=”john”)。
CRUSH獲取對(duì)象ID后對(duì)其進(jìn)行HASH編碼。
CRUSH根據(jù)上一步的HASH編碼與PG總數(shù)求模后得到PG的ID。(譯者注:例如HASH編碼后為186,而PG總數(shù)為128,則求模得58,所以這個(gè)對(duì)象會(huì)存儲(chǔ)在PG_58中;另外這也可以看出PG數(shù)對(duì)存儲(chǔ)的影響,因?yàn)樯婕暗綄?duì)象與PG的映射關(guān)系,所以輕易不要調(diào)整PG數(shù))
CRUSH計(jì)算對(duì)應(yīng)PG ID的主OSD。
客戶端根據(jù)存儲(chǔ)池名稱得到存儲(chǔ)池ID(例如”liverpool”=4)。
客戶端將PG ID與存儲(chǔ)池ID拼接(例如?4.58)
客戶端直接與Activtin Set集合中的主OSD通信,來(lái)執(zhí)行對(duì)象的IO操作(例如,寫入、讀取、刪除等)。
譯者注: Pool的名稱與ID(ID=4,存儲(chǔ)池名稱為default.rgw.log)。

Ceph存儲(chǔ)集群的拓?fù)浜蜖顟B(tài)在會(huì)話(I/O上下文)期間相對(duì)比較穩(wěn)定。與客戶端在每個(gè)讀/寫操作的會(huì)話上查詢存儲(chǔ)相比,Ceph客戶端計(jì)算對(duì)象存儲(chǔ)位置的速度要更快些。CRUSH算法不但能使客戶端可以計(jì)算出對(duì)象應(yīng)當(dāng)存儲(chǔ)的位置,同時(shí)也使得客戶端可以和Acting Set集合中的主OSD直接交互來(lái)實(shí)現(xiàn)對(duì)象的存儲(chǔ)與檢索。 由于EB規(guī)模的存儲(chǔ)集群一般會(huì)有數(shù)千個(gè)OSD存儲(chǔ)節(jié)點(diǎn),所以客戶端與Ceph OSD之間的網(wǎng)絡(luò)交互并不是什么大的問(wèn)題。即使集群狀態(tài)發(fā)生變化,客戶端也可以通過(guò)Ceph mon查詢到更新的集群映射關(guān)系。
2.5.1 副本I/O
和Ceph客戶端一樣,Ceph OSD也是通過(guò)與Ceph mon交互來(lái)獲取到最新的集群映射關(guān)系。Ceph OSD也使用CRUSH算法,但是用這個(gè)算法是用來(lái)計(jì)算對(duì)象的副本應(yīng)該存儲(chǔ)在什么位置(譯者注: 客戶端用CRUSH是用來(lái)找主OSD以及計(jì)算出Acting Set列表,而OSD用CRUSH則是主OSD定位對(duì)應(yīng)的副本是誰(shuí))。
在典型的寫操作場(chǎng)景下,Ceph客戶端使用CRUSH算法計(jì)算對(duì)象所在的PG ID以及Acting Set列表中的主OSD,當(dāng)客戶端將對(duì)象寫到主OSD時(shí),主OSD會(huì)查看這個(gè)對(duì)象應(yīng)該存儲(chǔ)的副本個(gè)數(shù)(例如,osd_pool_default_size = n),然后主OSD根據(jù)對(duì)象ID、存儲(chǔ)池名稱、集群映射關(guān)系這些信息再根據(jù)CRUSH算法來(lái)計(jì)算出Acting Set列表中的從屬OSD(譯者注: 除列表中第一個(gè)OSD外,其它的都是從屬OSD)。
主OSD將對(duì)象寫入從屬OSD中,當(dāng)主OSD收到從屬OSD回復(fù)的ACK確認(rèn)并且主OSD自身也完成了寫操作后,主OSD才會(huì)給Ceph客戶端回復(fù)真正寫入成功的ACK確認(rèn)。

通過(guò)有代表性的Ceph客戶端(主OSD)執(zhí)行數(shù)據(jù)復(fù)制的能力,Ceph OSD守護(hù)進(jìn)程相對(duì)的減輕了Ceph客戶端的這一職責(zé),同時(shí)確保了數(shù)據(jù)高可用以及安全性。
注:?比較典型的就是主OSD和從屬OSD在部署時(shí)會(huì)將故障域進(jìn)行隔離(比如不同時(shí)配置到一個(gè)rack上或一個(gè)row上,亦或是同一個(gè)node上)。CRUSH計(jì)算從屬OSD的ID也會(huì)考慮故障域信息。
2.5.2 糾刪碼I/O
糾刪碼實(shí)際上是一種前向錯(cuò)誤糾正編碼,這種編碼會(huì)將K個(gè)數(shù)據(jù)塊通過(guò)補(bǔ)充N個(gè)編碼塊的方式,將原始數(shù)據(jù)擴(kuò)展為更長(zhǎng)的消息編碼,以便當(dāng)N個(gè)數(shù)據(jù)塊出現(xiàn)問(wèn)題時(shí)數(shù)據(jù)依舊不會(huì)丟失。隨著時(shí)間的推移,開發(fā)了不同的糾刪編碼算法,其中最早和最常用的算法之一是Reed-Solomon算法。
可以通過(guò)等式?N = K + M?對(duì)這一算法進(jìn)行理解,等式中?K?表示數(shù)據(jù)塊的個(gè)數(shù),M?代表了編碼塊的個(gè)數(shù),而?N?則是在?糾刪編碼?過(guò)程中創(chuàng)建的總的塊的個(gè)數(shù)。值?M?可以簡(jiǎn)化為?N – K?,也就是說(shuō)在計(jì)算原始的K個(gè)數(shù)據(jù)塊時(shí)?N – K?個(gè)冗余塊也一并需要計(jì)算出來(lái)。這種方法保證只要N個(gè)塊中的K有效就可以訪問(wèn)所有原始數(shù)據(jù)。換句話說(shuō),即使有?N – K?個(gè)塊出現(xiàn)了故障,對(duì)外提供服務(wù)的數(shù)據(jù)仍舊是沒(méi)有問(wèn)題的。
例如配置(N=16,K=10)或者糾刪編碼 10/16,10個(gè)基本的塊(K)中會(huì)有額外補(bǔ)充的6個(gè)塊(?M = K-N, 如16-10 = 6?) 。這16個(gè)塊(N)可能對(duì)應(yīng)16個(gè)OSD。即使有6個(gè)OSD出現(xiàn)問(wèn)題,原始文件也可以從這10個(gè)已經(jīng)驗(yàn)證的數(shù)據(jù)塊中重建恢復(fù)。這就意味著不會(huì)有任何的數(shù)據(jù)丟失,因此糾刪碼也具備比較高的容錯(cuò)能力。
和副本存儲(chǔ)池類似,糾刪碼存儲(chǔ)池也是由up set列表中的主OSD來(lái)接收所有的寫操作。在副本存儲(chǔ)池中,Ceph對(duì)PG中的每個(gè)對(duì)象在從屬OSD上都會(huì)有一份一樣的數(shù)據(jù)對(duì)象;而對(duì)于糾刪碼存儲(chǔ)池來(lái)說(shuō),可能略有不同。每個(gè)糾刪碼存儲(chǔ)池都會(huì)以?K+M?個(gè)塊來(lái)存儲(chǔ)每一個(gè)對(duì)象。
對(duì)象(的數(shù)據(jù)內(nèi)容)會(huì)被切分成?K?個(gè)數(shù)據(jù)塊以及?M個(gè)編碼塊。糾刪碼存儲(chǔ)池創(chuàng)建時(shí)也需要配置成?K+M?的大小(size)以便每個(gè)塊都可以存儲(chǔ)到Activtin Set列表中的每個(gè)OSD上。對(duì)象的屬性存儲(chǔ)這些塊的等級(jí)。主OSD負(fù)責(zé)數(shù)據(jù)劃分到?K+M?個(gè)塊的糾刪編碼以及將這些編碼信息發(fā)送到其它的OSD上。同時(shí)主OSD也會(huì)維護(hù)PG的權(quán)威日志(譯者注: 權(quán)威日志實(shí)際是一種進(jìn)度控制機(jī)制,尤其當(dāng)某些節(jié)點(diǎn)出現(xiàn)問(wèn)題時(shí),可以根據(jù)權(quán)威日志進(jìn)行數(shù)據(jù)的恢復(fù))。
例如,使用5個(gè)OSD?(K + M = 5)?創(chuàng)建糾刪碼存儲(chǔ)池,支持其中2個(gè)?(M = 2)?塊的數(shù)據(jù)丟失。
將對(duì)象寫入糾刪碼存儲(chǔ)池中的時(shí)候(比如對(duì)象名叫?NYAN,內(nèi)容為?ABCDEFGHI?)糾刪碼計(jì)算函數(shù)會(huì)將對(duì)象的內(nèi)容按長(zhǎng)度平分成3個(gè)塊(即,分成K個(gè)數(shù)據(jù)塊),第一個(gè)塊內(nèi)容為?ABC?, 第二個(gè)塊內(nèi)容為DEF?, 第三個(gè)塊內(nèi)容為?GHI?, 如果塊內(nèi)長(zhǎng)度不是?K?的倍數(shù),那么平分后最后的一塊所剩余的空位就會(huì)進(jìn)行填充以使其長(zhǎng)度為K(比如內(nèi)容串為ABCDEFGHIJ,則3個(gè)數(shù)據(jù)塊內(nèi)容依次為ABCD、EFGH、IJ..,最后的IJ長(zhǎng)度不夠就會(huì)填充);除了將內(nèi)容按K切分外, 糾刪碼函數(shù)也要?jiǎng)?chuàng)建另外2個(gè)編碼塊,即第4個(gè)塊內(nèi)容為?XYZ?,第5個(gè)塊內(nèi)容為?GQC?。
這里的每一個(gè)塊內(nèi)容都對(duì)應(yīng)Action Set列表中的一個(gè)OSD。 這些塊有相同的名稱都叫?NYAN?, 但塊存在不同的OSD中。除了名稱之外,數(shù)據(jù)塊創(chuàng)建的對(duì)應(yīng)序號(hào)需要存儲(chǔ)在對(duì)象的屬性中(?shard_t?) 。 包括?ABC?內(nèi)容的第一個(gè)塊存儲(chǔ)在?OSD5?上,而包括?YXY?內(nèi)容的第4個(gè)塊則存儲(chǔ)在?OSD3?上。

譯者注: 注意上圖中,5個(gè)塊的名稱都叫NYAN,每個(gè)塊的內(nèi)容為K個(gè)均分的內(nèi)容, 同時(shí)被切分后的每個(gè)塊都有一個(gè)唯一序號(hào)shard, 每個(gè)塊都對(duì)應(yīng)不同的OSD,即塊按HOST進(jìn)行故障域隔離。
譯者注: ?比如以下配置及圖例中,K=4, M=2 并且以rack作為故障域)

如果從糾刪碼存儲(chǔ)池中讀取對(duì)象?NYAN, 解碼函數(shù)需要讀取3個(gè)塊: 包括ABC?的第一個(gè)塊, 包括GHI?的第3個(gè)塊以及包括YXY?的第4個(gè)塊;然后重構(gòu)出對(duì)象的內(nèi)容ABCDEFGHI?。解碼函數(shù)來(lái)通知第2個(gè)塊和第5個(gè)塊缺失(一般稱為糾刪或擦寫)。
可在這2個(gè)缺失的塊中,第5個(gè)塊缺失可能因?yàn)镺SD4?狀態(tài)是OUT而讀不到,只要讀到3個(gè)塊可讀的話,解碼函數(shù)就可以被調(diào)用:因?yàn)镺SD2對(duì)應(yīng)的是最慢的塊,所以讀取時(shí)排除掉不在考慮之內(nèi)。
將數(shù)據(jù)拆分成不同的塊是獨(dú)立于對(duì)象放置規(guī)則的。CRUSH規(guī)則集和糾刪碼存儲(chǔ)池配置決定了塊在OSD上的放置。例如,在配置中如果使用lrc(局部可修復(fù)編碼)插件來(lái)創(chuàng)建額外塊的話,那么恢復(fù)數(shù)據(jù)的話則需要更少的OSD。
例如lrc配置信息: K=4、M=2、L=3?中,使用jerasure插件庫(kù)來(lái)創(chuàng)建6個(gè)塊(K+M),但局部值(L=3?)則要求需要再創(chuàng)建2個(gè)局部塊。額外創(chuàng)建的局部塊個(gè)數(shù)可以通過(guò)(K+M)/L?來(lái)計(jì)算得出。如果0號(hào)塊的OSD出現(xiàn)問(wèn)題,那么這個(gè)塊的數(shù)據(jù)可以通過(guò)塊1,塊2以及第一個(gè)局部塊進(jìn)行恢復(fù)。在這個(gè)例子中,恢復(fù)也只需要3個(gè)塊而不是5個(gè)塊。關(guān)于CRUSH、糾刪碼配置、以及插件的內(nèi)容,可以參考存儲(chǔ)策略指南。
注:?糾刪碼存儲(chǔ)池的對(duì)象映射是失效的,不能設(shè)置為有效狀態(tài)。關(guān)于對(duì)象映射的更多內(nèi)容,可以參考對(duì)象映射章節(jié)。
注:?糾刪碼存儲(chǔ)池目前公支持RADOS網(wǎng)關(guān)(RGW),對(duì)于RADOS的塊設(shè)備(RBD)目前還不支持。
2.6 自管理的內(nèi)部操作
Ceph集群也會(huì)自動(dòng)的執(zhí)行一些自身狀態(tài)相關(guān)的監(jiān)控與管理工作。例如,Ceph的OSD可以檢查集群的健康狀態(tài)并將結(jié)果上報(bào)給后端的Ceph mon;再比如,通過(guò)CRUSH算法將對(duì)象映射到PG上,再將PG映射到具體的OSD上;同時(shí),Ceph OSD也通過(guò)CRUSH算法對(duì)OSD的故障等問(wèn)題進(jìn)行自動(dòng)的數(shù)據(jù)再平衡以及數(shù)據(jù)恢復(fù)。 以下部分我們將介紹Ceph執(zhí)行的一些操作。
2.6.1 心跳
Ceph OSD加入到集群中并且將其狀態(tài)上報(bào)到Ceph mon。在底層實(shí)現(xiàn)上,Ceph OSD的狀態(tài)就是up或?yàn)閐own?,這一狀態(tài)反映的就是OSD是否運(yùn)行并為Ceph客戶端的請(qǐng)求提供服務(wù)。如果Ceph OSD在集群中的狀態(tài)是donw且為in?,那么表明此OSD是有問(wèn)題不能提供服務(wù)的;如果Ceph OSD并沒(méi)有運(yùn)行(比如服務(wù)crash掉了),那么這個(gè)Ceph OSD也不能上報(bào)給Ceph mon其自身狀態(tài)為Down?。
Ceph mon會(huì)定期的ping 這些OSD以此來(lái)確信這些OSD是否仍在運(yùn)行。當(dāng)然了,Ceph也提供了更多的機(jī)制,比如使Ceph OSD可以評(píng)判與之關(guān)聯(lián)的OSD是否狀態(tài)為down(譯者注:比如在副本OSD間相互ping狀態(tài)的關(guān)系,沒(méi)有副本關(guān)系的話,OSD之間不會(huì)建立連接亦即更不會(huì)ping彼此),以及更新Ceph的集群映射關(guān)系并上報(bào)給Ceph mon。由于OSD分擔(dān)了部分工作,所以對(duì)于Ceph mon來(lái)說(shuō),工作內(nèi)容相對(duì)要輕量很多。
2.6.2 同步
Ceph OSD守護(hù)進(jìn)程執(zhí)行同步,這里的同步指的是將存儲(chǔ)放置組(PG)的所有OSD中對(duì)象狀態(tài)(包括元數(shù)據(jù)信息)達(dá)到一致的過(guò)程。同步問(wèn)題通常都會(huì)自行解決無(wú)需人為的干預(yù)。
注:?即使Ceph mon對(duì)于OSD存儲(chǔ)PG的狀態(tài)達(dá)成一致,這也并不意味著PG擁有最新的內(nèi)容。
當(dāng)Ceph存儲(chǔ)PG到OSD的acting set列表中的時(shí)候,會(huì)將它們分別標(biāo)記為主,從等等。慣例上,Acting set列表中的第一個(gè)是主OSD,主OSD也負(fù)責(zé)協(xié)調(diào)組內(nèi)的PG進(jìn)行同步操作,這里的主OSD也是唯一?接收客戶端的寫入對(duì)象到給定PG請(qǐng)求的OSD。
當(dāng)一系列的OSD負(fù)責(zé)一個(gè)放置組PG,則這一系列的OSD,我們稱它們?yōu)橐粋€(gè)Acting Set。Acting Set可能指的是當(dāng)前負(fù)責(zé)放置組的Ceph OSD守護(hù)進(jìn)程或者某個(gè)有效期內(nèi),負(fù)責(zé)特定放置組的OSD守護(hù)進(jìn)程。
Acting Set中的部分Ceph OSD可能不會(huì)一直是up?狀態(tài)。當(dāng)Acting Set中的OSD狀態(tài)是up?狀態(tài)時(shí),那么這個(gè)OSD也是Up Set中的成員。相對(duì)Acting Set來(lái)說(shuō),Up Set是非常重要的,因?yàn)楫?dāng)OSD失敗時(shí),Ceph可以將PG重新映射到其他Ceph OSD上。
注:?對(duì)于PG包括osd.25、osd.32、osd.61的Acting Set列表,列表中第一個(gè)OSD即osd.25?是主OSD。哪果主OSD失敗,那么從屬OSD 即osd.32?就會(huì)成為新的主OSD,同時(shí)原主osd.25?也會(huì)從Up Set列表中刪除。
2.6.3 數(shù)據(jù)再平衡與恢復(fù)
當(dāng)我們向Ceph存儲(chǔ)集群中新增加Ceph OSD的時(shí)候,集群映射關(guān)系隨著新增加的OSD同時(shí)也會(huì)更新。因此,由于這一變化改變了計(jì)算CRUSH時(shí)提供的輸入?yún)?shù),所以也就間接的改變了對(duì)象的放置位置。CRUSH算法是偽隨機(jī)的,但會(huì)均勻的放置數(shù)據(jù)。所以集群中新增加一臺(tái)OSD時(shí),也只會(huì)有一小部分的數(shù)據(jù)發(fā)生遷移。一般遷移的數(shù)據(jù)量是集群總數(shù)據(jù)量與OSD數(shù)量的比值(例如,在有50個(gè)OSD的集群中,當(dāng)新增加一臺(tái)OSD時(shí)也只有1/50 或者2%的數(shù)據(jù)受到遷移影響)。
下面的圖示描述了部分的PG(非全部PG)從已有的OSD 1,OSD 2上遷移到新OSD 3上達(dá)到數(shù)據(jù)再平衡的過(guò)程(因?yàn)閷?duì)大型集群的影響要小得多,所以過(guò)程相對(duì)粗略一些)。 即使在再平衡過(guò)程中,CRUSH也是穩(wěn)定的。大部分的PG仍然保留著原始的配置,由于新增加了OSD,所以每個(gè)OSD都會(huì)增加一些(可用的)容量,因此在重新平衡完成后,新的OSD上也不會(huì)出現(xiàn)負(fù)載峰值的情況。

2.6.4 校驗(yàn)(或擦除)
作為Ceph中維護(hù)數(shù)據(jù)一致性以及整潔性的部分,Ceph OSD 守護(hù)進(jìn)程也可以完成PG內(nèi)的對(duì)象清理工作,意思就是Ceph OSD守護(hù)進(jìn)程比較副本間PG內(nèi)的對(duì)象元數(shù)據(jù)信息。校驗(yàn)/擦除(通常是天級(jí)別的調(diào)度策略)捕獲異常或文件系統(tǒng)的一些錯(cuò)誤。同時(shí),Ceph OSD守護(hù)進(jìn)程也可以進(jìn)行更深層次的比較(對(duì)象數(shù)據(jù)本身的按位比較),而這種深層次的比較(可以發(fā)現(xiàn)驅(qū)動(dòng)盤上壞的扇區(qū))一般是周級(jí)別的調(diào)度策略。
2.7 高可用
除了通過(guò)CRUSH算法實(shí)現(xiàn)高可擴(kuò)展性外,Ceph也需要支持高可用性。這就意味著即使集群處于降級(jí)狀態(tài)或某個(gè)Ceph mon出現(xiàn)問(wèn)題情況下(譯者注:這里出問(wèn)題的mon個(gè)數(shù)不能超過(guò)mon總數(shù)的一半,否則集群會(huì)阻塞所有操作),客戶端仍舊可以進(jìn)行數(shù)據(jù)的讀寫。
2.7.1 數(shù)據(jù)副本
在副本存儲(chǔ)池中,Ceph需要對(duì)象的多個(gè)副本在降級(jí)狀態(tài)下運(yùn)行。理想情況下,即使Acting Set中的一個(gè)OSD出現(xiàn)問(wèn)題,Ceph存儲(chǔ)集群也可以支持客戶端讀寫操作。基于此,Ceph默認(rèn)也是一個(gè)對(duì)象保持3副本的設(shè)置,寫操作則要求至少2個(gè)副本為clean狀態(tài)(譯者注: 具體設(shè)置多少個(gè)副本為clena才支持寫操作,這要依賴于設(shè)置存儲(chǔ)池時(shí)的配置,例如,在ceph osd dump | grep pool輸出中的replicated size 3 min_size 2,這里的2就是至少有多少個(gè)副本為clean,在這個(gè)存儲(chǔ)池上的寫操作才被支持,而這個(gè)值是可以再更新的)。
如果有2個(gè)OSD出現(xiàn)問(wèn)題,Ceph仍然可以保留數(shù)據(jù)不會(huì)丟失,但是就不能進(jìn)行寫操作了。
在糾刪碼存儲(chǔ)池中,Ceph需要多個(gè)OSD來(lái)存儲(chǔ)對(duì)象分割后的塊以便在降級(jí)狀態(tài)仍然可以操作。與副本存儲(chǔ)池類似,理想情況下,在降級(jí)狀態(tài)下糾刪碼存儲(chǔ)池也支持Ceph客戶端進(jìn)行讀寫操作。基于此,我們則建議設(shè)置K+M=5?通過(guò)5個(gè)OSD來(lái)存儲(chǔ)塊信息,同時(shí)設(shè)置M=2?以保證即使2個(gè)OSD出現(xiàn)問(wèn)題也可以根據(jù)剩余的OSD進(jìn)行數(shù)據(jù)的恢復(fù)重建。
2.7.2 Mon集群
在客戶端進(jìn)行數(shù)據(jù)讀寫之前,客戶端必須從Ceph mon端獲取最新的集群映射關(guān)系。一個(gè)Ceph存儲(chǔ)集群可以與一臺(tái)mon進(jìn)行通信發(fā)起操作,然而這就存在單點(diǎn)問(wèn)題(例如這個(gè)單點(diǎn)的mon出現(xiàn)問(wèn)題,Ceph客戶端則不能進(jìn)行數(shù)據(jù)的讀寫)。
為了提供服務(wù)的可靠性以及容錯(cuò)性,Ceph支持mon組成集群方式提供服務(wù)。在mon集群中,延遲和其他的故障可能導(dǎo)致一個(gè)或多個(gè)mon落后于集群當(dāng)前的狀態(tài)。基于此,Ceph必須在集群狀態(tài)的各種mon實(shí)例之間達(dá)成一致。對(duì)于集群當(dāng)前的狀態(tài),Ceph也總是使用大多數(shù)的mon(例如: 1、2:3、3:5、4:6等等)或者Paxos算法進(jìn)行一致性確認(rèn)。同時(shí),mon集群內(nèi)機(jī)器間也需要NTP時(shí)間服務(wù)防止時(shí)鐘漂移。
2.7.3 CephX
Cephx?認(rèn)證協(xié)議的操作方式與Kerberos類似。用戶、角色調(diào)用Ceph客戶端來(lái)與mon交互,不像Kerberos,每一個(gè)monitor都可以對(duì)用戶進(jìn)行認(rèn)證并分發(fā)密鑰,所以使用cephx?不存在單點(diǎn)問(wèn)題或瓶頸。mon返回類似于Kerberos的包含會(huì)話密鑰信息的結(jié)構(gòu)以便調(diào)用方可以根據(jù)密鑰對(duì)接Ceph的所提供的服務(wù)。這里的會(huì)話密鑰本身使用了用戶的永久密鑰進(jìn)行加密,因此只有用戶自已才可以從Ceph mon請(qǐng)求服務(wù)。
客戶端使用會(huì)話密鑰從monitor處獲取想要的服務(wù),mon則通過(guò)認(rèn)證使得客戶端有權(quán)限對(duì)接OSD來(lái)完成數(shù)據(jù)交互。Ceph mon和OSD共享一個(gè)秘鑰,因此客戶端可以使用mon提供的憑證與群集中的任何OSD或元數(shù)據(jù)服務(wù)器進(jìn)行交互。和Kerberos類似,cephx?憑證也有超時(shí)時(shí)間,所以并不能使用一個(gè)超時(shí)的憑證偷偷的對(duì)集群進(jìn)行攻擊。只要用戶的密鑰在到期前不泄露的話,這種身份認(rèn)證的形式可以防止攻擊者以其他用戶的身份創(chuàng)建偽造消息或更改其他用戶的合法消息訪問(wèn)通信介質(zhì)。
如果使用Cephx?認(rèn)證,管理員必須先設(shè)置用戶。在下面的圖示中,client.admin?用戶通過(guò)命令行執(zhí)行ceph auth get-or-create-key?命令,創(chuàng)建用戶以及密鑰。Ceph的auth?子系統(tǒng)生成用戶名以及密鑰,并將其存于mon中以及將用戶名與密鑰返回給調(diào)用命令的client.admin?用戶。 這也就意味著客戶端與mon共享同一個(gè)密鑰。
注:?client.admin?用戶必須以安全的方式向用戶提供用戶ID和密鑰。

第3章 客戶端架構(gòu)
Ceph客戶端在數(shù)據(jù)存儲(chǔ)的接口方面還是存在比較大的差異的。Ceph的塊設(shè)備提供了可以像掛載本地物理驅(qū)動(dòng)盤一樣的塊存儲(chǔ),而Ceph對(duì)象網(wǎng)關(guān)則通過(guò)用戶的管理提供了兼容S3與Swift的Restful對(duì)象存儲(chǔ)接口。而對(duì)于這些接口,都是使用的RADOS(可靠且自動(dòng)分布式的對(duì)象存儲(chǔ))協(xié)議與Ceph存儲(chǔ)集群進(jìn)行的交互;同時(shí)這些接口也都有一些相同的基本前提:
Ceph配置文件,或集群名稱(通常為ceph?)與mon地址
存儲(chǔ)池名稱
用戶名以及密鑰的路徑
Ceph客戶傾向于遵循一些類似的模式,例如對(duì)象的監(jiān)視-通知以及條帶化。下面大概介紹下Ceph客戶端里使用的RADOS,librados以及常見(jiàn)的模式。
3.1 本地協(xié)議與Librados
現(xiàn)代的應(yīng)用需要有異步通信能力簡(jiǎn)單的對(duì)象存儲(chǔ)接口,Ceph存儲(chǔ)集群就有這個(gè)能力并提供簡(jiǎn)單的接口。此接口提供了對(duì)集群直接、并行的對(duì)象存取。
存儲(chǔ)池操作
快照
讀、寫對(duì)象
– 創(chuàng)建或刪除
– 整個(gè)對(duì)象或字節(jié)范圍
– 追加或截?cái)?/span>創(chuàng)建/設(shè)置/獲取/刪除 XATTRs
創(chuàng)建/設(shè)置/獲取/刪除 K/V對(duì)
復(fù)合操作和雙重ack語(yǔ)義
3.2 對(duì)象的監(jiān)視與通知
Ceph客戶端可以為對(duì)象注冊(cè)持久的關(guān)注點(diǎn),并保持與主OSD的會(huì)話開啟。客戶端可以向所有觀察者發(fā)送通知消息和數(shù)據(jù),并在觀察者收到通知時(shí)接收通知。這使得客戶端可以使用任何對(duì)象作為同步/通信的通道。

3.3 獨(dú)占鎖
獨(dú)占鎖提供一種功能特性:任一客戶端可以對(duì)RBD中資源進(jìn)行’排它的’鎖定(如果有多個(gè)終端對(duì)同一RBD資源進(jìn)行操作時(shí))。這有助于解決當(dāng)有多個(gè)客戶端嘗試寫入同一對(duì)象時(shí)發(fā)生沖突的場(chǎng)景。此功能基于前一節(jié)中介紹的對(duì)象的監(jiān)視與通知。因此,在寫入時(shí),如果一個(gè)客戶端首先在對(duì)象上建立獨(dú)占鎖,那么其它的客戶端如果想寫入數(shù)據(jù)的話就需要在寫入前先檢查是否在對(duì)象上已經(jīng)放置了獨(dú)占鎖。
設(shè)置了這一特性的話,同一時(shí)刻只有一個(gè)客戶端能夠?qū)BD資源進(jìn)行修改,尤其像快照創(chuàng)建與刪除這種改變RBD內(nèi)部結(jié)構(gòu)的時(shí)候。這一特性對(duì)于失敗的客戶端也起到了一些保護(hù)的作用,例如,虛擬機(jī)沒(méi)有響應(yīng)了,然后在其他地方使用同一塊磁盤啟動(dòng)它的副本,那么這個(gè)無(wú)響應(yīng)的虛擬機(jī)將在Ceph中被列入黑名單,并且無(wú)法破壞新的虛擬機(jī)中數(shù)據(jù)。
強(qiáng)制的獨(dú)占鎖功能特性默認(rèn)是不開啟的,但是可以在創(chuàng)建鏡象時(shí)顯示的通過(guò)加入–image-features參數(shù)來(lái)開啟這一特性,例如:
rbd -p mypool create myimage –size 102400 –image-features 5
這里的5是1與4的和值, 其中1使得分層特性生效,4使得獨(dú)占鎖特性生效。所以執(zhí)行上面這個(gè)命令后會(huì)創(chuàng)建100GB的RBD鏡象,同時(shí)既支持分層特性也支持獨(dú)占鎖特性。
強(qiáng)制的獨(dú)占鎖也是后面提到的對(duì)象索引映射使用的前提。如果沒(méi)有開啟強(qiáng)制的獨(dú)占鎖,那么對(duì)象索引映射也不會(huì)生效。
獨(dú)占鎖也為mirror這塊內(nèi)容做了不少的工作。
3.4 對(duì)象映射索引
對(duì)象映射索引也是一種功能特性,可以在客戶端寫入rbd映像時(shí)跟蹤RADOS對(duì)象是否已經(jīng)存在了。當(dāng)有寫入操作時(shí),寫操作被轉(zhuǎn)義為RADOS對(duì)象中的偏移,如果對(duì)象映射索引功能開啟那么對(duì)于存在的RADOS對(duì)象就會(huì)被跟蹤到。所以當(dāng)對(duì)象已經(jīng)存在時(shí)我們就可以提前知道。對(duì)象映射索引保存在librbd客戶端機(jī)器內(nèi)存中,所以對(duì)于不存在的對(duì)象就省去了再去查詢OSD的這一步開銷。對(duì)象映射索引對(duì)于一些操作還是比較有利的,即:
調(diào)整大小
導(dǎo)出操作
復(fù)制操作
扁平化
刪除
讀取
縮小操作就像是對(duì)尾部對(duì)象的部分刪除。導(dǎo)出操作知道哪些對(duì)象被RADOS請(qǐng)求。復(fù)制操作知道哪些對(duì)象存在并需要復(fù)制。它不需要遍歷潛在的數(shù)百或數(shù)千個(gè)可能的對(duì)象。扁平化操作將所有父對(duì)象拷貝到克隆中,以便可以將克隆與父項(xiàng)分離,即可以刪除從子克隆到父快照的引用。因此,不是對(duì)所有潛在的對(duì)象,僅是對(duì)存在的對(duì)象進(jìn)行復(fù)制。
刪除操作僅刪除鏡象中存在的對(duì)象。讀取操作對(duì)于不存在的對(duì)象會(huì)直接跳過(guò)。因此,對(duì)于調(diào)整大小(僅縮小)、導(dǎo)出操作、復(fù)制操作、扁平化和刪除等操作,這些操作需要針對(duì)所有可能受到影響的RADOS對(duì)象(無(wú)論它們是否存在)發(fā)布操作。如果啟用對(duì)象映射索引特性的話,對(duì)象若不存在就不需要發(fā)布操作了。
例如,我們有一個(gè)RBD鏡象,有1TB的數(shù)據(jù)且比較稀疏,可能擁有數(shù)百或數(shù)千個(gè)RADOS對(duì)象。如果不開啟對(duì)象映射索引的話,執(zhí)行刪除操作則需要對(duì)每一個(gè)潛在的目標(biāo)對(duì)象發(fā)布刪除對(duì)象操作;但是如果開啟了這一特性,那么只需要對(duì)真正存在的對(duì)象發(fā)布一個(gè)刪除對(duì)象的操作就可以了。
對(duì)象映射索引對(duì)于克隆是比較有價(jià)值的(自身沒(méi)有實(shí)際對(duì)象但可以從父對(duì)象那獲取)。當(dāng)有一個(gè)克隆的鏡象時(shí),克隆初始并沒(méi)有什么對(duì)象,所有對(duì)克隆對(duì)象的讀操作都會(huì)重定向到父對(duì)象中。開啟對(duì)象映射索引可以改善讀操作,首先對(duì)于克隆對(duì)象向OSD發(fā)布讀操作,如果讀失敗了,那么再向克隆對(duì)象的父對(duì)象發(fā)布讀操作。讀操作會(huì)直接忽略掉根本不存在的對(duì)象。
對(duì)象映射索引默認(rèn)是不開啟的,但是可以在創(chuàng)建鏡象時(shí)顯示的通過(guò)加入–image-features參數(shù)來(lái)開啟這一特性。同時(shí)獨(dú)占鎖?也是對(duì)象映射索引功能特性的使用前提。如果不開啟獨(dú)占鎖功能特性則對(duì)象映射索引也不會(huì)生效。創(chuàng)建鏡象時(shí)如果開啟對(duì)象映射索引,可以執(zhí)行:
rbd -p mypool create myimage –size 102400 –image-features 13
這里的13是1、4、8的和值, 其中1?使得分層特性生效,4?使得獨(dú)占鎖特性生效,8?使得對(duì)象映射索引特性生效。所以執(zhí)行上面這個(gè)命令后會(huì)創(chuàng)建100GB的RBD鏡象,同時(shí)既支持分層特性也支持獨(dú)占鎖特性和對(duì)象映射索引特性。
3.5 數(shù)據(jù)條帶化
存儲(chǔ)設(shè)備一般在吞吐量上都有限制,這就會(huì)影響到服務(wù)的性能和伸縮性。因此,存儲(chǔ)系統(tǒng)一般會(huì)提供條帶化方案來(lái)提高性能與吞吐能力(即,將有序的信息分割成多個(gè)區(qū)段后存儲(chǔ)到多個(gè)設(shè)備上)。關(guān)于條帶化最常見(jiàn)的就是RAID(譯者注: 磁盤陣列RAID,意為將多個(gè)磁盤組合成一個(gè)容量更大的磁盤組,利用單塊盤存儲(chǔ)的疊加效果來(lái)提升整個(gè)磁盤存儲(chǔ)冗余能力。采用這種方案后,將存儲(chǔ)的數(shù)據(jù)切割成許多個(gè)區(qū)段數(shù)據(jù),然后分別存放在各個(gè)硬盤上)。與Ceph中條帶化最相似的RAID類型就是RAID 0或’條帶化卷’。Ceph的條帶化提供了RAID 0級(jí)的吞吐能力以及n路RAID鏡像的可靠性和快速的數(shù)據(jù)恢復(fù)能力。
Ceph提供3種客戶端對(duì)接類型: Ceph塊設(shè)備(CephRBD)、Ceph文件系統(tǒng)(CephFS)、Ceph對(duì)象存儲(chǔ)(一般是Ceph RGW)。數(shù)據(jù)存儲(chǔ)方面,Ceph客戶端會(huì)將用戶提交的數(shù)據(jù)轉(zhuǎn)換為Ceph存儲(chǔ)集群內(nèi)部的格式存儲(chǔ)到集群中,在提供給用戶的接口上也是按照這3種類型完成的:塊設(shè)備鏡像、對(duì)象存儲(chǔ)的RESTful接口、以及CephFS系統(tǒng)目錄。
提示:?存儲(chǔ)在Ceph存儲(chǔ)集群中的對(duì)象自身并沒(méi)有條帶化。 Ceph對(duì)象存儲(chǔ),Ceph塊設(shè)備和Ceph文件系統(tǒng)將客戶端數(shù)據(jù)條帶化后存儲(chǔ)在Ceph集群內(nèi)的多個(gè)對(duì)象中。如果想充分發(fā)揮并行能力,使用librados庫(kù)直接將數(shù)據(jù)寫入到Ceph存儲(chǔ)集群的Ceph客戶端必須執(zhí)行條帶化(以及并行I/O)。
最簡(jiǎn)單的Ceph條帶化格式即為條帶數(shù)量為1的單個(gè)對(duì)象。 Ceph客戶端將條帶單元塊寫入到Ceph存儲(chǔ)集群對(duì)象中,直到對(duì)象達(dá)到其最大容量,然后再為額外的條帶化數(shù)據(jù)創(chuàng)建另一個(gè)對(duì)象。對(duì)于較小的塊設(shè)備鏡像、S3或Swift對(duì)象來(lái)說(shuō),這種簡(jiǎn)單的條帶化方式可能就完全能夠滿足需求,然而,這種簡(jiǎn)單的形式并沒(méi)有最大限度的利用Ceph在整個(gè)放置組中分布數(shù)據(jù)的能力,因此并不能有較大的性能提升。下面圖示描述了這種最簡(jiǎn)單的條帶化方式:
?
譯者注: 例如每一個(gè)對(duì)象存儲(chǔ)上限是4M,同時(shí)每一個(gè)單元塊占1M,這時(shí)我們有一個(gè)8M大小的文件想進(jìn)行存儲(chǔ),這樣前4M存儲(chǔ)在對(duì)象0中,后4M就創(chuàng)建另一個(gè)對(duì)象1來(lái)存儲(chǔ)。
如果可以預(yù)知存儲(chǔ)需求為較大的圖像,或較大的S3對(duì)象或Swift對(duì)象(例如視頻),若想有較大的讀寫性能提升,則可以通過(guò)將客戶端數(shù)據(jù)條帶化分割存儲(chǔ)到多個(gè)對(duì)象上。如果客戶端將條帶單元塊并行的寫入到對(duì)應(yīng)對(duì)象中,由于對(duì)象映射到不同的PG上進(jìn)而會(huì)映射到不同的OSD上,每個(gè)寫操作都以最大化速并行進(jìn)行,那么寫性能的提升是相當(dāng)明顯的。
如果完全只對(duì)一塊磁盤寫入操作的話,受限就比較多: 磁頭的移動(dòng)(例如每次6ms的尋址時(shí)間開銷)、設(shè)備的帶寬(例如每秒最大100MB)。通過(guò)擴(kuò)展多個(gè)對(duì)象上的寫入(映射到不同的PG以及OSD上),Ceph不但可以降低每個(gè)驅(qū)動(dòng)盤的尋址時(shí)間,同時(shí)也可以合并多個(gè)驅(qū)動(dòng)盤的吞吐能力以獲取更快的讀寫速度。
注:?條帶化獨(dú)立于對(duì)象的副本。由于CRUSH跨OSD復(fù)制對(duì)象,所以條帶化也會(huì)自動(dòng)完成復(fù)制。
在下面的圖示中,客戶端跨越對(duì)象集(對(duì)象集 1)來(lái)獲取條帶數(shù)據(jù)。對(duì)象集中由4個(gè)對(duì)象組成,第1個(gè)條帶單元塊是存儲(chǔ)在object 0中的stripe unit 0,第4個(gè)條帶單元塊是存儲(chǔ)在?object 3中的stripe unit 3。當(dāng)寫完第4個(gè)單無(wú)塊時(shí),客戶端會(huì)判斷對(duì)象集是否已滿,如果沒(méi)有滿的話,客戶端繼續(xù)將條帶單元塊寫入第1個(gè)對(duì)象中(下圖中的object 0)。如果對(duì)象集已滿,那么客戶端就會(huì)創(chuàng)建一個(gè)新的對(duì)象集(下圖中的對(duì)像集 2),然后將第1個(gè)條帶單元塊(stripe unit 16)寫入到新對(duì)象集中的第1個(gè)對(duì)象中(下圖中的object 4)。

Ceph數(shù)據(jù)條帶化過(guò)程中,有3個(gè)比較重要的參數(shù)會(huì)對(duì)條帶化產(chǎn)生影響:
對(duì)象大小:Ceph存儲(chǔ)集群中可以配置對(duì)象大小的上限值(比如2M、4M等),對(duì)象大小也應(yīng)該足夠的大以便與條帶單元塊相適應(yīng),同時(shí)設(shè)置對(duì)象的大小也應(yīng)該是單元塊大小的倍數(shù)。Red Hat則建議對(duì)象大小比較合理的值是16MB。
條帶寬度:條帶化中的單元塊大小也是可配置的(例如64kb)。Ceph客戶端將寫入對(duì)象的數(shù)據(jù)劃分為相同大小的條帶單元塊(因?yàn)閷懭氲臄?shù)據(jù)不一定是單元塊的倍數(shù),所以最后剩余的一個(gè)單元塊可能大小與其它的不一樣)。條帶寬度應(yīng)該是對(duì)象大小的一個(gè)分?jǐn)?shù)(比如對(duì)象是4M,單元塊是1M,則一個(gè)對(duì)象能包含4個(gè)單元塊),以便對(duì)象可以包含更多條帶單元塊。(譯者注:條帶寬度也是指同時(shí)可以并發(fā)讀或?qū)懙臈l帶數(shù)量。一般這個(gè)數(shù)量等于RAID中的物理硬盤數(shù)量)
條帶數(shù)量:根據(jù)條帶數(shù)量,Ceph客戶端將一批條帶單元塊寫入到一系列對(duì)象中。這里的一系列對(duì)象也就是對(duì)象集。在Ceph客戶端寫入對(duì)象集中最后一個(gè)對(duì)象之后會(huì)返回到對(duì)象集中的第1個(gè)對(duì)象。
重要提示:?在服務(wù)上線生產(chǎn)環(huán)境前,最好對(duì)條帶化進(jìn)行性能上的測(cè)試,因?yàn)橐坏?shù)據(jù)寫入,就無(wú)法再更改條帶參數(shù)信息了。
一旦Ceph客戶端將條帶化數(shù)據(jù)映射到條帶單元塊上,進(jìn)而映射到對(duì)象上,在對(duì)象最終以文件形式存儲(chǔ)在磁盤上之前,Ceph的CRUSH算法會(huì)將對(duì)象映射到PG中,然后再將PG映射到OSD守護(hù)進(jìn)程中。
注:?由于客戶端寫入單個(gè)存儲(chǔ)池中,因此條帶化到對(duì)象中的所有數(shù)據(jù)都會(huì)映射到同一個(gè)存儲(chǔ)池的PG內(nèi)。所以也會(huì)使用相同的CRUSH映射關(guān)系以及相同的訪問(wèn)控制策略。
譯者注:?在Ceph存儲(chǔ)中,涉及條帶化的主要是Order、stripe_unit和stripe_count這3個(gè)參數(shù)。由這3個(gè)參數(shù)確定了數(shù)據(jù)的寫入與存儲(chǔ)編排方式。默認(rèn)情況order是22,也即對(duì)象大小為4MB(2的22次方),strip_unit大小與對(duì)象大小一致(也是4M),strip_count為1(對(duì)象集中只有1個(gè)對(duì)象)。
第4章 加密相關(guān)
LUKS磁盤加密及帶來(lái)的好處:?在Linux系統(tǒng)中,可以使用LUKS方法對(duì)磁盤分區(qū)進(jìn)行加密,由于LUKS是對(duì)整個(gè)塊設(shè)備進(jìn)行加密,所以對(duì)于便攜式存儲(chǔ)能夠起到較好的數(shù)據(jù)保護(hù)作用。
可以使用Ceph-ansible工具創(chuàng)建加密的OSD存儲(chǔ)節(jié)點(diǎn),這樣可以對(duì)OSD上存儲(chǔ)的數(shù)據(jù)進(jìn)行保護(hù)。更詳細(xì)的內(nèi)容可以參考
如何使用ceph-ansible創(chuàng)建加密的磁盤分區(qū):?在OSD安裝過(guò)程中,ceph-ansible會(huì)調(diào)用ceph-disk工具來(lái)完成創(chuàng)建加密分區(qū)的工作。
除了數(shù)據(jù)和日志分區(qū)外(Ceph data和ceph journal),ceph-disk?工具也會(huì)創(chuàng)建一個(gè)小的密碼箱分區(qū)以及名稱為cephx client.osd-lockbox?的用戶。ceph密碼箱分區(qū)包含一個(gè)密鑰文件,client.osd-lockbox?用戶使用這個(gè)密鑰文件獲取LUKS私鑰,從而對(duì)ceph data和ceph journal分區(qū)進(jìn)行解密。
之后,Ceph-disk會(huì)再調(diào)用cryptsetup?工具為ceph data和ceph journal分區(qū)創(chuàng)建2個(gè)dm-crypt設(shè)備。其中dm-crypt設(shè)備使用ceph data和ceph journal的GUID作為標(biāo)識(shí)。
Ceph-ansible如何處理LUKS密鑰: Ceph-ansible工具將LUKS私鑰存儲(chǔ)在Ceph monitor監(jiān)視器的K/V存儲(chǔ)中。每個(gè)OSD都有自己的密鑰將存儲(chǔ)在dm-crypt設(shè)備上加密的OSD數(shù)據(jù)和日志進(jìn)行解密。加密分區(qū)在服務(wù)啟動(dòng)時(shí)就自動(dòng)的進(jìn)行了解密操作。

轉(zhuǎn)載申明:轉(zhuǎn)載本號(hào)文章請(qǐng)注明作者和來(lái)源,本號(hào)發(fā)布文章若存在版權(quán)等問(wèn)題,請(qǐng)留言聯(lián)系處理,謝謝。
推薦閱讀
更多架構(gòu)相關(guān)技術(shù)知識(shí)總結(jié)請(qǐng)參考“架構(gòu)師技術(shù)全聯(lián)盟書店”相關(guān)電子書(35本技術(shù)資料打包匯總詳情可通過(guò)“閱讀原文”獲取)。
內(nèi)容持續(xù)更新,現(xiàn)下單“架構(gòu)師技術(shù)全店打包匯總(全)”,后續(xù)可享全店內(nèi)容更新“免費(fèi)”贈(zèng)閱,格僅收188元(原總價(jià)270元)。
溫馨提示:
掃描二維碼關(guān)注公眾號(hào),點(diǎn)擊閱讀原文鏈接獲取“架構(gòu)師技術(shù)全店資料打包匯總(全)”電子書資料詳情。

