ceph 簡介
什么是 Ceph?
-
Ceph 是一種為優(yōu)秀的性能义图、可靠性和可擴展性而設計的
統(tǒng)一的
咽瓷、分布式
的存儲系統(tǒng)。-
統(tǒng)一的
: 意味著 Ceph 可以一套存儲系統(tǒng)同時提供對象存儲
贸街、塊存儲
和文件系統(tǒng)
存儲三種功能庵寞,以便在滿足不同應用需求的前提下簡化部署和運維。 -
分布式
: 在 Ceph 系統(tǒng)中則意味著真正的無中心結構
和沒有理論上限的系統(tǒng)規(guī)模可擴展性
薛匪。
-
為什么要關注 Ceph捐川?
- Ceph 本身確實具有較為突出的優(yōu)勢。其先進的核心設計思想蛋辈,概括為八個字
“無需查表,算算就好”
。
ceph 架構
ceph 系統(tǒng) 自下向上 可以分為四個層次:
基礎存儲系統(tǒng)
RADOS
(Reliable, Autonomic, Distributed
Object
Store
冷溶,即可靠的渐白、自動化的、分布式的對象存儲)基礎庫
LIBRADOS
-
高層應用接口
-
rgw
(RADOS Gateway) -
RBD
(Rados Block Device) -
CephFS
(Ceph File System)
-
應用層
rados
Ceph 的存儲集群(Storage Cluster)逞频,又稱為 RADOS(Reliable, Autonomic Distributed Object Store)纯衍,顧名思義,它提供了一個可靠苗胀、能自我管理的分布式對象存儲襟诸。RADOS 是 Ceph 存儲系統(tǒng)的核心。Ceph 的數(shù)據(jù)訪問方法(如 RBD基协、CephFS歌亲、RADOSGW、librados)的所有操作都是在 RADOS 層之上構建的澜驮。當 Ceph 集群接收到來自客戶端的寫請求時陷揪,CRUSH算法首先計算出存儲位置,然后這些信息傳遞到 RADOS 層進行進一步處理杂穷。RADOS 以小對象的形式將數(shù)據(jù)分發(fā)到集群內(nèi)的所有節(jié)點悍缠,最后將這些對象存儲在 OSD 中。當配置的復制數(shù)大于 1 時耐量,RADOS 負責數(shù)據(jù)的可靠性飞蚓,它復制對象,創(chuàng)建副本并將它們存儲在不同的故障區(qū)域中廊蜒。 RADOS 包含兩個核心組件:OSD
和 MON
趴拧。
Ceph Monitor
-
Ceph monitor 維護
cluster map
的"主副本"。這意味著劲藐,Ceph 客戶端只需連接一個 Ceph monitor 并檢索當前的 cluster map八堡,便可確定所有 Ceph monitor 和 Ceph OSD 的位置,即獲得全局系統(tǒng)狀態(tài)記錄的數(shù)據(jù)結構
聘芜。cluster map 主要包含 5 個方面的信息:- mon map
ceph mon dump
- osd map
ceph osd dump
- pg map
ceph pg dump
- crush map
ceph osd crush dump
ceph osd getcrushmap -o {filename}
-
crushtool -
d
{comp-crushmap-filename} -
o
{decomp-crushmap-filename}
- mds map
ceph fs dump
- mon map
Ceph 客戶端必須先連接 Ceph monitor兄渺,然后才能從 Ceph OSD 讀取或?qū)懭?Ceph OSD。利用 cluster map 的當前副本和 CRUSH 算法汰现,Ceph 客戶端可以計算任何對象的位置挂谍。計算對象位置的能力使得 Ceph 客戶端能夠直接與 Ceph OSD 通信,這是 Ceph 高可擴展性和性能的一個重要方面瞎饲。
Ceph monitor 也提供身份驗證和日志記錄服務口叙。Ceph monitor 將 monitor 服務中的所有更改寫入到單個 Paxos 實例,而
Paxos
將更改寫入到 KV 存儲嗅战,以獲得強一致性
妄田。Monitor 之間同步可參考: MONITOR STORE SYNCHRONIZATION
Ceph OSD
OSD 是 Ceph 存儲集群中最重要的一個基礎組件俺亮,它負責將實際的數(shù)據(jù)以對象的形式存儲在每一個集群節(jié)點的物理磁盤中。對于任何讀寫操作疟呐,客戶端首先向 MON 請求 cluster map脚曾,然后客戶端就可以直接和 OSD 進行 I/O 操作。
一個 Ceph 集群包含多個 OSD启具。一個典型的 Ceph 集群部署方案會為集群節(jié)點上的每個物理磁盤創(chuàng)建一個 OSD daemon本讥,這是推薦的做法。以多副本為例鲁冯,OSD 上的每個對象都有一個主副本和幾個輔副本拷沸,輔副本分散在其他 OSD。一個 OSD 對于一些對象是主副本薯演,同時對于其他對象可能是輔副本撞芍,存放輔副本的 OSD 受主副本 OSD 控制,如果主副本OSD 異常(或者對應的磁盤故障)涣仿,輔副本 OSD 可以成為主副本 OSD勤庐。
osd 會檢查自身的狀態(tài)以及其他 osd 的狀態(tài),并向 monitor 匯報好港。
ceph pool
Ceph pool 是一個用來存儲對象的邏輯分區(qū)愉镰,每個池都包含一定數(shù)量的 PG,進而實現(xiàn)把一定數(shù)量的對象映射到集群內(nèi)部不同 OSD 上的目的钧汹。 Ceph pool 還支持快照功能丈探,以及為對象設置所有者和訪問權限。
RBD
RBD 對外提供塊存儲拔莱,可以被映射碗降、格式化,進而像其他磁盤一樣掛載到服務器塘秦。
RGW/RADOSGW
RGW讼渊,Ceph 對象網(wǎng)關,也稱做 RADOS 網(wǎng)關尊剔,它是一個代理爪幻,可以將 HTTP 請求轉(zhuǎn)換為 RADOS,也可以把 RADOS 轉(zhuǎn)換為 HTTP 請求须误,從而提供 restful 接口挨稿,兼容 S3 和 Swift。Ceph 對象網(wǎng)關使用 Ceph對象網(wǎng)關守護進程(RGW)與 librgw京痢、librados 交互奶甘。
Ceph Manager
Ceph 管理器軟件,可以收集整個集群的所有狀態(tài)祭椰。包括 dashboard臭家, prometheus 等等疲陕。
Ceph Metadata Server
MDS 是 Ceph 文件系統(tǒng)的元數(shù)據(jù)服務器,跟蹤文件層次結構并存儲元數(shù)據(jù)钉赁。只有 CephFS 才需要鸭轮。
CephFS 在 RADOS 層之上提供了一個兼容 POSIX
的文件系統(tǒng)。它使用 MDS
作為守護進程橄霉,負責管理其元數(shù)據(jù)并將它和其他數(shù)據(jù)分開。CephFS 使用 cephfuse 模塊(FUSE
)擴展其在用戶空間文件系統(tǒng)方面的支持(就是將 CephFS 掛載到客戶端機器上)邑蒋。它還允許直接與應用程序交互姓蜂,使用 libcephfs 庫直接訪問 RADOS 集群。
Ceph 尋址流程
三次映射
- File -> Object -> PG -> OSD
基本概念
File —— 此處的 file 就是用戶需要存儲或者訪問的文件医吊。對于一個基于 Ceph 開發(fā)的對象存儲應用而言钱慢,這個 file 也就對應于應用中的 “對象”,也就是用戶直接操作的 “對象”卿堂。
Object —— 此處的 object 是 RADOS 所看到的“對象”束莫。Object 與上面提到的 file 的區(qū)別是,object 的最大 size 由 RADOS 限定(通常為 2MB 或 4MB)草描,以便實現(xiàn)底層存儲的組織管理览绿。因此,當上層應用向 RADOS 存入 size 很大的 file 時穗慕,需要將 file 切分成統(tǒng)一大小的一系列 object(最后一個的大小可以不同)進行存儲饿敲。
PG(Placement Group)—— 顧名思義,PG 的用途是對 object 的存儲進行組織和位置映射逛绵。具體而言怀各,一個 PG 負責組織若干個 object(可以成千上萬個甚至更多),但一個 object 只能被映射到一個PG中术浪,即瓢对,PG 和 object 之間是“一對多”
映射關系。同時胰苏,一個 PG 會被映射到多個 OSD 上硕蛹,而每個 OSD 上都會承載大量的 PG,即碟联,PG 和 OSD 之間是“多對多”
映射關系妓美。在實踐當中,n 至少為 2鲤孵,如果用于生產(chǎn)環(huán)境壶栋,則至少為 3(對于副本池而言)。一個 OSD 上的 PG 則可達到數(shù)百個普监。事實上贵试,PG 數(shù)量的設置牽扯到數(shù)據(jù)分布的均勻性問題琉兜。PG 里的一些概念可參考: PLACEMENT GROUP CONCEPTS
為什么要引入 PG?
- PG 相當于一個虛擬組件毙玻,出于集群伸縮豌蟋,性能方面的考慮。
- 如果沒有 PG桑滩,則 object 直接映射到 osd 上梧疲,百萬千萬級別甚至更多的對象管理和追蹤起來會很困難。因為正常情況下运准,osd 數(shù)量固定的情況下幌氮,PG 數(shù)量也是固定的(2 的整數(shù)次冪,有專門的計算公式)胁澳。記錄每個 OSD 承載了哪些 PG 是可行的该互,而且其變化不頻繁,開銷小韭畸。 在 OSD 故障后宇智,很容易獲得 OSD 承載的 PG 列表,并計算出各個 PG 的另外幾個副本在哪個 OSD胰丁。有了這些信息随橘,才具備了故障處理的可行性。
File -> object 映射
這次映射的目的是锦庸,將用戶要操作的 file太防,映射為 RADOS 能夠處理的 object。其映射十分簡單酸员,本質(zhì)上就是按照 object 的最大 size 對 file 進行切分蜒车。這種切分的好處:
- 讓大小不限的 file 變成最大 size 一致、可以被 RADOS 高效管理的 object幔嗦;
- 讓對單一 file 實施的串行處理變?yōu)閷Χ鄠€ object 實施的并行化處理酿愧。
object 有自己的 ID,二進制數(shù)據(jù)以及由鍵值對組成的元數(shù)據(jù)信息邀泉。且 ID 是集群唯一的嬉挡。
Object -> PG 映射
在 file 被映射為一個或多個 object 之后,就需要將每個 object 獨立地映射到一個 PG 中去汇恤。計算公式: hash(oid) & mask -> pgid 根據(jù) RADOS 的設計庞钢,給定 PG 的總數(shù)為 m(m 應該為 2 的整數(shù)冪),則 mask 的值為 m-1因谎。因此基括,哈希值計算和按位與操作的整體結果事實上是從所有 m 個 PG 中近似均勻地隨機選擇一個〔撇恚基于這一機制风皿,當有大量 object 和大量 PG 時河爹,RADOS 能夠保證 object 和 PG 之間的近似均勻映射。具體可以參考:CALCULATING PG IDS
PG -> OSD 映射
第三次映射就是將作為 object 的邏輯組織單元的 PG 映射到數(shù)據(jù)的實際存儲單元 OSD桐款。如前面圖所示咸这,RADOS 采用一個名為 CRUSH 的算法,將 pgid 代入其中魔眨,然后得到一組共 n 個 OSD媳维。這 n 個 OSD 即共同負責存儲和維護一個 PG 中的所有 object。前已述及遏暴,n 的數(shù)值可以根據(jù)實際應用中對于可靠性的需求而配置侨艾,在生產(chǎn)環(huán)境下通常為 3。具體到每個 OSD拓挥,則由其上運行的 OSD deamon 負責執(zhí)行映射到本地的 object 在本地文件系統(tǒng)中的存儲、訪問袋励、元數(shù)據(jù)維護等操作侥啤。 需要注意的是,PG -> OSD 映射
和 “
object
-> PG”
映射中采用的哈希算法不同茬故,這個 CRUSH 算法的結果不是絕對不變的盖灸,而是受到其他因素的影響。其影響因素主要有:
- 一是當前系統(tǒng)狀態(tài)磺芭,也就是
cluster map
赁炎。當系統(tǒng)中的 OSD 狀態(tài)、數(shù)量發(fā)生變化時钾腺,cluster map 可能發(fā)生變化徙垫,而這種變化將會影響到 PG 與 OSD 之間的映射。 - 二是存儲策略配置放棒。這里的策略主要與安全相關姻报。利用策略配置,系統(tǒng)管理員可以指定承載同一個 PG 的 3 個 OSD 分別位于數(shù)據(jù)中心的不同服務器乃至機架上间螟,從而進一步改善存儲的可靠性吴旋。
數(shù)據(jù)操作流程
以 file 寫入過程為例
當某個 client 需要向 Ceph 集群寫入一個 file 時,首先需要在本地完成尋址流程厢破,將 file 變?yōu)橐粋€ object荣瑟,然后找出存儲該 object 的一組三個 OSD。 找出三個 OSD 后摩泪,client 將直接和 Primary OSD 通信笆焰,發(fā)起寫入操作(步驟1)。Primary OSD 收到請求后见坑,分別向 Secondary OSD 和 Tertiary OSD 發(fā)起寫入操作(步驟2仙辟、3)同波。當 Secondary OSD 和 Tertiary OSD 各自完成寫入操作后,將分別向 Primary OSD 發(fā)送確認信息(步驟4叠国、5)未檩。當 Primary OSD 確信其他兩個 OSD 的寫入完成后,則自己也完成數(shù)據(jù)寫入粟焊,并向 client 確認 object 寫入操作完成(步驟6)冤狡。
集群維護
由若干個 monitor 共同負責整個 Ceph 集群中所有 OSD 狀態(tài)的發(fā)現(xiàn)與記錄,并且共同形成 cluster map 的 master 版本项棠,然后擴散至全體 OSD 以及 client悲雳。OSD 使用 cluster map 進行數(shù)據(jù)的維護,而 client 使用 cluster map 進行數(shù)據(jù)的尋址香追。 monitor 并不主動輪詢各個 OSD 的當前狀態(tài)合瓢。正相反,OSD 需要向 monitor 上報狀態(tài)信息透典。常見的上報有兩種情況:一是新的OSD被加入集群晴楔,二是某個 OSD 發(fā)現(xiàn)自身或者其他 OSD 發(fā)生異常。在收到這些上報信息后峭咒,monitor 將更新 cluster map 信息并加以擴散税弃。
Cluster map 的內(nèi)容
- Epoch,即版本號凑队,為一個單調(diào)遞增序列则果,Epoch 越大,則 cluster map 版本越新漩氨。
- 各個 OSD 的網(wǎng)絡地址西壮。
- 各個 OSD 的狀態(tài)。up 或者 down叫惊,表明 OSD 是否正常工作茸时;in 或者 out,表明 OSD 是否在至少一個 PG 中赋访。
- CRUSH 算法配置參數(shù)可都。表明了 Ceph 集群的物理層級關系(cluster hierarchy),位置映射規(guī)則(placement rules)蚓耽。
osd 狀態(tài):
狀態(tài) | Up | Down |
---|---|---|
In | 正常運行渠牲,且承載至少一個 PG 的數(shù)據(jù)(標準工作狀態(tài) | 發(fā)生異常,但仍然承載至少一個 PG 的數(shù)據(jù)(剛發(fā)生異常) |
out | 正常運行步悠,未承載任何 PG(新加入或故障修復重新加入的 OSD) | 徹底發(fā)生故障签杈,不再承載任何 PG |
CEPH 重新平衡和恢復
當有新的 osd 加入集群或者移除了 osd,就會把狀態(tài)上報給 Monitor,Monitor 知道了 osd map 發(fā)生了變化就會觸發(fā) rebalancing
答姥,確保 pg 能夠平滑的移動到各個 osd 上铣除。以 pg 為整體進行數(shù)據(jù)重平衡,重平衡的過程中可能會影響性能鹦付。一次性加入的 osd 越多尚粘,數(shù)據(jù) rebalancing 就越頻繁,業(yè)務也可能因此受到影響敲长。生產(chǎn)環(huán)境中郎嫁,強烈建議一次只添加一個 osd,最大限度的減少性能和業(yè)務的影響祈噪。
新增一個 OSD
首先根據(jù)配置信息與 monitor 通信泽铛,monitor 將其加入 cluster map,并設置為 up 且 out 狀態(tài)辑鲤,再將最新版本的cluster map 發(fā)給這個新 OSD盔腔。
自動化的故障恢復(Failure recovery)
收到 monitor 發(fā)過來的 cluster map 之后,這個新 OSD 計算出自己所承載的 PG 以及和自己承載同一個 PG 的其他 OSD月褥。然后與這些 OSD 取得聯(lián)系弛随。如果這個 PG 目前處于降級狀態(tài)(即承載該 PG 的 OSD 個數(shù)少于正常值),則其他 OSD 將把這個 PG 內(nèi)的所有對象和元數(shù)據(jù)賦值給新 OSD吓坚。數(shù)據(jù)復制完成后,新 OSD 被置為 up 且 in 狀態(tài)灯荧,cluster map 也更新礁击。
自動化的故障探測(Failure detection)過程
如果一個 OSD 發(fā)現(xiàn)和自己共同承擔一個 PG 的另一個 OSD 無法聯(lián)通,則會將這一情況上報 monitor逗载。此外哆窿,如果一個 OSD deamon 發(fā)現(xiàn)自身工作狀態(tài)異常,也將把異常情況主動上報給 monitor厉斟。此時挚躯,monitor 將把出現(xiàn)問題的 OSD 的狀態(tài)設置為 down 且 in。如果超過某一預定時間期限該 OSD 仍然無法恢復正常擦秽,則其狀態(tài)將被設置為 down 且 out码荔。如果該 OSD 能夠恢復正常,則其狀態(tài)會恢復成 up 且 in感挥。具體可以參考: CONFIGURING MONITOR/OSD INTERACTION
數(shù)據(jù)一致性檢查
ceph 會定期去檢查指定冗余副本數(shù)的數(shù)據(jù)是否一致缩搅。分兩種情況檢查:
scrub
比較輕量級的檢查,主要檢查元數(shù)據(jù)(metadata )信息触幼,比如文件名硼瓣、object屬性、大小等置谦,如果不一樣堂鲤,就會從主 pg 復制一份過去亿傅。一般每天都會檢查。
deeper scrubbing
深度一致性檢查瘟栖,主要對比數(shù)據(jù)內(nèi)容葵擎。數(shù)據(jù)量比較大的時候,這個檢查相對來說比較耗費資源慢宗。一般每周檢查坪蚁。