Ceph簡介
什么是分布式存儲
與集中式存儲相反,分布式存儲通常采用存儲單元集群的形式,并具有在集群節(jié)點之間進(jìn)行數(shù)據(jù)同步和協(xié)調(diào)的機制。分布式存儲最初是由Google提出的,其目的是通過廉價服務(wù)器解決大規(guī)模,高并發(fā)情況下的Web訪問問題。
分布式存儲具有幾個優(yōu)點:
- 可擴展性-支持通過在系統(tǒng)中添加或刪除存儲單元來水平擴展存儲系統(tǒng)。
- 冗余-在多臺服務(wù)器之間存儲相同數(shù)據(jù)的復(fù)制,以實現(xiàn)高可用性, 備份和災(zāi)難恢復(fù)目的。
- 節(jié)省成本 -可以使用更便宜的商品服務(wù)器以低成本存儲大量 數(shù)據(jù)。
- 性能-在某些情況下,性能比單個服務(wù)器更好,例如,它可以將數(shù)據(jù)存儲在離其使用者更近的位置,或者允許大規(guī)模并行訪問大文件。
起源
Ceph項目最早起源于Sage就讀博士期間發(fā)表的,并隨后貢獻(xiàn)給開源社區(qū)。在經(jīng)過了數(shù)年的發(fā)展之后,目前已得到眾多云計算廠商的支持并被廣泛應(yīng)用。RedHat及OpenStack都可與Ceph整合以支持虛擬機鏡像的后端存儲。但是在2014年OpenStack火爆的時候、Ceph并不被很多人所接受。當(dāng)時Ceph并不穩(wěn)定(Ceph發(fā)布的第四個版本 Dumpling v0.67),而且架構(gòu)新穎,復(fù)雜,當(dāng)時人們對Ceph在生產(chǎn)落地如何保障數(shù)據(jù)的安全,數(shù)據(jù)的一致性存在懷疑。
隨著OpenStack的快速發(fā)展,越來越多的人使用Ceph作為OpenStack的底層共享存儲,Ceph在中國的社區(qū)也蓬勃發(fā)展起來。近兩年OpenStack火爆度不及當(dāng)年,借助于云原生尤其是Kubernetes技術(shù)的發(fā)展,作為底層存儲的基石,Ceph再次發(fā)力,為Kubernets有狀態(tài)化業(yè)務(wù)提供了存儲機制的實現(xiàn)。
優(yōu)點
- 高性能
a. 摒棄了傳統(tǒng)的集中式存儲元數(shù)據(jù)尋址的方案,采用CRUSH算法,數(shù)據(jù)分布均衡,并行度高。
b. 考慮了容災(zāi)域的隔離,能夠?qū)崿F(xiàn)各類負(fù)載的副本放置規(guī)則,例如跨機房、機架感知等。
c. 能夠支持上千個存儲節(jié)點的規(guī)模,支持TB到PB級的數(shù)據(jù)。 - 高可用性
a. 副本數(shù)可以靈活控制。
b. 支持故障域分隔,數(shù)據(jù)強一致性。
c. 多種故障場景自動進(jìn)行修復(fù)自愈。
d. 沒有單點故障,自動管理。 - 高可擴展性
a. 去中心化。
b. 擴展靈活。
c. 隨著節(jié)點增加而線性增長。 - 特性豐富
a. 支持三種存儲接口:塊存儲、文件存儲、對象存儲。
b. 支持自定義接口,支持多種語言驅(qū)動。
服務(wù)架構(gòu)
一個 Ceph 存儲集群至少需要一個 Ceph Monitor(監(jiān)視器)、Ceph Manager(管理器) 和 Ceph OSD(對象存儲守護(hù)進(jìn)程)。

Monitors
Ceph Monitor (ceph-mon) 通過維護(hù)包括監(jiān)視器表(MonMap)、管理表(MGRMap)、OSD表(OSDMap)等組件狀態(tài)表的保障集群正常運行。ceph-osd 相互之間協(xié)調(diào)工作時,需要從 ceph-mon 中獲取這些表的信息。ceph-mon 還負(fù)責(zé)管理 ceph-osd 和客戶端之間的身份驗證。一個Ceph集群為了保證冗余和高可用性通常需要至少三個監(jiān)視器,它們之間通過Paxos同步數(shù)據(jù)。
Managers
Ceph Manager (ceph-mgr) 負(fù)責(zé)跟蹤運行時指標(biāo)和 Ceph 集群的當(dāng)前狀態(tài),包括存儲利用率、當(dāng)前性能指標(biāo)、集群報警和系統(tǒng)負(fù)載等。ceph-mon 和 ceph-mgr 協(xié)調(diào)配合共同維持集群穩(wěn)定。高可用性通常需要至少兩個管理器。
OSDS
Ceph OSD(ceph-osd)全稱是Object Storage Device,負(fù)責(zé)包括處理數(shù)據(jù)復(fù)制、恢復(fù)、重新平衡在內(nèi)的實際數(shù)據(jù)存儲工作,并且一個 OSD 檢查可以通過檢查其他 OSD 的心跳的方式將其他 OSD 的異常狀態(tài)上報給 MON。一個Ceph集群一般都有很多個OSD。
邏輯架構(gòu)
Ceph 將數(shù)據(jù)作為對象存儲在邏輯存儲池中。使用 CRUSH算法,Ceph 計算出哪個歸置組應(yīng)該包含該對象,并進(jìn)一步計算出哪個 Ceph OSD Daemon 應(yīng)該存儲該歸置組。CRUSH 算法使 Ceph 存儲集群能夠動態(tài)擴展、重新平衡和恢復(fù)。
RADOS: 由自我修復(fù)、自我管理、智能存儲節(jié)點組成的可靠、自主、分布式對象存儲。
LIBRADOS: Ceph 供的外部訪問的對象存儲 API,允許客戶端通過此 API 訪問Ceph集群完成文件的讀寫工作,支持 C、C++、Java、Python、Ruby 和 PHP 等多種語言。

用戶可以基于自己的業(yè)務(wù)需要直接 LIBRADOS API 的基礎(chǔ)上,開發(fā)自己需要的存儲業(yè)務(wù)。社區(qū)在 LIBRADOS API 開發(fā)了三種成熟的存儲產(chǎn)品:塊存儲、分布式文件存儲系統(tǒng)、對象存儲。
RADOSGW(Rados Gateway)
基于LIBRADOS API構(gòu)建的兼容了 s3 和 Swift 協(xié)議的 RESTful 網(wǎng)關(guān)。

RBD(Rados Block Device)
基于LIBRADOS API構(gòu)建的,使用了Linux內(nèi)核client和QEMU/KVM驅(qū)動程序的分布式塊存儲設(shè)備。

CEPHFS(Ceph FileSystem)
基于LIBRADOS API構(gòu)建的,符合POSIX標(biāo)準(zhǔn)的分布式文件系統(tǒng)。Ceph 文件系統(tǒng) 需要至少指定一個metadata存儲池和一個data存儲池,并且Ceph 文件系統(tǒng) 需要集群至少有一個Metadata服務(wù)。

Ceph邏輯組件
Object
Ceph 最底層的存儲單元是 Object 對象,每個 Object 包含元數(shù)據(jù)和原始數(shù)據(jù)。
PG
PG 全稱 Placement Grouops,是一個邏輯的概念,一個 PG 包含多個 OSD。引入 PG 這一層其實是為了更好的分配數(shù)據(jù)和定位數(shù)據(jù)。
CRUSH
CRUSH 是 Ceph 使用的數(shù)據(jù)分布算法,類似一致性哈希,讓數(shù)據(jù)分配到預(yù)期的地方。
文件存儲
不管是來自 Ceph 塊設(shè)備、 Ceph 對象存儲、 Ceph 文件系統(tǒng)、還是基于 librados 的自定義存儲,將數(shù)據(jù)存儲到 Ceph 集群上的步驟大致相同,大概可以歸納為Ceph客戶端將數(shù)據(jù)存放在存儲對象中,存儲對象經(jīng)過Ceph集群處理被發(fā)送給了 OSD ,由 OSD 將對象持久化到磁盤上。

Ceph OSD 在扁平的命名空間內(nèi)把所有數(shù)據(jù)存儲為對象(也就是沒有目錄層次)。對象包含一個標(biāo)識符、二進(jìn)制數(shù)據(jù)、和由名字/值對組成的元數(shù)據(jù),元數(shù)據(jù)語義完全取決于 Ceph 客戶端。例如, CephFS 用元數(shù)據(jù)存儲文件屬性,如文件所有者、創(chuàng)建日期、最后修改日期等等。

IO流程

- client 創(chuàng)建 cluster handler。
- client 讀取配置文件。
- client 連接上 monitor,獲取集群 map 信息。
- client 讀寫 io 根據(jù) crshmap 算法請求對應(yīng)的主 osd 數(shù)據(jù)節(jié)點。
- 主 osd 數(shù)據(jù)節(jié)點同時寫入另外兩個副本節(jié)點數(shù)據(jù)。
- 等待主節(jié)點以及另外兩個副本節(jié)點寫完數(shù)據(jù)狀態(tài)。
- 主節(jié)點及副本節(jié)點寫入狀態(tài)都成功后,返回給 client,io 寫入完成。

- File 用戶需要讀寫的文件。File->Object 映射:
a. ino (File 的元數(shù)據(jù),F(xiàn)ile 的唯一 id)。
b. ono(File 切分產(chǎn)生的某個 object 的序號,默認(rèn)以 4M 切分一個塊大小)。
c. oid(object id: ino + ono)。 - Object 是 RADOS 需要的對象。Ceph 指定一個靜態(tài) hash 函數(shù)計算 oid 的值,將 oid 映射成一個近似均勻分布的偽隨機值,然后和 mask 按位相與,得到 pgid。Object->PG 映射:
a) hash(oid) & mask-> pgid 。
b) mask = PG 總數(shù) m(m 為 2 的整數(shù)冪)-1 。 - PG(Placement Group),用途是對 object 的存儲進(jìn)行組織和位置映射, (類似于 redis cluster 里面的 slot 的概念) 一個 PG 里面會有很多 object。采用 CRUSH 算法,將 pgid 代入其中,然后得到一組 OSD。PG->OSD 映射:
a) CRUSH(pgid)->(osd1,osd2,osd3) 。
Ceph編排工具
Ceph社區(qū)開發(fā)了多種編排工具,方便你快速構(gòu)建一個Ceph集群。
如果你想在物理機上以傳統(tǒng)后臺服務(wù)的方式運行你的集群,可以使用基于ansible框架開發(fā)的ceph-ansible。
https://docs.ceph.com/projects/ceph-ansible/en/latest/index.html
如果你希望你的集群運行在物理機上的docker容器中,可以使用cephadm工具。
https://docs.ceph.com/en/quincy/cephadm/#cephadm
如果你希望你的集群運行在Kubernetes中,運行在云服務(wù)器上,可以使用rook-ceph。
https://rook.io/docs/rook/v1.10/Getting-Started/intro/
更多技術(shù)分享瀏覽我的博客:
參考
- [1] Ceph官方文檔
- [2] 分布式存儲 Ceph 介紹及原理架構(gòu)分享