1、Ceph架構簡介及使用場景介紹
1.1 Ceph簡介
Ceph是一個統一的分布式存儲系統,設計初衷是提供較好的性能、可靠性和可擴展性。
Ceph項目最早起源於Sage就讀博士期間的工作(最早的成果於2004年發表),並隨后貢獻給開源社區。在經過了數年的發展之后,目前已得到眾多雲計算廠商的支
持並被廣泛應用。RedHat及OpenStack都可與Ceph整合以支持虛擬機鏡像的后端存儲。
1.2 Ceph特點
高性能
高可用性
高可擴展性
特性豐富
1.3 Ceph架構
支持三種接口:
Object:有原生的API,而且也兼容Swift和S3的API。
Block:支持精簡配置、快照、克隆。
File:Posix接口,支持快照。
1.4 Ceph核心組件介紹
Ceph OSD(必裝)
全稱是Object Storage Device,主要功能包括存儲數據,處理數據的復制、恢復、回補、平衡數據分布,並將一些相關數據提供給Ceph Monitor
Ceph Monitor(必裝)
Ceph的監控器,主要功能是維護整個集群健康狀態,提供一致性的決策,包含了Monitor map,即集群map,monitor本身不存儲任何集群數據
Managers(必裝)
Ceph Manager守護進程(ceph-mgr)負責跟蹤運行時指標和Ceph集群的當前狀態,包括存儲利用率,當前性能指標和系統負載。Ceph Manager守護進程還基於
python的插件來管理和公開Ceph集群信息,包括基於Web的Ceph Manager Dashboard和 REST API。高可用性通常至少需要兩個管理器。
Ceph MDS(可選)
全稱是Ceph Metadata Server,主要保存的是Ceph的文件系統(File System)的元數據(metadata),不是必須安裝,當需要使用CephFS的時候才會使用。
1.5 Ceph基礎組件介紹
rados
自身是一個完整的分布式對象存儲系統,它具有可靠、智能、分布式等特性,Ceph的高可靠、高可拓展、高性能、高自動化都是由這一層來提供的,用戶數據的
存儲最終也都是通過這一層來進行存儲的,RADOS可以說就是Ceph的核心,主要由兩部分構成,分別是OSD和Monitor
Librados
它是一個庫,它允許應用程序通過訪問該與RADOS系統進行交互,支持多種編程語言,比如C、C++,Python等
radosgw
RADOSGW是一套基於當前流行的RESTFUL協議的網關,並且兼容S3和Swift,只有當使用對象存儲時才會用到
rbd
RBD通過Linux內核客戶端和QEMU/KVM驅動來提供一個分布式的塊設備,可以理解為像linux的LVM一樣,從Ceph的集群中划分出一塊磁盤,用戶可以直接在上面
做文件系統和掛載目錄
CephFs
通過Linux內核客戶端和fuse來提供一個兼容POSIX的文件系統,當一些linux系統不支持mount命令或者需要更高級的操作時,會用到ceph-fuse
1.6 Ceph術語介紹,名詞解釋
crush
是Ceph使用的數據分布算法,類似一致性哈希,讓數據分配到預期的地方
map
上面說過,monitor組件負責監視整個集群的運行狀況,如各節點之間的狀態、集群配置信息,這些信息由維護集群成員的守護程序來提供,如何存放這些信息
呢,答案就是map,ceph monitor map主要包括如下這幾個
Monitor map:包括有關monitor 節點端到端的信息,其中包括 Ceph 集群ID,監控主機名和IP以及端口。並且存儲當前版本信息以及最新更改信息,通過
"ceph mon dump" 查看 monitor map
OSD map:包括一些常用的信息,如集群ID、創建OSD map的 版本信息和最后修改信息,以及pool相關信息,主要包括pool 名字、pool的ID、類型,副本數目
以及PGP等,還包括數量、狀態、權重、最新的清潔間隔和OSD主機信息。通過命令 "ceph osd dump" 查看
PG map:包括當前PG版本、時間戳、最新的OSD Map的版本信息、空間使用比例,以及接近占滿比例信息,同事,也包括每個PG ID、對象數目、狀態、OSD 的
狀態以及深度清理的詳細信息。通過命令 "ceph pg dump" 可以查看相關狀態
CRUSH map: CRUSH map 包括集群存儲設備信息,故障域層次結構和存儲數據時定義失敗域規則信息。通過 命令 "ceph osd crush map" 查看
MDS map:MDS Map 包括存儲當前 MDS map 的版本信息、創建當前的Map的信息、修改時間、數據和元數據POOL ID、集群MDS數目和MDS狀態,可通過"ceph
mds dump"查看
副本
副本是ceph存放數據的份數,可以理解為對一個文件備份的份數,ceph默認的副本數是3,即一個主(primary ),一個次(secondary),一個次次
(tertiary),只有primary osd的副本才解釋客戶端請求,它將數據寫入其他osd如下,可以看到這個叫做testpool的pool中有一個叫做object1的object,
他的map信息獲取后可以看到這個對象在osd1上面是主,在osd0和osd2上是次和次次,也就是說在副本數為3的情況下,每個osd存儲一個副本。
[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)
其他內容解釋
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 ,按順序表示副本存在於哪個osd上,osd0(primary)osd1(secondary)和osd2(tertiary)
acting ([1,0,2], p1) acting set 通常情況下和up set相同,不同的情況需要理解pg_temp,即如果pg的acting set 為[0,1,2], 此時如果osd.0出現故
障,導致CRUSH算法重新分配該pg的acting set 為[3,1,2]. 此時osd.3為該pg的主osd,但是osd.3並不能負擔該pg的讀操作,因為其上現在還沒有數據。所以
向monitor申請一個臨時的pg,osd.1為臨時主osd,這時acting set依然為[0,1,2],up set 變為[1,3,2],此時就出來acting set 和up set的不同。當
osd.3 backfill完成之后,該pg的up set恢復為acting set, 也就是acting set 和 up set都為[0,1,2]
object
ceph最底層的存儲單元,即對象,每個對象包含元數據和原始數據,當用戶要將數據存儲到ceph集群時,存儲數據會被分為多個對象,每個對象的大小是可以設
置的,默認是4MB,可以將object堪稱是ceph存儲的最小單元
pg和pgp
pg是用來存放object的
pgp是相當於pg存放在osd的一種排列組合,他不影響副本個數,只影響副本排列順序
pool
pool是一個邏輯存儲概念,我們創建pool的時候,需要指定pg和pgp,Ceph 的池是一個用來存儲對象的邏輯分區 ,Ceph每個池都包含一定數量 PG 進而實現把
一定數量的對象映射到集群內部不同 OSD
此,因此, 每一個池都是交叉分布在集群所有節點上的 ,也就是說pool是分布在整個集群上面的,這樣就能夠提供足夠的彈性
1.7 易混點辨析
object與pg的關系
由於object的數量很多,所以Ceph引入了pg的概念用於管理object,每個object最后都會通過CRUSH計算映射到某個pg中,一個pg可以包含多個object
pg與osd的關系
pg也需要通過CRUSH計算映射到osd中去存儲,如果是三副本的,則每個pg都會映射到三個osd,比如[osd.0,osd.1,osd.2],那么osd.0是存放該pg的主副本,
osd.1和osd.2是存放該pg的從副本,保證了數據的冗余
pg和pool的關系
pool也是一個邏輯存儲概念,我們創建存儲池pool的時候,都需要指定pg和pgp的數量,邏輯上來說pg是屬於某個存儲池的,就有點像object是屬於某個pg的
pg和pgp的關系
pg是用來存放object的,pgp相當於是pg存放osd的一種排列組合,比如三個osd 1 2 3,副本數設置為3 且ceph默認副本數就是為3,假設此時pgp是1的話,那
么此時一個對象是只可能是按照osd0 osd1 osd2 這唯一一種順序排列,假設此時pgp是2的話,那么此時這個對象可能是按照osd0 osd1 osd2 和 osd1 osd0
osd2 這兩種中的一種順序排列,假設此時pgp是3的話,那么此時就有三種順序排列,所以pgp實際上並不影響pg的副本數,只影響pg副本在osd分布的順序排列
的組合的可選數量,那么也可以理解pgp的作用就是均衡集群內osd的數據
pg是指定存儲池存儲對象的目錄有多少個,pgp是存儲池pg的OSD分布組合個數
pg的增加會引起pg內的數據進行分裂,分裂相同的OSD上新生成的pg當中
pgp的增加會引起部分pg的分布進行變化,但是不會引起pg內對象的變動
注:存儲數據, object, pg,pgp, pool, osd, 存儲磁盤的關系
這個12M的文件被分成,objectA,objectB,objectC三個對象,分別存儲在pgA,pgB,pgC這三個pg里,pgA,pgB,pgC這三個pg又分別歸poolA,poolB,
poolC管理,而每個pg分布在哪個osd上,是有選擇性的,而有多少種選擇,就由pgp決定,這里設pgp為1,那么圖上顯示的就是其中可能的一種pg分布排序,而
且是唯一的,如果pgp為2,那么除了圖上顯示的分布排除算一種外,會有另外一種分布排序,可能是pgA在osd1上,pgB在osd3上,pgC在osd2上,當然也可能有
其他的分布排序,但是這里假設pgp為2,所以只有兩種可供選擇。
1.8 三種存儲類型-塊存儲