前言
ceph 是什么?
ceph 是一種開源存儲軟件。底層實現(xiàn)了對象存儲,并以此為基礎(chǔ)對外提供對象存儲接口、塊存儲接口、文件級存儲接口。
ceph 結(jié)構(gòu)包含兩個部分:
- ceph client:訪問 ceph 底層服務(wù)或組件,對外提供各種接口。比如:對象存儲接口、塊存儲接口、文件級存儲接口。
- ceph node:ceph 底層服務(wù)提供端,也就是 ceph 存儲集群。
環(huán)境
ceph 版本:Nautilus
正文
架構(gòu)圖
官網(wǎng)的一張架構(gòu)圖:

對于這張圖,一開始沒有看懂它想表達什么,后來明白了。如下圖:

相關(guān)名詞解釋:
- RADOS:Reliable Autonomic Distributed Object Store(可靠的,自主的,分布式的對象存儲)。在 ceph 中這個名詞經(jīng)常出現(xiàn),有時會以 R 表示 RADOS。實際上這個詞僅僅是對 ceph 的一個修飾詞,并不代表 ceph 的組件什么的。粗暴的認為, RADOS = ceph 對象存儲集群 即可。
-
RGW、RBD、CEPH FS: 這三個就是 ceph clients。
RGW:對象存儲網(wǎng)關(guān),也就是對象存儲接口。
RBD:塊設(shè)備,也就是塊存儲接口。
CEPH FS:ceph 文件系統(tǒng),也就是文件級存儲接口。
ceph 基礎(chǔ)架構(gòu)
ceph 組件分為兩部分:
- ceph node:構(gòu)成 ceph 集群的基礎(chǔ)組件。
- ceph client:對外提供多種方式使用 ceph 存儲的組件。
ceph 基礎(chǔ)組件
此部分介紹構(gòu)成 ceph 集群的基礎(chǔ)組件。
其中包含 OSD、Manager、MDS、Monitor。
OSD(ceph-osd):object storage daemon,對象存儲進程。ceph 管理物理硬盤時,引入了OSD概念,每一塊盤都會針對的運行一個OSD進程。換句話說,ceph 集群通過管理 OSD 來管理物理硬盤。OSD 一般功能為:存儲數(shù)據(jù)、維護數(shù)據(jù)副本、數(shù)據(jù)恢復(fù)、數(shù)據(jù)再平衡以及對ceph monitor組件提供相關(guān)監(jiān)控信息。
Manager(ceph-mgr):用于收集ceph集群狀態(tài)、運行指標,比如存儲利用率、當前性能指標和系統(tǒng)負載。對外提供 ceph dashboard(ceph ui)和 resetful api。Manager組件開啟高可用時,至少2個。
MDS(ceph-mds):Metadata server,元數(shù)據(jù)服務(wù)。為ceph 文件系統(tǒng)提供元數(shù)據(jù)服務(wù)(ceph 對象存儲和塊存儲不需要MDS)。為 posix 文件系統(tǒng)用戶提供性能良好的基礎(chǔ)命令(ls,find等)。
Monitor(ceph-mon):維護集群的狀態(tài),包含monitor組件信息,manger 組件信息,osd組件信息,mds組件信息,crush 算法信息。還負責ceph集群的身份驗證功能,client在連接ceph集群時通過此組件進行驗證。Monitor組件開啟高可用時,至少3個。
ceph clients
此部分介紹 ceph 對外提供各種功能的組件。
其中包含:Block Device、Object Storage、Filesystem。
- Block Device:塊存儲設(shè)備,RBD。
- Object Storage: 對象存儲,RGW。對外可提供 swift 、s3 接口類型的restful api。
- Filesystem:文件系統(tǒng),CephFS。提供一個兼容POSIX的文件系統(tǒng)。
ceph 存儲過程
前面兩個部分主要介紹了 ceph 的一些組件及對外提供的功能。
這部分主要介紹 ceph 的存儲邏輯。
首先,在對象存儲中,一切都是扁平化的,并且存儲的最小單元為對象(obj)。存儲 obj 如下圖:

ceph 在對象存儲的基礎(chǔ)上提供了更加高級的思想。
當對象數(shù)量達到了百萬級以上,原生的對象存儲在索引對象時消耗的性能非常大。ceph 因此引入了 placement group (pg)的概念。一個 pg 就是一組對象的集合。如下圖:

obj 和 pg 之間的映射由 ceph client 計算得出。
討論 pg 時,不得不提的另外一個名詞:pgp。
pgp 決定了 pg 和 osd 之間的映射關(guān)系。一般將 pgp_num 設(shè)置成和 pg_num 一樣大小。
這里還有一個名詞需要提一下,在 ceph 中會經(jīng)常見到 crush 算法。簡單來說,crush 算法就是指 ceph 中數(shù)據(jù)如何存儲、讀取的過程。
由于 ceph 集群面對許多的獨立項目,因此 ceph 還引入了 ceph pool 的概念用于劃分不同的項目。
ceph pool 是對 ceph 對象的邏輯劃分,并不是物理劃分。
pg 和 ceph pool 的區(qū)別:
- pg 對于用戶來說是透明的,只是底層的一種優(yōu)化方案。
- ceph pool 對于用戶來說,就像 mysql 中的 database。
像大多數(shù)集群軟件一樣,ceph 也提供了緩存的概念。稱之為 Cache Tier(緩存層,在具體使用時有時會稱之為緩存池)。
緩存池對用戶來說是透明的,因此不會改變用戶的原有使用邏輯。以下緩存池的介紹,均為底層邏輯。
在沒有緩存池時,ceph client 直接指向存儲池。
在添加緩存池后,ceph client 指向緩存池,緩存池再指向存儲池。
擴展
1. 關(guān)于 osd、pg、pgp 的猜想
官方原話:
When pg_num is increased for any pool, every PG of this pool splits into half, but they all remain mapped to their parent OSD.
Until this time, Ceph does not start rebalancing. Now, when you increase the pgp_num value for the same pool, PGs start to migrate from the parent to some other OSD, and cluster rebalancing starts. This is how PGP plays an important role.
By Karan Singh
個人翻譯:
當一個池增加 pg 數(shù)量時,這個池中的所有 pg 都會變化。但是原 pg 的實際物理存儲位置不會改變。
當一個池增加 pgp 的數(shù)量時,pg 的實際物理存儲位置會發(fā)生改變。
首先,截至目前,沒有具體查到資料證明以下觀點。(基于一致性hash的猜想)
宏觀上,大量的 obj 存儲過程如下:

由上圖,引發(fā)幾個問題:
- obj 如何存儲到 pg 上?
- pg 如何存儲到 osd 上?
- 那 pgp 又是什么?
- 為什么要有 pg 這個東西?
一幅猜想圖:

圖中出現(xiàn)了一個新詞: vosd ,這個是指虛擬 osd。它的數(shù)量等于 pgp 的數(shù)量,而 pgp 一般又等于 pg。
猜想:
- obj 在存儲時,首先經(jīng)過 hash 算法決定存儲在哪個 pg 上。
- 再次經(jīng)過 hash 算法,計算出 pg 位于哪個 vosd 上。
- vosd 中存儲了與物理 osd 之間的映射。
pgp 的數(shù)量就是 vosd 的數(shù)量。
引入 pg 可以實現(xiàn) pool 概念,以及優(yōu)化碎片管理(這一點十分不確定)。
引入 pgp(vosd),是為了在增加 osd 時可以讓數(shù)據(jù)更加均衡的分布。
如猜想圖:
當我們增加池的 pg 數(shù)量時,不會改變 vosd,因此原 pg 與 vosd 之間的映射未變,原 pg 的實際物理位置也不會發(fā)生變化。只是會影響同一個池中 obj 的分布。
當我們增加池的 pgp 數(shù)量時,相當于改變了 vosd,通過 hash 計算出的部分 pg 與 vosd 之間的映射就要發(fā)生改變,從而導(dǎo)致 pg 的實際物理位置發(fā)生改變。
與一致性hash不同的地方:
一般情況下,一致性hash只有一層虛擬化層,并且虛擬化層是根據(jù)物理硬件而變化的。但是ceph卻是一種反著來的意思。
當 ceph 增加一個 osd 時,pg 的物理位置也會發(fā)生改變。
在該猜想下:
當增加 osd 時,并不會增加 vosd 的數(shù)量,原部分 vosd 會映射到新的 osd 上,因此產(chǎn)生一種部分 pg 的實際物理位置發(fā)生變化的情況。
2. 關(guān)于 pg pgp 數(shù)量設(shè)定
創(chuàng)建池時,會分配固定的 pg,以及設(shè)置與 pg 一樣大小的 pgp。
注意,一般 pg 數(shù)量都設(shè)置為 2 的次方。
嚴格意義上,我們無論為池分配多少個 pg 都沒有問題。但有時候 pg num 配置小了會報錯,配置大了也會報錯。這不是因為這么配置不對,是因為有其它的參數(shù)在限制我們隨意配置 pg num。
比如:
osd 有兩個配置,當每個 osd 的 pg num 過少(默認30)時會告警,當每個 osd 的 pg num 過多(默認300)也會告警。
所以,想要入門使用 ceph,還是需要了解許多基礎(chǔ)知識才可以。否則,各種意外。