我在一個環境當中,有不少不少的服務器,服務器上也有它本身不少的硬盤,我經過軟件的形式把若干服務器都收集起來,部署成一個軟件,在這個邏輯的軟件裏能夠同時看到我若干服務器的磁盤的空間,這個邏輯的軟件對外就像是一個總體同樣,這個總體叫storage spool,用戶呢有一天想用這個空間了,用戶直接去對應這個存儲池提供的接口,這用的話,用戶保存一個文件,實際上保存在若干個服務器裏,文件會隨機存到第一個服務器的第一塊硬盤裏,下一次就可能存到第二個服務器的第三塊硬盤裏。它會把文件進行打散,分紅不一樣的小塊,每塊存放的位置多是不一樣的服務器上的不一樣硬盤裏。算法
分佈式存儲還能夠對文件進行安全備份,我這個文件存在後端的服務器裏,能夠保存多份,多份叫副本也能夠叫鏡像。就是說對我打散的每塊文件作一個鏡像在保存在不一樣服務器上的不一樣硬盤裏,這樣,若是後端有服務器宕掉了,個人文件仍是完整的。ceph就能夠作到這麼一種功能。編程
Ceph是一種爲優秀的性能、可靠性和可擴展性而設計的統一的、分佈式文件系統。ceph 的統一體如今能夠提供文件系統、塊存儲和對象存儲,分佈式體如今能夠動態擴展。在國內一些公司的雲環境中,一般會採用 ceph 做爲openstack 的惟一後端存儲來提升數據轉發效率。
Ceph項目最先起源於Sage就讀博士期間的工做(最先的成果於2004年發表),並隨後貢獻給開源社區。在通過了數年的發展以後,目前已獲得衆多雲計算廠商的支持並被普遍應用。RedHat及OpenStack均可與Ceph整合以支持虛擬機鏡像的後端存儲。後端
官網:https://ceph.com/安全
官方文檔:http://docs.ceph.com/docs/master/#服務器
高性能:
a.摒棄了傳統的集中式存儲元數據尋址的方案,採用CRUSH算法,數據分佈均衡,並行度高。
b.考慮了容災域的隔離,可以實現各種負載的副本放置規則,例如跨機房、機架、感知等。
c.可以支持上千個存儲節點的規模,支持TB到PB級的數據。網絡
高可用性:
a.副本數能夠靈活控制。(就是說讓副本保存份數能夠多份,在正常的生產環境是保存3副本)
b.支持故障域分隔,數據強一致性。
c.多種故障場景自動進行修復自愈。
d.沒有單點故障,自動管理。(假如說我這個文件設置的是3副本,若是後端服務器壞掉,副本數不夠3,它會自動補充至3副本)架構
高可擴展性:
a.去中心化。
b.擴展靈活。
c.隨着節點增長而線性增加。編程語言
特性豐富:
a. 支持三種存儲接口:塊存儲(我獲得的是硬盤)、文件存儲(目錄)、對象存儲(有可能給你對接的是一個掛載的目錄,可是後端怎麼去存的,它會把數據打散,採用鍵值對形式存儲)。
b.支持自定義接口,支持多種語言驅動。分佈式
Ceph能夠提供對象存儲、塊設備存儲和文件系統服務,其對象存儲能夠對接網盤(owncloud)應用業務等;其塊設備存儲能夠對接(IaaS),當前主流的IaaS運平臺軟件,如:OpenStack、CloudStack、Zstack、Eucalyptus等以及kvm等。性能
Ceph是一個高性能、可擴容的分佈式存儲系統,它提供三大功能:
對象存儲(RADOSGW):提供RESTful接口,也提供多種編程語言綁定。兼容S3(是AWS裏的對象存儲)、Swift(是openstack裏的對象存儲);
塊存儲(RDB):由RBD提供,能夠直接做爲磁盤掛載,內置了容災機制;
文件系統(CephFS):提供POSIX兼容的網絡文件系統CephFS,專一於高性能、大容量存儲;
什麼是塊存儲/對象存儲/文件系統存儲?
1.對象存儲:
也就是一般意義的鍵值存儲,其接口就是簡單的GET、PUT、DEL 和其餘擴展,表明主要有 Swift 、S3 以及 Gluster 等;
2.塊存儲:
這種接口一般以 QEMU Driver 或者 Kernel Module 的方式存在,這種接口須要實現 Linux 的 Block Device 的接口或者 QEMU 提供的 Block Driver 接口,如 Sheepdog,AWS 的 EBS,青雲的雲硬盤和阿里雲的盤古系統,還有 Ceph 的 RBD(RBD是Ceph面向塊存儲的接口)。在常見的存儲中 DAS、SAN 提供的也是塊存儲;
3.文件系統存儲:
一般意義是支持 POSIX 接口,它跟傳統的文件系統如 Ext4 是一個類型的,但區別在於分佈式存儲提供了並行化的能力,如 Ceph 的 CephFS (CephFS是Ceph面向文件存儲的接口),可是有時候又會把 GlusterFS ,HDFS 這種非POSIX接口的類文件存儲接口納入此類。固然 NFS、NAS也是屬於文件系統存儲;
(1)Monitors(管理服務):監視器,維護集羣狀態的多種映射,同時提供認證和日誌記錄服務,包括有關monitor 節點端到端的信息,其中包括 Ceph 集羣ID,監控主機名和IP以及端口。而且存儲當前版本信息以及最新更改信息,經過 "ceph mon dump"查看 monitor map。
(2)MDS(Metadata Server):Ceph 元數據,主要保存的是Ceph文件系統的元數據。注意:ceph的塊存儲和ceph對象存儲都不須要MDS。
(3)OSD:即對象存儲守護程序,可是它並不是針對對象存儲。是物理磁盤驅動器,將數據以對象的形式存儲到集羣中的每一個節點的物理磁盤上。OSD負責存儲數據、處理數據複製、恢復、回(Backfilling)、再平衡。完成存儲數據的工做絕大多數是由 OSD daemon 進程實現。在構建 Ceph OSD的時候,建議採用SSD 磁盤以及xfs文件系統來格式化分區。此外OSD還對其它OSD進行心跳檢測,檢測結果彙報給Monitor
(4)RADOS:Reliable Autonomic Distributed Object Store。RADOS是ceph存儲集羣的基礎。在ceph中,全部數據都以對象的形式存儲,而且不管什麼數據類型,RADOS對象存儲都將負責保存這些對象。RADOS層能夠確保數據始終保持一致。
(5)librados:librados庫,爲應用程度提供訪問接口。同時也爲塊存儲、對象存儲、文件系統提供原生的接口。
(6)RADOSGW:網關接口,提供對象存儲服務。它使用librgw和librados來實現容許應用程序與Ceph對象存儲創建鏈接。而且提供S3 和 Swift 兼容的RESTful API接口。
(7)RBD:塊設備,它可以自動精簡配置並可調整大小,並且將數據分散存儲在多個OSD上。
(8)CephFS:Ceph文件系統,與POSIX兼容的文件系統,基於librados封裝原生接口。
首先用戶把一個文件放到ceph集羣后,先把文件進行分割,分割爲等大小的小塊,小塊叫object,讓後這些小塊跟據必定算法跟規律,算法是哈希算法,放置到PG組裏,就是歸置組,而後再把歸置組放到OSD裏面。
不管使用哪一種存儲方式(對象、塊、文件系統),存儲的數據都會被切分紅Objects。Objects size大小能夠由管理員調整,一般爲2M或4M。每一個對象都會有一個惟一的OID,由ino與ono生成,雖然這些名詞看上去很複雜,其實至關簡單。
ino:便是文件的File ID,用於在全局惟一標識每個文件
ono:則是分片的編號
好比:一個文件FileID爲A,它被切成了兩個對象,一個對象編號0,另外一個編號1,那麼這兩個文件的oid則爲A0與A1。
File —— 此處的file就是用戶須要存儲或者訪問的文件。對於一個基於Ceph開發的對象存儲應用而言,這個file也就對應於應用中的「對象」,也就是用戶直接操做的「對象」。
Ojbect —— 此處的object是RADOS所看到的「對象」。Object與上面提到的file的區別是,object的最大size由RADOS限定(一般爲2MB或4MB),以便實現底層存儲的組織管理。所以,當上層應用向RADOS存入size很大的file時,須要將file切分紅統一大小的一系列object(最後一個的大小能夠不一樣)進行存儲。爲避免混淆,在本文中將盡可能避免使用中文的「對象」這一名詞,而直接使用file或object進行說明。
PG(Placement Group)—— 顧名思義,PG的用途是對object的存儲進行組織和位置映射。具體而言,一個PG負責組織若干個object(能夠爲數千個甚至更多),但一個object只能被映射到一個PG中,即,PG和object之間是「一對多」映射關係。同時,一個PG會被映射到n個OSD上,而每一個OSD上都會承載大量的PG,即,PG和OSD之間是「多對多」映射關係。在實踐當中,n至少爲2,若是用於生產環境,則至少爲3。一個OSD上的PG則可達到數百個。事實上,PG數量的設置牽扯到數據分佈的均勻性問題。關於這一點,下文還將有所展開。
OSD —— 即object storage device,前文已經詳細介紹,此處再也不展開。惟一須要說明的是,OSD的數量事實上也關係到系統的數據分佈均勻性,所以其數量不該太少。在實踐當中,至少也應該是數十上百個的量級纔有助於Ceph系統的設計發揮其應有的優點。
基於上述定義,即可以對尋址流程進行解釋了。具體而言, Ceph中的尋址至少要經歷如下三次映射:
(1)File -> object映射
(2)Object -> PG映射,hash(oid) & mask -> pgid
(3)PG -> OSD映射,CRUSH算法
CRUSH,Controlled Replication Under Scalable Hashing,它表示數據存儲的分佈式選擇算法, ceph 的高性能/高可用就是採用這種算法實現。CRUSH 算法取代了在元數據表中爲每一個客戶端請求進行查找,它經過計算系統中數據應該被寫入或讀出的位置。CRUSH可以感知基礎架構,可以理解基礎設施各個部件之間的關係。並CRUSH保存數據的多個副本,這樣即便一個故障域的幾個組件都出現故障,數據依然可用。CRUSH 算是使得 ceph 實現了自我管理和自我修復。
RADOS 分佈式存儲相較於傳統分佈式存儲的優點在於:
1. 將文件映射到object後,利用Cluster Map 經過CRUSH 計算而不是查找表方式定位文件數據存儲到存儲設備的具體位置。優化了傳統文件到塊的映射和Block MAp的管理。
2. RADOS充分利用OSD的智能特色,將部分任務受權給OSD,最大程度地實現可擴展
(1)正常IO流程圖:
步驟:
1. client 建立cluster handler。
2. client 讀取配置文件。
3. client 鏈接上monitor,獲取集羣map信息。
4. client 讀寫io 根據crshmap 算法請求對應的主osd數據節點。
5. 主osd數據節點同時寫入另外兩個副本節點數據。
6. 等待主節點以及另外兩個副本節點寫完數據狀態。
7. 主節點及副本節點寫入狀態都成功後,返回給client,io寫入完成。
(2)新主IO流程圖:
說明:若是新加入的OSD1取代了原有的 OSD4成爲 Primary OSD, 因爲 OSD1 上未建立 PG , 不存在數據,那麼 PG 上的 I/O 沒法進行,怎樣工做的呢?
新主IO流程步驟:
1. client鏈接monitor獲取集羣map信息。
2. 同時新主osd1因爲沒有pg數據會主動上報monitor告知讓osd2臨時接替爲主。
3. 臨時主osd2會把數據全量同步給新主osd1。
4. client IO讀寫直接鏈接臨時主osd2進行讀寫。
5. osd2收到讀寫io,同時寫入另外兩副本節點。
6. 等待osd2以及另外兩副本寫入成功。
7. osd2三份數據都寫入成功返回給client, 此時client io讀寫完畢。
8. 若是osd1數據同步完畢,臨時主osd2會交出主角色。
9. osd1成爲主節點,osd2變成副本。
pool:是ceph存儲數據時的邏輯分區,它起到namespace的做用。每一個pool包含必定數量(可配置) 的PG。PG裏的對象被映射到不一樣的Object上。pool是分佈到整個集羣的。 pool能夠作故障隔離域,根據不一樣的用戶場景不統一進行隔離。