Ceph理论概述
Ceph概述:
概述:Ceph是根據加州大學Santa Cruz分校的Sage Weil的博士論文所設計開發的新一代自由軟件分布式文件系統,其設計目標是良好的可擴展性(PB級別以上)、高性能、高可靠性。Ceph其命名和UCSC(Ceph 的誕生地)的吉祥物有關,這個吉祥物是“Sammy”,一個香蕉色的蛞蝓,就是頭足類中無殼的軟體動物。這些有多觸角的頭足類動物,是對一個分布式文件系統高度并行的形象比喻。 其設計遵循了三個原則:數據與元數據的分離,動態的分布式的元數據管理,可靠統一的分布式對象存儲機制。
#Ceph的發展:
https://www.baidu.com/link?url=1dPkRw3OOLw-RwjqxF8sVgExHgCW3kKULnXm0yyj8_5J9yg6mUnvbQTjM_Pi07mH&wd=&eqid=bd24450f000398f3000000065bff44b4
Ceph存儲架構
ceph存儲集群有幾個不同的軟件守護進程組成,每個守護進程負責Ceph的一個獨特功能并添加到相應的組件中。每個守護京城是彼此獨立的。這是保持Ceph存儲集群比黑匣子似的商業存儲系統更加便宜的諸多特性中的一個。下圖簡要闡述了每個Ceph組件的功能;
Ceph的底層是RADOS(Reliable Autonomic Distributed Object Store 可靠、自動、分布式對象存儲)是Ceph存儲的基礎。由自恢復、自管理的智能存儲節點組成,Ceph中一切都以對象的形式存儲,而RADOS就負責存儲這些對象,而不考慮他們的數據類型,RADOS層還確保數據的一致性和可靠性。對于數據一致性,它執行數據復制、故障檢測與恢復,還包括數據在集群節點間的遷移和再平衡。
Librados 是一個本地C語言庫,它允許應用直接訪問RADOS的庫,這樣就可以繞過其他接口層與Ceph集群進行交互,是一種簡化訪問RADOS的方法,它目前支持PHP、Ruby、Java、Python、C和C++語言。他提供Ceph儲存集群的一個本地接口RADOS,并且是其他服務(RBD、RGW、)的基礎,以及為CephGW提供POSIX接口。librados支持直接訪問RADOS,使得開發者能夠創建自己的接口來訪問Ceph集群存儲。librados提供了豐富的API子集,高效地在一個對象中儲存鍵/值對
RBD(塊設備接口)是連接虛擬機,可靠和完全分布式的塊設備存儲,具有內核和QEMV/KVM兩種接口,他們能無縫地訪問Ceph塊設備。
RADOSGW Ceph對象儲存接口,也就是對象網關,也稱作RADOS網關,它是一個代理,可以將HTTP請求轉換為RADOS,同時也可以把RADOS請求轉換為HTTP請求,從而提供RESTful對象存儲,與S3和Swift兼容。
CephFS CephFS是一個文件系統,依賴MDS來跟蹤文件層次結構(元數據)。Ceph是一個兼容POSIX的文件系統,他利用Ceph儲存集群來保存用戶數據。Linux內核驅動支持CephFS使得CephFS高度適用于各大Linux操作系統發行版。CephFs將數據和元數據分開存儲,為上層的應用程序提供較高的性能以及可靠性。
Ceph MDS 是元數據服務器,只有Ceph文件系統(CephFS)才需要,其他儲存方法不需要,如果基于對象不需要MDS服務。
Monitor節點
-
Monitor監控節點,通過一系列的map來跟跟蹤整個集群,所有節點必須向mon來報告狀態,并分享每一個的狀態信息
-
Monitor負責監控整個集群的健康狀況,他們以守護進程的形式存在,這些守護進程通過集群的關鍵信息來維護集群成員的狀態、對等節點及集群配置信息;
-
Monitor節點不為客戶端存儲和提供數據,它為客戶端及其他節點提供更新和map服務,客戶端和節點定期與mon確認自己持有的是否是最新的map
Cluster map的概念
-
Cluster maps由monitor節點維護;
-
多個monitor構成集群;
-OSD故障的仲裁
-Paxos一致性
-
Client第一次需要向monitor請求該map;
-
所有的mpa具有版本特性,實現異步的lazy同步
Cluster map包括:
mon map、OSD map、PG map、CRUSH map及MDS map
Monitor map:它維護這mon節點間端到端的信息,包括Ceph集群的ID、mon節點主機名、IP地址及端口號。它還存儲著當前map的創建版本和最后一次修改的信息。
OSD map:它存儲著一些行間的信息,如集群的ID,OSD map的創建版本和最后一次修改信息,以及與池相關的信息(如池名字、池ID、類型、副本數、歸置組),它還存儲著OSD的一些信息,如數目,狀態,權重,最近處于clean狀態的間隔以及OSD的主機等信息。
PG map:它存儲著歸置組的版本、時間戳、最新OSD map版本、容量充滿的比例以及容量接近充滿的比例等信息(占滿率)。它同時也跟蹤每個歸置組的ID、對象數、狀態時間戳、OSD的up set、acting set、pg的狀態、最后還有各儲存池的數據使用情況,統計清洗信息。
MDS map:它存儲著當前MDS map版本、map創建和修改時間、數據和元數據池的ID。還包含了存儲元數據的存儲池,元數據的服務器列表,還有哪些元數據是up或者in的。
CRUSH map(包括四個部分)
Devices: 表示集群中當前或者歷史的OSD,如果id對應的OSD在集群中還存在, 那么device的名稱就是osd的名稱,比如osd.1;如果device id對應的osd在集群中 不存在了,那么device name的名稱是device+id,比如device0
Bucket Types: Bucket定義了CRUSH層級結構中Bucket的類型。比如rows, racks, chassis, hosts等
Bucket instances: 對集群中的資源,定義它屬于某個類型的bucket。比如物理機 的bucket type為host
Rules: 定義了選擇bucket的規則;
CRUSH map 存儲著集群的存儲信息、故障域的層次結構、OSD的列表、bucket的列表、rule的列表(Rules:故障域中定義如何存儲數據的規則。)
一個典型的Ceph集群包含多個mon節點,多mon節點的Ceph架構使用了quorum(仲裁),使用paxos算法為集群提供了分布式決策機制。集群的mon節點應該是奇數個,最低要求是一個,推薦是3個mon節點。開始仲裁操作時,至少保證一半以上的mon節點始終屬于可用的狀態,這樣可以防止腦裂問題;
所謂腦裂問題(類似于精神分裂),就是同一個集群中的不同節點,對于集群的狀態有了不一樣的理解。
在所有集群mon中,其中有一個領導者leader,如果leader不可用,其他mon也有權成為leader。
OSD節點
-
OSD全稱Object Storage Device,存儲實際數據,并響應客戶端的操作。一個Ceph集群一般都有很多個OSD。一塊物理磁盤對應一塊osd。
-
OSD分為主OSD和從OSD,是及進行分級存儲。
-
每個OSD節點進行互相通訊
-
OSD是對象存儲模式,文件系統支持Btrfs、XFS、ext4格式;
MDS節點
-
Ceph MDS是元數據服務器,只有CephFS才需要,MDS作為一個守護進程運行,允許客戶端隨意掛載一個POSIX文件系統。MDS不像客戶端提供數據,數據通過OSD來提供。
-
MDS節點比較占資源,他們需要更強的CPU處理能力,它依賴大量的數據緩存,因為他們需要快速的訪問數據
pg(placement group)
-
pg是不可見的,但是在Ceph中扮演非常重要的角色;pg是Ceph執行re-balance時的基本單位。在對象數量比較多時,跟蹤pool中每一個對象的位置開銷很大。
-
為了高效地跟蹤對象的位置,Ceph將一個pool分為多個PG;先將對象分到PG中,然后再將PG放到 primary OSD上。如果一個OSD掛了,Ceph會將存放在這個OSD上的所有PG移動或復制到別的地方。
-
可以將pg看成一個邏輯容器,這個容器包含多個對象,同時這個邏輯容器被映射到多個OSD上,pg是保障Ceph存儲系統的可伸縮性和性能必不可少的部分;
pool
-
pool是存儲在ceph中對象的邏輯組,
-
pool由pg組成。在創建pool的時候,我們需要提供pool中pg的數量和對象的副本數。 pool會將某個對象按照副本數分布在多個osd上,保證數據的可靠性。
-
ceph集群可以有多個pool 每個pool有多個pg,pg數量在pool創建的時候指定好 一個pg包含多個對象 pg分布在多個osd上面。第一個映射的osd是primary osd,后面的是secondary osd ,很多pg映射到一個osd。
-
池可以通過創建需要的副本數來保障數據的高可用性,比如通過復制或者糾刪碼的方式。
-
糾刪碼(EC)特性就是Ceph的新功能,糾刪碼就是一種數據保護方法,他首先將數據分解成塊,接著編碼,然后以分布式的的方式去存儲。
-
當數據寫入一個池的時候,Ceph的池會映射到一個CRUSH規則集,CRUSH規則集就是通過識別池來實現集群內對象的分布和副本數;CRUSH規則集為Ceph提供了新的功能
例如,
-
我們可以創建一個SSD硬盤的faster池,也就是緩存池;
-
緩存池:
-
所有的客戶端I/O操作都首先由緩存池處理。之后,再將數據寫回到現有的數據池中。客戶端能夠在緩存池上享受高性能,而它們的數據顯而易見最終是被寫入到常規池中的。
-
一般來說,緩存層構建在昂貴/速度更快的SSD磁盤上,這樣才能為客戶提供更好的I/O性能。
CRUSH算法
-
CRUSH是Ceph的只能數據分發機制,是整個Ceph數據存儲機制的核心,Ceph使用crush算法來準確的計算數據應該被寫入哪里揮著從哪里讀取。Crush算法按需計算計算元數據,而不是存儲與按市局,從而消除傳統的元數據存儲方法的所有限制。
-
CRUSH查找
-
CRUSH機制以這樣一種方式工作:元數據計算的負載是分布式的并且只在需要時執行,元數據的計算過程也被稱作crush查找。
Ceph數據流動方向
-
文件—-> Object
-
一個文件會被切割為多個相同大小的Object(通常為2M/4M)
-
大文件支持Strip(64K或其他)
Object的磁盤操作
-
Object通過一致性HASH算法存入PG
-
PG通過CRUSH算法,確定要放在哪個OSD中
-
客戶端只負責寫Primary OSD,由Primary OSD負責將數據復制到其他Slave OSD
-
隨機讀取任意一個OSD
數據的方向就是:
Data—-> Object—-> PG—-> pool—-> OSD
映射:
(pool_Object)—-> (pool_Pg)—-> (OSD set)—-> Disk
OSD的狀態變化-reblance
OSD臨時故障
– PGLog
– PG的Replicate OSD接管Primary角色,并記錄權威PGLog
– PG減少復制份數
– OSD上線后Primary同步PGlog,replicate發送pull同步數據
OSD永久故障
– PGLog不足以記錄所有數據時
– OSD恢復時backfill(回填)介入,primary的backfill會統治monitor將一個
– replicate臨時提升為primary
新增OSD
-
新增的OSD報告給Monitor
– Monitor將更新后的pgmap發還給OSD,OSD狀態為up&out
– OSD與其他相關OSD進行通訊,實現新的Map
– 該OSD與相關OSD之間進行PG數據復制,完成復制后,狀態修改為up&in
-
OSD的通訊
– 主OSD與從OSD的數據同步
– 6秒一次heartbeat
– 與monitor節點通訊匯報自己的 狀態及其他OSD故障
-
OSD狀態
– Up/down
– In/out
Heartbeat作用:
Heartbeat主要用于及時發現OSD的狀態變化(down/up),由mon更新osd map 并同步到相關的osd
OSD之間的heartbeat:
選擇heartbeat對象,基本就是這個OSD負責的pg,所包含其他OSD0的集合;
比如OSD包含pg1.1、pg1.2、pg1.3
Pg1.1包含OSD0、OSD1、OSD5
Pg1.2包含OSD0、OSD6、OSD7
Pg1.3包含OSD0、OSD2、OSD3
那么OSD的heartbeat對象就是OSD1、OSD2、OSD3、OSD5、OSD6、OSD7
OSD1向mon匯報有OSD down
如果osd在peering發起或者進行期間,無法與某個osd連通,則會定時(通過osd mon heartbeat interval配置)ping monitor以獲取最新的osdmap。
自匯報
-
如果osd有需要匯報的事件,比如檢測到有osd down、pg map狀態變化等,osd會在osd mon report intervalmin配置的事件間隔內,向monitor匯報;否則會在osd mon report intervalmax配置的事件間隔內向monitor匯報。
-
如果osd超過一定時間(可以通過 mon osd reporttimeout配置)沒有向monitor匯報,monitor會將osd標記為down。
總結
- 上一篇: linux 私有云存储,私有云存储搭建(
- 下一篇: 【Linux 网络】IP校验和计算相关