Ceph基礎(chǔ)知識(shí)和基礎(chǔ)架構(gòu)認(rèn)識(shí)

作者:luohaixian

來源:博客園

原文:https://www.cnblogs.com/luohaixian/p/8087591.html

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

1? Ceph基礎(chǔ)介紹

Ceph是一個(gè)可靠地、自動(dòng)重均衡、自動(dòng)恢復(fù)的分布式存儲(chǔ)系統(tǒng),根據(jù)場景劃分可以將Ceph分為三大塊,分別是對(duì)象存儲(chǔ)、塊設(shè)備存儲(chǔ)和文件系統(tǒng)服務(wù)。在虛擬化領(lǐng)域里,比較常用到的是Ceph的塊設(shè)備存儲(chǔ),比如在OpenStack項(xiàng)目里,Ceph的塊設(shè)備存儲(chǔ)可以對(duì)接OpenStack的cinder后端存儲(chǔ)、Glance的鏡像存儲(chǔ)和虛擬機(jī)的數(shù)據(jù)存儲(chǔ),比較直觀的是Ceph集群可以提供一個(gè)raw格式的塊存儲(chǔ)來作為虛擬機(jī)實(shí)例的硬盤。

Ceph相比其它存儲(chǔ)的優(yōu)勢點(diǎn)在于它不單單是存儲(chǔ),同時(shí)還充分利用了存儲(chǔ)節(jié)點(diǎn)上的計(jì)算能力,在存儲(chǔ)每一個(gè)數(shù)據(jù)時(shí),都會(huì)通過計(jì)算得出該數(shù)據(jù)存儲(chǔ)的位置,盡量將數(shù)據(jù)分布均衡,同時(shí)由于Ceph的良好設(shè)計(jì),采用了CRUSH算法、HASH環(huán)等方法,使得它不存在傳統(tǒng)的單點(diǎn)故障的問題,且隨著規(guī)模的擴(kuò)大性能并不會(huì)受到影響。

2? Ceph的核心組件

Ceph的核心組件包括Ceph OSD、Ceph Monitor和Ceph MDS。

Ceph OSD:OSD的英文全稱是Object Storage Device,它的主要功能是存儲(chǔ)數(shù)據(jù)、復(fù)制數(shù)據(jù)、平衡數(shù)據(jù)、恢復(fù)數(shù)據(jù)等,與其它OSD間進(jìn)行心跳檢查等,并將一些變化情況上報(bào)給Ceph Monitor。一般情況下一塊硬盤對(duì)應(yīng)一個(gè)OSD,由OSD來對(duì)硬盤存儲(chǔ)進(jìn)行管理,當(dāng)然一個(gè)分區(qū)也可以成為一個(gè)OSD。

Ceph OSD的架構(gòu)實(shí)現(xiàn)由物理磁盤驅(qū)動(dòng)器、Linux文件系統(tǒng)和Ceph OSD服務(wù)組成,對(duì)于Ceph OSD Deamon而言,Linux文件系統(tǒng)顯性的支持了其拓展性,一般Linux文件系統(tǒng)有好幾種,比如有BTRFS、XFS、Ext4等,BTRFS雖然有很多優(yōu)點(diǎn)特性,但現(xiàn)在還沒達(dá)到生產(chǎn)環(huán)境所需的穩(wěn)定性,一般比較推薦使用XFS。

伴隨OSD的還有一個(gè)概念叫做Journal盤,一般寫數(shù)據(jù)到Ceph集群時(shí),都是先將數(shù)據(jù)寫入到Journal盤中,然后每隔一段時(shí)間比如5秒再將Journal盤中的數(shù)據(jù)刷新到文件系統(tǒng)中。一般為了使讀寫時(shí)延更小,Journal盤都是采用SSD,一般分配10G以上,當(dāng)然分配多點(diǎn)那是更好,Ceph中引入Journal盤的概念是因?yàn)镴ournal允許Ceph OSD功能很快做小的寫操作;一個(gè)隨機(jī)寫入首先寫入在上一個(gè)連續(xù)類型的journal,然后刷新到文件系統(tǒng),這給了文件系統(tǒng)足夠的時(shí)間來合并寫入磁盤,一般情況下使用SSD作為OSD的journal可以有效緩沖突發(fā)負(fù)載。

Ceph Monitor:由該英文名字我們可以知道它是一個(gè)監(jiān)視器,負(fù)責(zé)監(jiān)視Ceph集群,維護(hù)Ceph集群的健康狀態(tài),同時(shí)維護(hù)著Ceph集群中的各種Map圖,比如OSD Map、Monitor Map、PG Map和CRUSH Map,這些Map統(tǒng)稱為Cluster Map,Cluster Map是RADOS的關(guān)鍵數(shù)據(jù)結(jié)構(gòu),管理集群中的所有成員、關(guān)系、屬性等信息以及數(shù)據(jù)的分發(fā),比如當(dāng)用戶需要存儲(chǔ)數(shù)據(jù)到Ceph集群時(shí),OSD需要先通過Monitor獲取最新的Map圖,然后根據(jù)Map圖和object id等計(jì)算出數(shù)據(jù)最終存儲(chǔ)的位置。

Ceph MDS:全稱是Ceph MetaData Server,主要保存的文件系統(tǒng)服務(wù)的元數(shù)據(jù),但對(duì)象存儲(chǔ)和塊存儲(chǔ)設(shè)備是不需要使用該服務(wù)的。

查看各種Map的信息可以通過如下命令:ceph osd(mon、pg) dump

3? Ceph基礎(chǔ)架構(gòu)組件


Ceph技術(shù)架構(gòu)圖

從架構(gòu)圖中可以看到最底層的是RADOS,RADOS自身是一個(gè)完整的分布式對(duì)象存儲(chǔ)系統(tǒng),它具有可靠、智能、分布式等特性,Ceph的高可靠、高可拓展、高性能、高自動(dòng)化都是由這一層來提供的,用戶數(shù)據(jù)的存儲(chǔ)最終也都是通過這一層來進(jìn)行存儲(chǔ)的,RADOS可以說就是Ceph的核心。

RADOS系統(tǒng)主要由兩部分組成,分別是OSD和Monitor。

基于RADOS層的上一層是LIBRADOS,LIBRADOS是一個(gè)庫,它允許應(yīng)用程序通過訪問該庫來與RADOS系統(tǒng)進(jìn)行交互,支持多種編程語言,比如C、C++、Python等。

基于LIBRADOS層開發(fā)的又可以看到有三層,分別是RADOSGW、RBD和CEPH FS。

RADOSGW:RADOSGW是一套基于當(dāng)前流行的RESTFUL協(xié)議的網(wǎng)關(guān),并且兼容S3和Swift。

RBD:RBD通過Linux內(nèi)核客戶端和QEMU/KVM驅(qū)動(dòng)來提供一個(gè)分布式的塊設(shè)備。

CEPH FS:CEPH FS通過Linux內(nèi)核客戶端和FUSE來提供一個(gè)兼容POSIX的文件系統(tǒng)。

4? Ceph數(shù)據(jù)分布算法

在分布式存儲(chǔ)系統(tǒng)中比較關(guān)注的一點(diǎn)是如何使得數(shù)據(jù)能夠分布得更加均衡,常見的數(shù)據(jù)分布算法有一致性Hash和Ceph的Crush算法。Crush是一種偽隨機(jī)的控制數(shù)據(jù)分布、復(fù)制的算法,Ceph是為大規(guī)模分布式存儲(chǔ)而設(shè)計(jì)的,數(shù)據(jù)分布算法必須能夠滿足在大規(guī)模的集群下數(shù)據(jù)依然能夠快速的準(zhǔn)確的計(jì)算存放位置,同時(shí)能夠在硬件故障或擴(kuò)展硬件設(shè)備時(shí)做到盡可能小的數(shù)據(jù)遷移,Ceph的CRUSH算法就是精心為這些特性設(shè)計(jì)的,可以說CRUSH算法也是Ceph的核心之一。

在說明CRUSH算法的基本原理之前,先介紹幾個(gè)概念和它們之間的關(guān)系。

存儲(chǔ)數(shù)據(jù)與object的關(guān)系:當(dāng)用戶要將數(shù)據(jù)存儲(chǔ)到Ceph集群時(shí),存儲(chǔ)數(shù)據(jù)都會(huì)被分割成多個(gè)object,每個(gè)object都有一個(gè)object id,每個(gè)object的大小是可以設(shè)置的,默認(rèn)是4MB,object可以看成是Ceph存儲(chǔ)的最小存儲(chǔ)單元。

object與pg的關(guān)系:由于object的數(shù)量很多,所以Ceph引入了pg的概念用于管理object,每個(gè)object最后都會(huì)通過CRUSH計(jì)算映射到某個(gè)pg中,一個(gè)pg可以包含多個(gè)object。

pg與osd的關(guān)系:pg也需要通過CRUSH計(jì)算映射到osd中去存儲(chǔ),如果是二副本的,則每個(gè)pg都會(huì)映射到二個(gè)osd,比如[osd.1,osd.2],那么osd.1是存放該pg的主副本,osd.2是存放該pg的從副本,保證了數(shù)據(jù)的冗余。

pg和pgp的關(guān)系:pg是用來存放object的,pgp相當(dāng)于是pg存放osd的一種排列組合,我舉個(gè)例子,比如有3個(gè)osd,osd.1、osd.2和osd.3,副本數(shù)是2,如果pgp的數(shù)目為1,那么pg存放的osd組合就只有一種,可能是[osd.1,osd.2],那么所有的pg主從副本分別存放到osd.1和osd.2,如果pgp設(shè)為2,那么其osd組合可以兩種,可能是[osd.1,osd.2]和[osd.1,osd.3],是不是很像我們高中數(shù)學(xué)學(xué)過的排列組合,pgp就是代表這個(gè)意思。一般來說應(yīng)該將pg和pgp的數(shù)量設(shè)置為相等。這樣說可能不夠明顯,我們通過一組實(shí)驗(yàn)來體會(huì)下:

先創(chuàng)建一個(gè)名為testpool包含6個(gè)PG和6個(gè)PGP的存儲(chǔ)池

ceph osd pool create testpool 6 6

通過寫數(shù)據(jù)后我們查看下pg的分布情況,使用以下命令:

ceph pg dump pgs | grep ^1 | awk '{print $1,$2,$15}'

dumped pgs in format plain

1.1 75 [3,6,0]

1.0 83 [7,0,6]

1.3 144 [4,1,2]

1.2 146 [7,4,1]

1.5 86 [4,6,3]

1.4 80 [3,0,4]

第1列為pg的id,第2列為該pg所存儲(chǔ)的對(duì)象數(shù)目,第3列為該pg所在的osd

我們擴(kuò)大PG再看看

ceph osd pool set testpool pg_num 12

再次用上面的命令查詢分布情況:

1.1 37 [3,6,0]

1.9 38 [3,6,0]

1.0 41 [7,0,6]

1.8 42 [7,0,6]

1.3 48 [4,1,2]

1.b 48 [4,1,2]

1.7 48 [4,1,2]

1.2 48 [7,4,1]

1.6 49 [7,4,1]

1.a 49 [7,4,1]

1.5 86 [4,6,3]

1.4 80 [3,0,4]

我們可以看到pg的數(shù)量增加到12個(gè)了,pg1.1的對(duì)象數(shù)量本來是75的,現(xiàn)在是37個(gè),可以看到它把對(duì)象數(shù)分給新增的pg1.9了,剛好是38,加起來是75,而且可以看到pg1.1和pg1.9的osd盤是一樣的。

而且可以看到osd盤的組合還是那6種。

我們增加pgp的數(shù)量來看下,使用命令:

ceph osd pool set testpool pgp_num 12

再看下

1.a 49 [1,2,6]

1.b 48 [1,6,2]

1.1 37 [3,6,0]

1.0 41 [7,0,6]

1.3 48 [4,1,2]

1.2 48 [7,4,1]

1.5 86 [4,6,3]

1.4 80 [3,0,4]

1.7 48 [1,6,0]

1.6 49 [3,6,7]

1.9 38 [1,4,2]

1.8 42 [1,2,3]

再看pg1.1和pg1.9,可以看到pg1.9不在[3,6,0]上,而在[1,4,2]上了,該組合是新加的,可以知道增加pgp_num其實(shí)是增加了osd盤的組合。

通過實(shí)驗(yàn)總結(jié):

(1)PG是指定存儲(chǔ)池存儲(chǔ)對(duì)象的目錄有多少個(gè),PGP是存儲(chǔ)池PG的OSD分布組合個(gè)數(shù)

(2)PG的增加會(huì)引起PG內(nèi)的數(shù)據(jù)進(jìn)行分裂,分裂相同的OSD上新生成的PG當(dāng)中

(3)PGP的增加會(huì)引起部分PG的分布進(jìn)行變化,但是不會(huì)引起PG內(nèi)對(duì)象的變動(dòng)

pg和pool的關(guān)系:pool也是一個(gè)邏輯存儲(chǔ)概念,我們創(chuàng)建存儲(chǔ)池pool的時(shí)候,都需要指定pg和pgp的數(shù)量,邏輯上來說pg是屬于某個(gè)存儲(chǔ)池的,就有點(diǎn)像object是屬于某個(gè)pg的。

以下這個(gè)圖表明了存儲(chǔ)數(shù)據(jù),object、pg、pool、osd、存儲(chǔ)磁盤的關(guān)系

Object、PG、Pool、OSD和存儲(chǔ)磁盤的關(guān)系

本質(zhì)上CRUSH算法是根據(jù)存儲(chǔ)設(shè)備的權(quán)重來計(jì)算數(shù)據(jù)對(duì)象的分布的,權(quán)重的設(shè)計(jì)可以根據(jù)該磁盤的容量和讀寫速度來設(shè)置,比如根據(jù)容量大小可以將1T的硬盤設(shè)備權(quán)重設(shè)為1,2T的就設(shè)為2,在計(jì)算過程中,CRUSH是根據(jù)Cluster Map、數(shù)據(jù)分布策略和一個(gè)隨機(jī)數(shù)共同決定數(shù)組最終的存儲(chǔ)位置的。

Cluster Map里的內(nèi)容信息包括存儲(chǔ)集群中可用的存儲(chǔ)資源及其相互之間的空間層次關(guān)系,比如集群中有多少個(gè)支架,每個(gè)支架中有多少個(gè)服務(wù)器,每個(gè)服務(wù)器有多少塊磁盤用以O(shè)SD等。

數(shù)據(jù)分布策略是指可以通過Ceph管理者通過配置信息指定數(shù)據(jù)分布的一些特點(diǎn),比如管理者配置的故障域是Host,也就意味著當(dāng)有一臺(tái)Host起不來時(shí),數(shù)據(jù)能夠不丟失,CRUSH可以通過將每個(gè)pg的主從副本分別存放在不同Host的OSD上即可達(dá)到,不單單可以指定Host,還可以指定機(jī)架等故障域,除了故障域,還有選擇數(shù)據(jù)冗余的方式,比如副本數(shù)或糾刪碼。

下面這個(gè)式子簡單的表明CRUSH的計(jì)算表達(dá)式:

CRUSH(X)? -> (osd.1,osd.2.....osd.n)

式子中的X就是一個(gè)隨機(jī)數(shù)。

下面通過一個(gè)計(jì)算PG ID的示例來看CRUSH的一個(gè)計(jì)算過程:

(1)Client輸入Pool ID和對(duì)象ID;

(2)CRUSH獲得對(duì)象ID并對(duì)其進(jìn)行Hash運(yùn)算;

(3)CRUSH計(jì)算OSD的個(gè)數(shù),Hash取模獲得PG的ID,比如0x48;

(4)CRUSH取得該P(yáng)ool的ID,比如是1;

(5)CRUSH預(yù)先考慮到Pool ID相同的PG ID,比如1.48。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容