Ceph概念介紹及組件介紹
一:Ceph基礎(chǔ)介紹
- Ceph是一個(gè)可靠地、自動重均衡、自動恢復(fù)的分布式存儲系統(tǒng),根據(jù)場景劃分可以將Ceph分為三大塊,分別是對象存儲、塊設(shè)備存儲和文件系統(tǒng)服務(wù)。
- Ceph相比其它存儲的優(yōu)勢點(diǎn)在于它不單單是存儲,同時(shí)還充分利用了存儲節(jié)點(diǎn)上的計(jì)算能力,在存儲每一個(gè)數(shù)據(jù)時(shí),都會通過計(jì)算得出該數(shù)據(jù)存儲的位置,盡量將數(shù)據(jù)分布均衡,同時(shí)由于Ceph的良好設(shè)計(jì),采用了CRUSH算法、HASH環(huán)等方法,使得它不存在傳統(tǒng)的單點(diǎn)故障的問題,且隨著規(guī)模的擴(kuò)大性能并不會受到影響。
二:核心組件介紹
全稱是Object Storage Device,主要功能包括存儲數(shù)據(jù),處理數(shù)據(jù)的復(fù)制、恢復(fù)、回補(bǔ)、平衡數(shù)據(jù)分布,并將一些相關(guān)數(shù)據(jù)提供給Ceph Monitor
- Ceph Monitor(必裝)
Ceph的監(jiān)控器,主要功能是維護(hù)整個(gè)集群健康狀態(tài),提供一致性的決策,包含了Monitor map,即集群map,monitor本身不存儲任何集群數(shù)據(jù)
- Managers(必裝)
Ceph Manager守護(hù)進(jìn)程(ceph-mgr)負(fù)責(zé)跟蹤運(yùn)行時(shí)指標(biāo)和Ceph集群的當(dāng)前狀態(tài),包括存儲利用率,當(dāng)前性能指標(biāo)和系統(tǒng)負(fù)載。Ceph Manager守護(hù)進(jìn)程還基于python的插件來管理和公開Ceph集群信息,包括基于Web的Ceph Manager Dashboard和 REST API。高可用性通常至少需要兩個(gè)管理器。
- Ceph MDS(可選)
全稱是Ceph Metadata Server,主要保存的是Ceph的文件系統(tǒng)(File System)的元數(shù)據(jù)(metadata),不是必須安裝,當(dāng)需要使用CephFS的時(shí)候才會使用
三:基礎(chǔ)組件介紹
- rados
自身是一個(gè)完整的分布式對象存儲系統(tǒng),它具有可靠、智能、分布式等特性,Ceph的高可靠、高可拓展、高性能、高自動化都是由這一層來提供的,用戶數(shù)據(jù)的存儲最終也都是通過這一層來進(jìn)行存儲的,RADOS可以說就是Ceph的核心,主要由兩部分構(gòu)成,分別是OSD和Monitor
- Librados
它是一個(gè)庫,它允許應(yīng)用程序通過訪問該與RADOS系統(tǒng)進(jìn)行交互,支持多種編程語言,比如C、C++,Python等
- radosgw
RADOSGW是一套基于當(dāng)前流行的RESTFUL協(xié)議的網(wǎng)關(guān),并且兼容S3和Swif,只有當(dāng)使用對象存儲時(shí)才會用到
- rbd
RBD通過Linux內(nèi)核客戶端和QEMU/KVM驅(qū)動來提供一個(gè)分布式的塊設(shè)備,可以理解為像linux的LVM一樣,從Ceph的集群中劃分出一塊磁盤,用戶可以直接在上面做文件系統(tǒng)和掛載目錄
- CephFs
通過Linux內(nèi)核客戶端和fuse來提供一個(gè)兼容POSIX的文件系統(tǒng),當(dāng)一些linux系統(tǒng)不支持mount命令或者需要更高級的操作時(shí),會用到ceph-fuse
四:術(shù)語介紹,名詞解釋
crush
是Ceph使用的數(shù)據(jù)分布算法,類似一致性哈希,讓數(shù)據(jù)分配到預(yù)期的地方
map
上面說過,monitor組件負(fù)責(zé)監(jiān)視整個(gè)集群的運(yùn)行狀況,如各節(jié)點(diǎn)之間的狀態(tài)、集群配置信息,這些信息由維護(hù)集群成員的守護(hù)程序來提供,如何存放這些信息呢,答案就是map,ceph monitor map主要包括如下這幾個(gè)
- Monitor map:包括有關(guān)monitor 節(jié)點(diǎn)端到端的信息,其中包括 Ceph 集群ID,監(jiān)控主機(jī)名和IP以及端口。并且存儲當(dāng)前版本信息以及最新更改信息,通過 "ceph mon dump" 查看 monitor map
- OSD map:包括一些常用的信息,如集群ID、創(chuàng)建OSD map的 版本信息和最后修改信息,以及pool相關(guān)信息,主要包括pool 名字、pool的ID、類型,副本數(shù)目以及PGP等,還包括數(shù)量、狀態(tài)、權(quán)重、最新的清潔間隔和OSD主機(jī)信息。通過命令 "ceph osd dump" 查看
- PG map:包括當(dāng)前PG版本、時(shí)間戳、最新的OSD Map的版本信息、空間使用比例,以及接近占滿比例信息,同事,也包括每個(gè)PG ID、對象數(shù)目、狀態(tài)、OSD 的狀態(tài)以及深度清理的詳細(xì)信息。通過命令 "ceph pg dump" 可以查看相關(guān)狀態(tài)
- CRUSH map: CRUSH map 包括集群存儲設(shè)備信息,故障域?qū)哟谓Y(jié)構(gòu)和存儲數(shù)據(jù)時(shí)定義失敗域規(guī)則信息。通過 命令 "ceph osd crush map" 查看
- MDS map:MDS Map 包括存儲當(dāng)前 MDS map 的版本信息、創(chuàng)建當(dāng)前的Map的信息、修改時(shí)間、數(shù)據(jù)和元數(shù)據(jù)POOL ID、集群MDS數(shù)目和MDS狀態(tài),可通過"ceph mds dump"查看
副本
副本是ceph存放數(shù)據(jù)的份數(shù),可以理解為對一個(gè)文件備份的份數(shù),ceph默認(rèn)的副本數(shù)是3,即一個(gè)主(primary ),一個(gè)次(secondary),一個(gè)次次(tertiary),只有primary osd的副本才解釋客戶端請求,它將數(shù)據(jù)寫入其他osd
如下,可以看到這個(gè)叫做testpool的pool中有一個(gè)叫做object1的object,他的map信息獲取后可以看到
這個(gè)對象在osd1上面是主,在osd0和osd2上是次和次次,也就是說在副本數(shù)為3的情況下,每個(gè)osd存儲一個(gè)副本
[root@ceph-1 ~]# ceph osd map testpool object1
osdmap e220 pool 'testpool' (38) object 'object1' -> pg 38.bac5debc (38.0) -> up ([1,0,2], p1) acting ([1,0,2], p1)
其他內(nèi)容解釋
- osdmap e220 此map的版本號
- pool 'testpool' (38) 此pool的名字和ID
- object 'object1' 此object的名字
- pg 38.bac5debc (38.0) pg的號碼,即38.0
- up ([1,0,2], p1) up set ,按順序表示副本存在于哪個(gè)osd上,osd0(primary)osd1(secondary)和osd2(tertiary)
- acting ([1,0,2], p1) acting set 通常情況下和up set相同,不同的情況需要理解pg_temp,即如果pg的acting set 為[0,1,2], 此時(shí)如果osd.0出現(xiàn)故障,導(dǎo)致CRUSH算法重新分配該pg的acting set 為[3,1,2]. 此時(shí)osd.3為該pg的主osd,但是osd.3并不能負(fù)擔(dān)該pg的讀操作,因?yàn)槠渖犀F(xiàn)在還沒有數(shù)據(jù)。所以向monitor申請一個(gè)臨時(shí)的pg,osd.1為臨時(shí)主osd,這時(shí)acting set依然為[0,1,2],up set 變?yōu)閇1,3,2],此時(shí)就出來acting set 和up set的不同。當(dāng)osd.3 backfill完成之后,該pg的up set恢復(fù)為acting set, 也就是acting set 和 up set都為[0,1,2]
object
ceph最底層的存儲單元,即對象,每個(gè)對象包含元數(shù)據(jù)和原始數(shù)據(jù),當(dāng)用戶要將數(shù)據(jù)存儲到ceph集群時(shí),存儲數(shù)據(jù)會被分為多個(gè)對象,每個(gè)對象的大小是可以設(shè)置的,默認(rèn)是4MB,可以將object堪稱是ceph存儲的最小單元
pg和pgp
pg是用來存放object的
pgp是相當(dāng)于pg存放在osd的一種排列組合,他不影響副本個(gè)數(shù),只影響副本排列順序
pool
pool是一個(gè)邏輯存儲概念,我們創(chuàng)建pool的時(shí)候,需要指定pg和pgp,Ceph 的池是一個(gè)用來存儲對象的邏輯分區(qū) ,Ceph每個(gè)池都包含一定數(shù)量 PG 進(jìn)而實(shí)現(xiàn)把一定數(shù)量的對象映射到集群內(nèi)部不同 OSD
此,因此, 每一個(gè)池都是交叉分布在集群所有節(jié)點(diǎn)上的 ,也就是說pool是分布在整個(gè)集群上面的,這樣就能夠提供足夠的彈性
五:易混點(diǎn)辨析
object與pg的關(guān)系
由于object的數(shù)量很多,所以Ceph引入了pg的概念用于管理object,每個(gè)object最后都會通過CRUSH計(jì)算映射到某個(gè)pg中,一個(gè)pg可以包含多個(gè)object
pg與osd的關(guān)系
pg也需要通過CRUSH計(jì)算映射到osd中去存儲,如果是三副本的,則每個(gè)pg都會映射到三個(gè)osd,比如[osd.0,osd.1,osd.2],那么osd.0是存放該pg的主副本,osd.1和osd.2是存放該pg的從副本,保證了數(shù)據(jù)的冗余
pg和pool的關(guān)系
pool也是一個(gè)邏輯存儲概念,我們創(chuàng)建存儲池pool的時(shí)候,都需要指定pg和pgp的數(shù)量,邏輯上來說pg是屬于某個(gè)存儲池的,就有點(diǎn)像object是屬于某個(gè)pg的
pg和pgp的關(guān)系
- pg是用來存放object的,pgp相當(dāng)于是pg存放osd的一種排列組合,比如三個(gè)osd 1 2 3,副本數(shù)設(shè)置為3 且ceph默認(rèn)副本數(shù)就是為3,假設(shè)此時(shí)pgp是1的話,那么此時(shí)一個(gè)對象是只可能是按照osd0 osd1 osd2 這唯一一種順序排列,假設(shè)此時(shí)pgp是2的話,那么此時(shí)這個(gè)對象可能是按照osd0 osd1 osd2 和 osd1 osd0 osd2 這兩種中的一種順序排列,假設(shè)此時(shí)pgp是3的話,那么此時(shí)就有三種順序排列,所以pgp實(shí)際上并不影響pg的副本數(shù),只影響pg副本在osd分布的順序排列的組合的可選數(shù)量,那么也可以理解pgp的作用就是均衡集群內(nèi)osd的數(shù)據(jù)
- pg是指定存儲池存儲對象的目錄有多少個(gè),pgp是存儲池pg的OSD分布組合個(gè)數(shù)
- pg的增加會引起pg內(nèi)的數(shù)據(jù)進(jìn)行分裂,分裂相同的OSD上新生成的pg當(dāng)中
- pgp的增加會引起部分pg的分布進(jìn)行變化,但是不會引起pg內(nèi)對象的變動
存儲數(shù)據(jù), object, pg,pgp, pool, osd, 存儲磁盤的關(guān)系
- 這個(gè)12M的文件被分成,objectA,objectB,objectC三個(gè)對象,分別存儲在pgA,pgB,pgC這三個(gè)pg里,pgA,pgB,pgC這三個(gè)pg又分別歸poolA,poolB,poolC管理,而每個(gè)pg分布在哪個(gè)osd上,是有選擇性的,而有多少種選擇,就由pgp決定,這里設(shè)pgp為1,那么圖上顯示的就是其中可能的一種pg分布排序,而且是唯一的,如果pgp為2,那么除了圖上顯示的分布排除算一種外,會有另外一種分布排序,可能是pgA在osd1上,pgB在osd3上,pgC在osd2上,當(dāng)然也可能有其他的分布排序,但是這里假設(shè)pgp為2,所以只有兩種可供選擇
另外,這里又另一張圖,是我在別的大佬的文章里發(fā)現(xiàn)的也不錯(cuò),就也放到這里把