Ceph簡介

Ceph簡介

什么是分布式存儲

與集中式存儲相反,分布式存儲通常采用存儲單元集群的形式,并具有在集群節(jié)點之間進(jìn)行數(shù)據(jù)同步和協(xié)調(diào)的機制。分布式存儲最初是由Google提出的,其目的是通過廉價服務(wù)器解決大規(guī)模,高并發(fā)情況下的Web訪問問題。

分布式存儲具有幾個優(yōu)點:

  1. 可擴展性-支持通過在系統(tǒng)中添加或刪除存儲單元來水平擴展存儲系統(tǒng)。
  2. 冗余-在多臺服務(wù)器之間存儲相同數(shù)據(jù)的復(fù)制,以實現(xiàn)高可用性, 備份和災(zāi)難恢復(fù)目的。
  3. 節(jié)省成本 -可以使用更便宜的商品服務(wù)器以低成本存儲大量 數(shù)據(jù)。
  4. 性能-在某些情況下,性能比單個服務(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)點

  1. 高性能
    a. 摒棄了傳統(tǒng)的集中式存儲元數(shù)據(jù)尋址的方案,采用CRUSH算法,數(shù)據(jù)分布均衡,并行度高。
    b. 考慮了容災(zāi)域的隔離,能夠?qū)崿F(xiàn)各類負(fù)載的副本放置規(guī)則,例如跨機房、機架感知等。
    c. 能夠支持上千個存儲節(jié)點的規(guī)模,支持TB到PB級的數(shù)據(jù)。
  2. 高可用性
    a. 副本數(shù)可以靈活控制。
    b. 支持故障域分隔,數(shù)據(jù)強一致性。
    c. 多種故障場景自動進(jìn)行修復(fù)自愈。
    d. 沒有單點故障,自動管理。
  3. 高可擴展性
    a. 去中心化。
    b. 擴展靈活。
    c. 隨著節(jié)點增加而線性增長。
  4. 特性豐富
    a. 支持三種存儲接口:塊存儲、文件存儲、對象存儲。
    b. 支持自定義接口,支持多種語言驅(qū)動。

服務(wù)架構(gòu)

一個 Ceph 存儲集群至少需要一個 Ceph Monitor(監(jiān)視器)、Ceph Manager(管理器) 和 Ceph OSD(對象存儲守護(hù)進(jìn)程)。

服務(wù)架構(gòu)

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 等多種語言。

邏輯架構(gòu)

用戶可以基于自己的業(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)。


rgw

RBD(Rados Block Device)

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


rbd

CEPHFS(Ceph FileSystem)

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


Cephfs

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 將對象持久化到磁盤上。


File

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

Binary

IO流程

IO
  1. client 創(chuàng)建 cluster handler。
  2. client 讀取配置文件。
  3. client 連接上 monitor,獲取集群 map 信息。
  4. client 讀寫 io 根據(jù) crshmap 算法請求對應(yīng)的主 osd 數(shù)據(jù)節(jié)點。
  5. 主 osd 數(shù)據(jù)節(jié)點同時寫入另外兩個副本節(jié)點數(shù)據(jù)。
  6. 等待主節(jié)點以及另外兩個副本節(jié)點寫完數(shù)據(jù)狀態(tài)。
  7. 主節(jié)點及副本節(jié)點寫入狀態(tài)都成功后,返回給 client,io 寫入完成。
Logical
  1. 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)。
  2. 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 。
  3. 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ù)分享瀏覽我的博客:

https://thierryzhou.github.io

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容