分布式存儲 Ceph 介紹及原理架構(gòu)

概要

本文主要介紹Ceph存儲拍柒,從架構(gòu)簡介使用場景,以及內(nèi)部IO流程恼琼、心跳機制杖刷、通信框架、CRUSH算法驳癌、QOS等多個方面逐漸介紹分布式存儲系統(tǒng)Ceph的特性滑燃。

1. Ceph 架構(gòu)簡介及使用場景介紹

1.1 Ceph 簡介

Ceph 是一個統(tǒng)一的分布式存儲系統(tǒng),設計初衷是提供較好的性能颓鲜、可靠性和可擴展性表窘。

Ceph 項目最早起源于 Sage 就讀博士期間的工作(最早的成果于2004年發(fā)表),并隨后貢獻給開源社區(qū)甜滨。在經(jīng)過了數(shù)年的發(fā)展之后乐严,目前已得到眾多云計算廠商的支持并被廣泛應用。

RedHat 及 OpenStack 都可與 Ceph 整合以支持虛擬機鏡像的后端存儲衣摩。

1.2 Ceph 特點

高性能

  • 摒棄了傳統(tǒng)的集中式存儲元數(shù)據(jù)尋址的方案昂验,采用 CRUSH 算法,數(shù)據(jù)分布均衡艾扮,并行度高既琴。
  • 考慮了容災域的隔離,能夠?qū)崿F(xiàn)各類負載的副本放置規(guī)則泡嘴,例如跨機房甫恩、機架感知等。
  • 能夠支持上千個存儲節(jié)點的規(guī)模酌予,支持 TB 到 PB 級的數(shù)據(jù)磺箕。

高可用性

  • 副本數(shù)可以靈活控制。
  • 支持故障域分隔抛虫,數(shù)據(jù)強一致性松靡。
  • 多種故障場景自動進行修復自愈。
  • 沒有單點故障建椰,自動管理雕欺。

高可擴展性

  • 去中心化。
  • 擴展靈活广凸。
  • 隨著節(jié)點增加而線性增長阅茶。

特性豐富

  • 支持三種存儲接口:塊存儲蛛枚、文件存儲谅海、對象存儲。
  • 支持自定義接口蹦浦,支持多種語言驅(qū)動扭吁。

1.3 Ceph 架構(gòu)

支持三種接口:

  • Object:有原生的 API,而且也兼容 Swift 和 S3 的 API。
  • Block:支持精簡配置侥袜、快照蝌诡、克隆。
  • File:Posix 接口枫吧,支持快照浦旱。
image.png

1.4 Ceph 核心組件及概念介紹

Monitor
一個 Ceph 集群需要多個 Monitor 組成的小集群,它們通過 Paxos 同步數(shù)據(jù)九杂,用來保存 OSD 的元數(shù)據(jù)颁湖。

OSD
OSD 全稱 Object Storage Device,也就是負責響應客戶端請求返回具體數(shù)據(jù)的進程例隆。一個 Ceph 集群一般都有很多個 OSD甥捺。

MDS
MDS 全稱 Ceph Metadata Server,是 CephFS 服務依賴的元數(shù)據(jù)服務镀层。

Object
Ceph 最底層的存儲單元是 Object 對象镰禾,每個 Object 包含元數(shù)據(jù)和原始數(shù)據(jù)。

PG
PG 全稱 Placement Grouops唱逢,是一個邏輯的概念吴侦,一個 PG 包含多個 OSD。引入 PG 這一層其實是為了更好的分配數(shù)據(jù)和定位數(shù)據(jù)坞古。

RADOS
RADOS 全稱 Reliable Autonomic Distributed Object Store妈倔,是 Ceph 集群的精華,用戶實現(xiàn)數(shù)據(jù)分配绸贡、Failover 等集群操作盯蝴。

Libradio
Librados 是 Rados 提供庫,因為 RADOS 是協(xié)議很難直接訪問听怕,因此上層的 RBD捧挺、RGW 和 CephFS 都是通過 librados 訪問的,目前提供 PHP尿瞭、Ruby闽烙、Java、Python声搁、C和C++支持黑竞。

CRUSH
CRUSH 是 Ceph 使用的數(shù)據(jù)分布算法,類似一致性哈希疏旨,讓數(shù)據(jù)分配到預期的地方很魂。

RBD
RBD 全稱 RADOS block device,是 Ceph 對外提供的塊設備服務檐涝。

RGW
RGW 全稱 RADOS gateway遏匆,是 Ceph 對外提供的對象存儲服務法挨,接口與 S3 和 Swift 兼容。

CephFS
CephFS 全稱 Ceph File System幅聘,是 Ceph 對外提供的文件系統(tǒng)服務凡纳。

1.5 三種存儲類型-塊存儲

image.png

典型設備:
磁盤陣列,硬盤
主要是將裸磁盤空間映射給主機使用的帝蒿。

優(yōu)點:
a. 通過 Raid 與 LVM 等手段荐糜,對數(shù)據(jù)提供了保護。
b. 多塊廉價的硬盤組合起來葛超,提高容量狞尔。
c. 多塊磁盤組合出來的邏輯盤,提升讀寫效率巩掺。

缺點:
a. 采用 SAN 架構(gòu)組網(wǎng)時偏序,光纖交換機,造價成本高胖替。
b. 主機之間無法共享數(shù)據(jù)研儒。

使用場景:
a. docker 容器、虛擬機磁盤存儲分配独令。
b. 日志存儲端朵。
c. 文件存儲。
d. …

1.6 三種存儲類型-文件存儲

image.png

典型設備:
FTP燃箭、NFS 服務器
為了克服塊存儲文件無法共享的問題冲呢,所以有了文件存儲。
在服務器上架設 FTP 與 NFS 服務招狸,就是文件存儲敬拓。

優(yōu)點:
a. 造價低,隨便一臺機器就可以了裙戏。
b. 方便文件共享乘凸。

缺點:
a. 讀寫速率低。
b. 傳輸速率慢累榜。
c. 使用場景:
d. 日志存儲营勤。
e. 有目錄結(jié)構(gòu)的文件存儲。
f. …

1.7 三種存儲類型-對象存儲

image.png

典型設備:
內(nèi)置大容量硬盤的分布式服務器(swift壹罚,s3)
多臺服務器內(nèi)置大容量硬盤葛作,安裝上對象存儲管理軟件,對外提供讀寫訪問功能猖凛。

優(yōu)點:
a. 具備塊存儲的讀寫高速赂蠢。
b. 具備文件存儲的共享等特性。

使用場景:
(適合更新變動較少的數(shù)據(jù))
a. 圖片存儲形病。
b. 視頻存儲客年。
c. …

2. Ceph IO 流程

image.png

2.1 正常 IO 流程圖

image.png

步驟:

  1. client 創(chuàng)建 cluster handler。
  2. client 讀取配置文件漠吻。
  3. client 連接上 monitor量瓜,獲取集群 map 信息。
  4. client 讀寫 io 根據(jù) crshmap 算法請求對應的主 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 寫入完成。

2.2 新主 IO 流程圖

說明:
如果新加入的 OSD1 取代了原有的 OSD4 成為 Primary OSD试读,由于 OSD1 上未創(chuàng)建 PG 杠纵,不存在數(shù)據(jù),那么 PG 上的 I/O 無法進行钩骇,怎樣工作的呢比藻?

image.png

步驟:

  1. client 連接 monitor 獲取集群 map 信息。
  2. 同時新主 osd1 由于沒有 pg 數(shù)據(jù)會主動上報 monitor 告知讓 osd2 臨時接替為主倘屹。
  3. 臨時主 osd2 會把數(shù)據(jù)全量同步給新主 osd1银亲。
  4. client IO 讀寫直接連接臨時主 osd2 進行讀寫。
  5. osd2 收到讀寫 io纽匙,同時寫入另外兩副本節(jié)點务蝠。
  6. 等待 osd2 以及另外兩副本寫入成功。
  7. osd2 三份數(shù)據(jù)都寫入成功返回給 client烛缔,此時 client io 讀寫完畢馏段。
  8. 如果 osd1 數(shù)據(jù)同步完畢,臨時主 osd2 會交出主角色践瓷。
  9. osd1 成為主節(jié)點毅弧,osd2 變成副本。

2.3 Ceph IO 算法流程

image.png

1)File->Object 映射:
File用戶需要讀寫的文件当窗。
a)ino (File 的元數(shù)據(jù)够坐,F(xiàn)ile 的唯一id)。
b)ono(File 切分產(chǎn)生的某個 object 的序號崖面,默認以 4M 切分一個塊大性)。
c)oid(object id: ino + ono)巫员。

2)Object->PG 映射:
Object 是 RADOS 需要的對象庶香。Ceph 指定一個靜態(tài)hash函數(shù)計算 oid 的值,將 oid 映射成一個近似均勻分布的偽隨機值简识,然后和 mask 按位相與赶掖,得到 pgid感猛。
a)hash(oid) & mask-> pgid 。
b)mask = PG 總數(shù) m(m 為2的整數(shù)冪)-1 奢赂。

3) PG->OSD 映射:
PG(Placement Group)陪白,用途是對 object 的存儲進行組織和位置映射,(類似于 redis cluster 里面的 slot 的概念) 一個 PG 里面會有很多 object膳灶。采用 CRUSH 算法咱士,將 pgid 代入其中,然后得到一組 OSD轧钓。
a)CRUSH(pgid)->(osd1,osd2,osd3)序厉。

2.4 Ceph IO 偽代碼流程

locator = object_name
obj_hash = hash(locator)
pg = obj_hash % num_pg
osds_for_pg = crush(pg)    # returns a list of osds
primary = osds_for_pg[0]
replicas = osds_for_pg[1:]

2.5 Ceph RBD IO 流程

數(shù)據(jù)組織:

image.png

步驟:
a. 客戶端創(chuàng)建一個 pool,需要為這個 pool 指定 pg 的數(shù)量毕箍。
b. 創(chuàng)建 pool/image rbd 設備進行掛載弛房。
c. 用戶寫入的數(shù)據(jù)進行切塊,每個塊的大小默認為4M而柑,并且每個塊都有一個名字庭再,名字就是 object+序號。
d. 將每個 object 通過 pg 進行副本位置的分配牺堰。
e. pg 根據(jù) cursh 算法會尋找3個 osd拄轻,把這個 object 分別保存在這三個 osd 上。
f. osd 上實際是把底層的 disk 進行了格式化操作伟葫,一般部署工具會將它格式化為 xfs 文件系統(tǒng)恨搓。
g. object 的存儲就變成了存儲一個文 rbd0.object1.file。

2.6 Ceph RBD IO 框架圖

image.png

客戶端寫數(shù)據(jù) osd 過程:
a. 采用的是 librbd 的形式筏养,使用 librbd 創(chuàng)建一個塊設備斧抱,向這個塊設備中寫入數(shù)據(jù)。
b. 在客戶端本地同過調(diào)用 librados 接口渐溶,然后經(jīng)過 pool辉浦,rbd,object茎辐、pg 進行層層映射,在 PG 這一層中宪郊,可以知道數(shù)據(jù)保存在哪3個 OSD 上,這3個 OSD 分為主從的關系拖陆。
c. 客戶端與 primay OSD 建立 SOCKET 通信弛槐,將要寫入的數(shù)據(jù)傳給 primary OSD,由primary OSD 再將數(shù)據(jù)發(fā)送給其他 replica OSD 數(shù)據(jù)節(jié)點依啰。

2.7 Ceph Pool 和 PG 分布情況

image.png

說明:
a. pool 是 ceph 存儲數(shù)據(jù)時的邏輯分區(qū)乎串,它起到 namespace 的作用。
b. 每個 pool 包含一定數(shù)量(可配置)的 PG速警。
c. PG 里的對象被映射到不同的 OSD 上叹誉。
d. pool 是分布到整個集群的鸯两。
e. pool 可以做故障隔離域,根據(jù)不同的用戶場景不一進行隔離长豁。

2.8 Ceph 數(shù)據(jù)擴容 PG 分布

場景數(shù)據(jù)遷移流程:

  • 現(xiàn)狀3個 OSD钧唐,4個 PG
  • 擴容到4個 OSD,4個 PG

現(xiàn)狀:

image.png

擴容后:

image.png

說明:

每個 OSD 上分布很多 PG蕉斜,并且每個 PG 會自動散落在不同的 OSD 上逾柿。如果擴容那么相應的 PG 會進行遷移到新的 OSD 上缀棍,保證 PG 數(shù)量的均衡宅此。

3. Ceph 心跳機制

3.1 心跳介紹

心跳是用于節(jié)點間檢測對方是否故障的,以便及時發(fā)現(xiàn)故障節(jié)點進入相應的故障處理流程爬范。

問題:

  • 故障檢測時間和心跳報文帶來的負載之間做權衡父腕。
  • 心跳頻率太高則過多的心跳報文會影響系統(tǒng)性能。
  • 心跳頻率過低則會延長發(fā)現(xiàn)故障節(jié)點的時間青瀑,從而影響系統(tǒng)的可用性璧亮。
  • 故障檢測策略應該能夠做到:

及時:節(jié)點發(fā)生異常如宕機或網(wǎng)絡中斷時,集群可以在可接受的時間范圍內(nèi)感知斥难。
適當?shù)膲毫Γ喊▽?jié)點的壓力枝嘶,和對網(wǎng)絡的壓力。
容忍網(wǎng)絡抖動:網(wǎng)絡偶爾延遲哑诊。
擴散機制:節(jié)點存活狀態(tài)改變導致的元信息變化需要通過某種機制擴散到整個集群群扶。

3.2 Ceph 心跳檢測

image.png

OSD 節(jié)點會監(jiān)聽 public、cluster镀裤、front 和 back 四個端口

  • public 端口:監(jiān)聽來自 Monitor 和 Client 的連接竞阐。
  • cluster 端口:監(jiān)聽來自 OSD Peer 的連接。
  • front 端口:供客戶端連接集群使用的網(wǎng)卡暑劝,這里臨時給集群內(nèi)部之間進行心跳骆莹。
  • back 端口:供客集群內(nèi)部使用的網(wǎng)卡。集群內(nèi)部之間進行心跳担猛。
  • hbclient:發(fā)送 ping 心跳的 messenger幕垦。

3.3 Ceph OSD 之間相互心跳檢測

image.png

步驟:
a. 同一個 PG 內(nèi) OSD 互相心跳,他們互相發(fā)送 PING/PONG 信息傅联。
b. 每隔6s檢測一次(實際會在這個基礎上加一個隨機時間來避免峰值)智嚷。
c. 20s沒有檢測到心跳回復,加入 failure 隊列纺且。

3.4 Ceph OSD與Mon心跳檢測

image.png

OSD 報告給 Monitor:
a. OSD 有事件發(fā)生時(比如故障涉兽、PG 變更)。
b. 自身啟動5秒內(nèi)社露。
c. OSD 周期性的上報給 Monito
d. OSD 檢查 failure_queue 中的伙伴 OSD 失敗信息。
e. 向 Monitor 發(fā)送失效報告衅枫,并將失敗信息加入 failure_pending 隊列,然后將其從 failure_queue 移除朗伶。
f. 收到來自 failure_queue 或者 failure_pending 中的 OSD 的心跳時弦撩,將其從兩個隊列中移除,并告知 Monitor 取消之前的失效報告论皆。
g. 當發(fā)生與 Monitor 網(wǎng)絡重連時益楼,會將 failure_pending 中的錯誤報告加回到 failure_queue 中,并再次發(fā)送給 Monitor点晴。
h. Monitor 統(tǒng)計下線 OSD
i. Monitor 收集來自 OSD 的伙伴失效報告感凤。
j. 當錯誤報告指向的 OSD 失效超過一定閾值,且有足夠多的 OSD 報告其失效時粒督,將該 OSD 下線陪竿。

3.5 Ceph 心跳檢測總結(jié)

Ceph 通過伙伴 OSD 匯報失效節(jié)點和 Monitor 統(tǒng)計來自 OSD 的心跳兩種方式判定 OSD 節(jié)點失效。

及時:
伙伴 OSD 可以在秒級發(fā)現(xiàn)節(jié)點失效并匯報 Monitor屠橄,并在幾分鐘內(nèi)由 Monitor 將失效 OSD 下線族跛。

適當?shù)膲毫Γ?/strong>
由于有伙伴 OSD 匯報機制,Monitor 與 OSD 之間的心跳統(tǒng)計更像是一種保險措施锐墙,因此 OSD 向 Monitor 發(fā)送心跳的間隔可以長達600秒礁哄,Monitor 的檢測閾值也可以長達900秒。Ceph 實際上是將故障檢測過程中中心節(jié)點的壓力分散到所有的 OSD 上溪北,以此提高中心節(jié)點 Monitor 的可靠性桐绒,進而提高整個集群的可擴展性。

容忍網(wǎng)絡抖動:
Monitor 收到 OSD 對其伙伴 OSD 的匯報后刻盐,并沒有馬上將目標 OSD 下線掏膏,而是周期性的等待幾個條件:
a. 目標 OSD 的失效時間大于通過固定量 osd_heartbeat_grace 和歷史網(wǎng)絡條件動態(tài)確定的閾值。
b. 來自不同主機的匯報達到 mon_osd_min_down_reporters敦锌。
c. 滿足前兩個條件前失效匯報沒有被源 OSD 取消馒疹。

擴散:
作為中心節(jié)點的 Monitor 并沒有在更新 OSDMap 后嘗試廣播通知所有的 OSD 和 Client,而是惰性的等待 OSD 和 Client 來獲取乙墙。以此來減少 Monitor 壓力并簡化交互邏輯颖变。

4. Ceph 通信框架

4.1 Ceph 通信框架種類介紹

網(wǎng)絡通信框架三種不同的實現(xiàn)方式:

Simple 線程模式
特點:每一個網(wǎng)絡鏈接,都會創(chuàng)建兩個線程听想,一個用于接收腥刹,一個用于發(fā)送。
缺點:大量的鏈接會產(chǎn)生大量的線程汉买,會消耗 CPU 資源衔峰,影響性能。

Async 事件的I/O多路復用模式
特點:這種是目前網(wǎng)絡通信中廣泛采用的方式。k版默認已經(jīng)使用 Asnyc 了垫卤。

XIO 方式使用了開源的網(wǎng)絡通信庫 accelio 來實現(xiàn)
特點:這種方式需要依賴第三方的庫 accelio 穩(wěn)定性威彰,目前處于試驗階段。

4.2 Ceph 通信框架設計模式

設計模式(Subscribe/Publish):
訂閱發(fā)布模式又名觀察者模式穴肘,它意圖是“定義對象間的一種一對多的依賴關系歇盼,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新”评抚。

4.3 Ceph 通信框架流程圖

image.png

步驟:
a. Accepter 監(jiān)聽 peer 的請求豹缀,調(diào)用 SimpleMessenger::add_accept_pipe() 創(chuàng)建新的 Pipe 到 SimpleMessenger::pipes 來處理該請求。
b. Pipe 用于消息的讀取和發(fā)送慨代。該類主要有兩個組件邢笙,Pipe::Reader,Pipe::Writer 用來處理消息讀取和發(fā)送鱼响。
c. Messenger 作為消息的發(fā)布者鸣剪,各個 Dispatcher 子類作為消息的訂閱者组底,Messenger 收到消息之后丈积,通過 Pipe 讀取消息,然后轉(zhuǎn)給 Dispatcher 處理债鸡。
d. Dispatcher 是訂閱者的基類江滨,具體的訂閱后端繼承該類,初始化的時候通過 Messenger::add_dispatcher_tail/head 注冊到 Messenger::dispatchers. 收到消息。
e. DispatchQueue 該類用來緩存收到的消息厌均,然后喚醒 DispatchQueue::dispatch_thread 線程找到后端的 Dispatch 處理消息唬滑。

image.png

4.4 Ceph 通信框架類圖

image.png

4.5 Ceph 通信數(shù)據(jù)格式

通信協(xié)議格式需要雙方約定數(shù)據(jù)格式。

消息的內(nèi)容主要分為三部分:

  • header //消息頭棺弊,類型消息的信封
  • user data //需要發(fā)送的實際數(shù)據(jù)
    • payload //操作保存元數(shù)據(jù)
    • middle //預留字段
    • data //讀寫數(shù)據(jù)
  • footer //消息的結(jié)束標記
class Message : public RefCountedObject {
protected:
  ceph_msg_header  header;      // 消息頭
  ceph_msg_footer  footer;      // 消息尾
  bufferlist       payload;  // "front" unaligned blob
  bufferlist       middle;   // "middle" unaligned blob
  bufferlist       data;     // data payload (page-alignment will be preserved where possible)  

  /* recv_stamp is set when the Messenger starts reading the
   * Message off the wire */
  utime_t recv_stamp;       //開始接收數(shù)據(jù)的時間戳    
  /* dispatch_stamp is set when the Messenger starts calling dispatch() on  
   * its endpoints */
  utime_t dispatch_stamp;   //dispatch 的時間戳
  /* throttle_stamp is the point at which we got throttle */
  utime_t throttle_stamp;   //獲取throttle 的slot的時間戳
  /* time at which message was fully read */
  utime_t recv_complete_stamp;  //接收完成的時間戳
  ConnectionRef connection;     //網(wǎng)絡連接
  uint32_t magic = 0;           //消息的魔術字
  bi::list_member_hook<> dispatch_q;  //boost::intrusive 成員字段
};

struct ceph_msg_header {
    __le64 seq;       // 當前session內(nèi) 消息的唯一序號
    __le64 tid;        // 消息的全局唯一的 id   
    __le16 type;       // 消息類型
    __le16 priority;    // 優(yōu)先級
__le16 version;    // 版本號

    __le32 front_len;   // payload 的長度
    __le32 middle_len;  // middle 的長度
    __le32 data_len;    // data 的長度
    __le16 data_off;    // 對象的數(shù)據(jù)偏移量
    
    
    struct ceph_entity_name src;    //消息源
    
    /* oldest code we think can decode this.  unknown if zero. */
    __le16 compat_version;  
    __le16 reserved;
    __le32 crc;       /* header crc32c */
} __attribute__ ((packed));


struct ceph_msg_footer {
    __le32 front_crc, middle_crc, data_crc; //crc校驗碼
    __le64  sig; //消息的64位signature
    __u8 flags; //結(jié)束標志
} __attribute__ ((packed));

5. Ceph CRUSH 算法

5.1 數(shù)據(jù)分布算法挑戰(zhàn)

數(shù)據(jù)分布和負載均衡:

  • 數(shù)據(jù)分布均衡晶密,使數(shù)據(jù)能均勻的分布到各個節(jié)點上。
  • 負載均衡模她,使數(shù)據(jù)訪問讀寫操作的負載在各個節(jié)點和磁盤的負載均衡稻艰。

靈活應對集群伸縮:

  • 系統(tǒng)可以方便的增加或者刪除節(jié)點設備,并且對節(jié)點失效進行處理侈净。
  • 增加或者刪除節(jié)點設備后尊勿,能自動實現(xiàn)數(shù)據(jù)的均衡,并且盡可能少的遷移數(shù)據(jù)畜侦。

支持大規(guī)模集群:

  • 要求數(shù)據(jù)分布算法維護的元數(shù)據(jù)相對較小元扔,并且計算量不能太大。隨著集群規(guī)模的增 加旋膳,數(shù)據(jù)分布算法開銷相對比較小澎语。

5.2 Ceph CRUSH 算法說明

CRUSH 算法的全稱為:Controlled Scalable Decentralized Placement of Replicated Data,可控的、可擴展的擅羞、分布式的副本數(shù)據(jù)放置算法盯孙。

PG到OSD 的映射的過程算法叫做 CRUSH 算法。(一個 Object 需要保存三個副本祟滴,也就是需要保存在三個 osd 上)振惰。

CRUSH 算法是一個偽隨機的過程,他可以從所有的 OSD 中垄懂,隨機性選擇一個 OSD 集合骑晶,但是同一個 PG 每次隨機選擇的結(jié)果是不變的,也就是映射的 OSD 集合是固定的草慧。

5.3 Ceph CRUSH 算法原理

CRUSH 算法因子:

  • 層次化的 Cluster Map
    反映了存儲系統(tǒng)層級的物理拓撲結(jié)構(gòu)桶蛔。定義了 OSD 集群具有層級關系的靜態(tài)拓撲結(jié)構(gòu)。OSD 層級使得 CRUSH 算法在選擇 OSD 時實現(xiàn)了機架感知能力漫谷,也就是通過規(guī)則定義仔雷, 使得副本可以分布在不同的機 架、不同的機房中舔示、提供數(shù)據(jù)的安全性 碟婆。

  • Placement Rules
    決定了一個 PG 的對象副本如何選擇的規(guī)則,通過這些可以自己設定規(guī)則惕稻,用戶可以自定義設置副本在集群中的分布竖共。

5.3.1 層級化的 Cluster Map

image.png

CRUSH Map 是一個樹形結(jié)構(gòu),OSDMap 更多記錄的是 OSDMap 的屬性(epoch/fsid/pool 信息以及 osd 的 ip 等等)俺祠。

葉子節(jié)點是 device(也就是 osd)公给,其他的節(jié)點稱為 bucket 節(jié)點,這些 bucket 都是虛構(gòu)的節(jié)點蜘渣,可以根據(jù)物理結(jié)構(gòu)進行抽象淌铐,當然樹形結(jié)構(gòu)只有一個最終的根節(jié)點稱之為 root 節(jié)點,中間虛擬的 bucket 節(jié)點可以是數(shù)據(jù)中心抽象蔫缸、機房抽象腿准、機架抽象、主機抽象等捂龄。

5.3.2 數(shù)據(jù)分布策略 Placement Rules

數(shù)據(jù)分布策略 Placement Rules 主要有特點:

  • 從 CRUSH Map 中的哪個節(jié)點開始查找
  • 使用那個節(jié)點作為故障隔離域
  • 定位副本的搜索模式(廣度優(yōu)先 or 深度優(yōu)先)
rule replicated_ruleset  #規(guī)則集的命名释涛,創(chuàng)建pool時可以指定rule集
{
    ruleset 0                             # rules集的編號,順序編即可 
    type replicated                       # 定義pool類型為replicated(還有erasure模式)
    min_size 1                            # pool中最小指定的副本數(shù)量不能小1
    max_size 10                           # pool中最大指定的副本數(shù)量不能大于10
    step take default                     # 查找bucket入口點倦沧,一般是root類型的bucket
    step chooseleaf firstn 0 type host    #選擇一個host,并遞歸選擇葉子節(jié)點osd
    step emit                             # 結(jié)束
}

5.3.3 Bucket 隨機算法類型

image.png
  • 一般的 buckets:適合所有子節(jié)點權重相同唇撬,而且很少添加刪除 item。
  • list buckets:適用于集群擴展類型展融。增加 item窖认,產(chǎn)生最優(yōu)的數(shù)據(jù)移動,查找 item,時間復雜度 O(n)扑浸。
  • tree buckets:查找負責度是 O (log n)烧给,添加刪除葉子節(jié)點時,其他節(jié)點 node_id 不變喝噪。
  • straw buckets:允許所有項通過類似抽簽的方式來與其他項公平“競爭”础嫡。定位副本時,bucket 中的每一項都對應一個隨機長度的 straw酝惧,且擁有最長長度的 straw 會獲得勝利(被選中)榴鼎,添加或者重新計算,子樹之間的數(shù)據(jù)移動提供最優(yōu)的解決方案晚唇。

5.4 Ceph CRUSH 算法案例

說明:
集群中有部分 sas 和 ssd 磁盤巫财,現(xiàn)在有個業(yè)務線性能及可用性優(yōu)先級高于其他業(yè)務線,能否讓這個高優(yōu)業(yè)務線的數(shù)據(jù)都存放在 ssd 磁盤上哩陕。

普通用戶:


image.png

高優(yōu)用戶:


image.png

配置規(guī)則:


image.png

6. 定制化 Ceph RBD QOS

6.1 QOS 介紹

QoS (Quality of Service平项,服務質(zhì)量)起源于網(wǎng)絡技術,它用來解決網(wǎng)絡延遲和阻塞等問題悍及,能夠為指定的網(wǎng)絡通信提供更好的服務能力闽瓢。

問題:
我們總的 Ceph 集群的 IO 能力是有限的,比如帶寬并鸵,IOPS鸳粉。如何避免用戶爭搶資源扔涧,如何保證集群所有用戶資源的高可用性园担,以及如何保證高優(yōu)用戶資源的可用性。所以我們需要把有限的 IO 能力合理分配枯夜。

6.2 Ceph IO 操作類型

ClientOp:來自客戶端的讀寫 I/O 請求弯汰。
SubOp:osd 之間的 I/O 請求。主要包括由客戶端 I/O 產(chǎn)生的副本間數(shù)據(jù)讀寫請求湖雹,以及由數(shù)據(jù)同步咏闪、數(shù)據(jù)掃描、負載均衡等引起的 I/O 請求摔吏。
SnapTrim:快照數(shù)據(jù)刪除鸽嫂。從客戶端發(fā)送快照刪除命令后,刪除相關元數(shù)據(jù)便直接返回征讲,之后由后臺線程刪除真實的快照數(shù)據(jù)据某。通過控制 snaptrim 的速率間接控制刪除速率。
Scrub:用于發(fā)現(xiàn)對象的靜默數(shù)據(jù)錯誤诗箍,掃描元數(shù)據(jù)的 Scrub 和對象整體掃描的 deep Scrub癣籽。
Recovery:數(shù)據(jù)恢復和遷移。集群擴/縮容、osd 失效/從新加入等過程筷狼。

6.3 Ceph 官方 QOS 原理

image.png

mClock 是一種基于時間標簽的 I/O 調(diào)度算法瓶籽,最先被 Vmware 提出來的用于集中式管理的存儲系統(tǒng)。(目前官方 QOS 模塊屬于半成品)埂材。

基本思想:

  • reservation 預留塑顺,表示客戶端獲得的最低 I/O 資源。
  • weight 權重俏险,表示客戶端所占共享 I/O 資源的比重茬暇。
  • limit 上限,表示客戶端可獲得的最高 I/O 資源寡喝。

6.4 定制化 QOS 原理

6.4.1 令牌桶算法介紹

image.png

基于令牌桶算法(TokenBucket)實現(xiàn)了一套簡單有效的 qos 功能糙俗,滿足了云平臺用戶的核心需求。

基本思想:
a. 按特定的速率向令牌桶投放令牌预鬓。
b. 根據(jù)預設的匹配規(guī)則先對報文進行分類巧骚,不符合匹配規(guī)則的報文不需要經(jīng)過令牌桶的處理,直接發(fā)送格二。
c. 符合匹配規(guī)則的報文劈彪,則需要令牌桶進行處理。當桶中有足夠的令牌則報文可以被繼續(xù)發(fā)送下去顶猜,同時令牌桶中的令牌量按報文的長度做相應的減少沧奴。
d. 當令牌桶中的令牌不足時,報文將不能被發(fā)送长窄,只有等到桶中生成了新的令牌滔吠,報文才可以發(fā)送。這就可以限制報文的流量只能是小于等于令牌生成的速度挠日,達到限制流量的目的疮绷。

6.4.2 RBD 令牌桶算法流程

image.png

步驟:
a. 用戶發(fā)起請求異步IO到達Image中。
b. 請求到達ImageRequestWQ隊列中嚣潜。
c. 在ImageRequestWQ出隊列的時候加入令牌桶算法TokenBucket冬骚。
d. 通過令牌桶算法進行限速,然后發(fā)送給ImageRequest進行處理懂算。

6.4.3 RBD令牌桶算法框架圖

現(xiàn)有框架圖:

image.png

令牌圖算法框架圖:

image.png

整理中....

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末只冻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子计技,更是在濱河造成了極大的恐慌喜德,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酸役,死亡現(xiàn)場離奇詭異住诸,居然都是意外死亡驾胆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門贱呐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丧诺,“玉大人,你說我怎么就攤上這事奄薇〔笛郑” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵馁蒂,是天一觀的道長呵晚。 經(jīng)常有香客問我,道長沫屡,這世上最難降的妖魔是什么饵隙? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮沮脖,結(jié)果婚禮上金矛,老公的妹妹穿的比我還像新娘。我一直安慰自己勺届,他們只是感情好驶俊,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著免姿,像睡著了一般饼酿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胚膊,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天故俐,我揣著相機與錄音,去河邊找鬼澜掩。 笑死购披,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的肩榕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惩妇,長吁一口氣:“原來是場噩夢啊……” “哼株汉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起歌殃,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤乔妈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后氓皱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體路召,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡勃刨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了股淡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片身隐。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唯灵,靈堂內(nèi)的尸體忽然破棺而出贾铝,到底是詐尸還是另有隱情,我是刑警寧澤埠帕,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布垢揩,位于F島的核電站,受9級特大地震影響敛瓷,放射性物質(zhì)發(fā)生泄漏叁巨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一呐籽、第九天 我趴在偏房一處隱蔽的房頂上張望俘种。 院中可真熱鬧,春花似錦绝淡、人聲如沸宙刘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悬包。三九已至,卻和暖如春馍乙,著一層夾襖步出監(jiān)牢的瞬間布近,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工丝格, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撑瞧,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓显蝌,卻偏偏與公主長得像预伺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子曼尊,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容