Ceph基礎概述

1、存儲數據算法

        ceph存儲集羣從ceph客戶端獲取數據,客戶端能夠是ceph塊存儲設備,ceph對象存儲,ceph文件系統或者你用librados本身實現的一個客戶端。文件以對象的形式存儲在對象存儲設備中。Ceph OSD Daemons處理讀寫操做。安全

        Ceph OSD Daemons將數據當成一個個的對象來處理,對象包括一個ID,二進制數據,和元數據,元數據是鍵值對的形式,其語義徹底由Ceph客戶端決定,好比說CephFS用元數據存儲文件屬性,包括文件擁有者,建立日期,最後修改日期等。注意:對象ID在整個集羣內是惟一的而不是隻在本地文件系統中惟一。服務器

2、擴展性和高可用性網絡

        在傳統的體系結構中,客戶端和一個統一的集中的部件通訊,例如網關,broker,API,facade等),這個集中的部件是這個複雜系統的惟一入口,從而成爲了性能和擴展瓶頸,並且會致使單點故障的問題,也就是這個部件壞了,整個系統就玩完了。ceph消滅了這個單點故障點,讓客戶端直接和Ceph OSD Daemons通訊,Ceph OSD Daemons在其餘的節點上建立對象的副本從而保證了數據的安全和高可用。Ceph還有一個monitor集羣來保證高可用。Ceph使用CRUSH算法來消滅集中化。session

一、CRUSH簡介負載均衡

        CRUSH算法運行在Ceph Clients和Ceph OSD上,用於計算對象的位置信息,它代替了傳統的查表的思想,把工做分攤到全部Ceph Clients和Ceph OSD上,加強了彈性擴展和高可用性。函數

二、集羣MAP性能

        集羣MAP由如下五部分組成,用於反映集羣的拓撲信息:加密

        (1)The Monitor Map:包括fsid,位置,hostname+IP addr,Monitor端口號。還包括版本號,map什麼時候創建以及上一次改動的時間。map什麼時候創建以及上一次改動的時間,ceph mon dump命令能夠查看一個monitor map,以下圖所示。spa

        (2)The OSD Map:包括fsid,map什麼時候創建以及上一次改動的時間,存儲池列表,副本大小,PG數,OSD列表和狀態。ceph osd dump命令能夠查看一個OSD map,以下圖所示。

        (3)The PG Map:包含PG的版本號,時間戳,最近的OSD map版本號,使用率,PG的ID,狀態,每個池的使用統計等等。ceph pg dump命令能夠查看一個PG map,以下圖所示。

        (4)The CRUSH Map:包含存儲設備列表,故障域的層次 (e.g., device, host, rack, row, room, etc.),存儲數據時遍歷的規則。命令 ceph osd getcrushmap -o {filename}能夠查看這個map, 命令crushtool -d {comp-crushmap-filename} -o {decomp-crushmap-filename}能夠將它編譯成文本形式,用cat查看。

       (5)The MDS Map: 包含如今MDS map的版本號,map什麼時候創建以及上一次改動的時間。它還包含一個存儲元數據的池,元數據服務器列表,哪些元數據服務器是up&in的。ceph mds dump命令能夠查看一個MDS map,以下圖所示。

        每一張map都保留它更改的歷史記錄。Ceph Monitor有集羣map的主拷貝,包括集羣成員,狀態,改動,和集羣健康情況。

三、高可用認證

        Cephx是ceph的一套認證系統,用於用戶和daemon的認證,防止攻擊。

        用戶產生密鑰,Ceph monitor擁有密鑰的拷貝,他們雙方都可以向對方證實本身擁有密鑰從而完成認證,認證過程當中密鑰始終不暴露。

        任何一個Ceph monitor均可以認證用戶,沒有單點故障。從monitor返回的認證數據包含一個session key,這個session key用用戶的密鑰加密,因此只有該用戶能夠向ceph monitor發起請求。認證成功後,用戶能夠訪問全部的OSD和MDS。

        使用cephx必須先由管理員創建用戶,以下圖所示,client.admin用戶激活ceph auth get-or-create-key來生成一個用戶名和密鑰。ceph的認證子系統生成用戶名和密碼,並在monitor中保留一份副本,再把這個密碼傳送給用戶,這樣,用戶和Monitor就共享了同一份密鑰。

        認證的過程是這樣的,用戶將用戶名傳遞給Monitor,monitor生成一個session key,將它用密鑰和用戶名一塊兒加密,而後將加密後的session key返回給用戶,用戶將其解密,並向monitor請求一個ticket,monitor生成一個加密的ticket,返回用戶,用戶將其解密並憑藉它像集羣中的OSD和MDS發起請求。

        在接下來的客戶端和ceph服務器的通訊過程當中,都要用到最早的認證的ticket進行認證,具體過程以下圖。這個認證系統只在ceph client和ceph server中間起做用,若是用戶用另外一臺主機和ceph client通訊,這個認證不起做用。

四、「聰明的」守護進程保證了大規模擴展

        在許多集羣集羣體系中,客戶端和集羣通訊都是經過一個集中的接口,這個集中的接口在大規模集羣中成爲了一個巨大的瓶頸。Ceph消除了這個瓶頸: Ceph’s OSD Daemons AND Ceph Clients都是對等的,每個OSD上的守護進程都知道其餘OSD的守護進程幹了什麼,這使得Ceph clients能夠直接和OSD上的守護進程通訊。

        這就意味着 Ceph’s OSD Daemons可使用節點上的CPU和內存輕鬆地完成任務,若是把這些任務集中在某一臺服務器,這臺服務器極可能崩潰了,這種均攤計算任務的作法致使以下好處:

        (1)OSDs Service Clients Directly: 在鏈接數受限的狀況下,大規模集羣極可能形成網絡瓶頸,而不一樣的客戶端和不一樣節點上的不一樣OSD直接聯繫消除了這一瓶頸,還避免了單點故障。

        (2)OSD Membership and Status:OSD Daemon會彙報本身的狀況,在底層,若是它的狀態是down&in表示它它出故障了。若是它沒有運行,好比說它崩潰了,它就沒法通知monitor它down了,這時monitor能夠週期性Ping一個OSD來確認它是否是運行狀態的。並且,OSD Daemon也能夠知道它相鄰的OSD狀態,能夠更新集羣Map,並將它彙報給Monitor。這意味着monitor能夠減小工做量。

        (3)Data Scrubbing: 未保持一致性,OSD Daemon也能夠偵查和修復對象,它經過比較必定區域內對象和副本的元數據,修復捕捉到的Bug和文件系統錯誤(一般以天爲單位進行)。它也能夠以Bit-by-bit的方式比對對象和副原本作一個深層次的擦除,(一般以周爲單位進行),它能夠定位壞的扇區並作修復。

        (4)Replication: OSD Daemon使用CRUSH算法計算對象應該被存在什麼地方,或者作負載均衡。在一個典型寫的場景中,客戶端用CRUSH算法計算對象存在什麼地方,將對象映射到一個PG和相應的組,用CRUSH算法計算這個組的主OSD是哪個。

        客戶端將數據寫入這個主OSD,主OSD利用CRUSH算法計算二級和三級OSD並寫入副本,確認寫成功後通知客戶端。

5、動態集羣管理

一、存儲池

        存儲池是一個邏輯概念,客戶端從Monitor獲取集羣map,將對象寫入存儲池,存儲池設置了以下參數:

        (1)對象的擁有者

        (2)PG數

        (3)CRUSH規則

二、將PG映射到OSD

        每個存儲池都有必定數量的PG,CRUSH算法動態地將PG映射到OSD。它先將對象映射到PG,再將PG映射到OSD,而不是將對象和OSD直接映射,這樣的間接映射方式使得集羣動態均衡時可以靈活地遷移數據。

三、計算PG的ID

        客戶端綁定一個monitor時,它向monitor取得最新的集羣Map,經過這個Map,它得知全部集羣的拓撲狀況,可是,它並不知道對象的位置,這個位置是須要計算的,不能很直接從map中獲取。

        要計算這個位置,須要的輸入有對象的ID和存儲池的信息。例如,存儲池的名字叫liverpool,當客戶端要存儲一個命名的對象(e.g., 「john,」 「paul,」 「george,」 「ringo」, etc.),對象名字+hashcode+PG數+pool name就能夠計算出PG,PG ID的計算步驟以下:

        (1)客戶端輸入object id和pool id (e.g., pool = 「liverpool」 and object-id = 「john」)

        (2)計算object id的Hash值

        (3)hash值 mod PG數 (e.g., 58) =PG ID

        (4)從pool name獲取一個pool ID (e.g., 「liverpool」 = 4)

        (5)將pool ID 和PG ID鏈接起來(e.g., 4.58)

四、PEERING AND SETS

        同步全部存有同一個PG的OSD有關該PG上全部對象的狀態,使得對象在每個OSD上的狀態都是一致的這個步驟叫作peering。peering故障也會報告給monitor。

        Ceph規定副本數最少爲2,最好是3副本。OSD分主次,惟一接受客戶端請求的OSD爲主OSD,它將副本寫入其它OSD。正在接收PG請求並活躍的一系列OSD叫Acting Set, Acting Set中的 OSD daemons並不都是up的,其中up的一部分叫UP Set,OSD故障時,Ceph能夠將PG從新映射到其它OSD。例如 Acting Set中有三個OSD: osd.25, osd.32 and osd.61,osd.25是主OSD,若是它出現故障, osd.32則變爲主OSD,而 osd.25被移出Up Set 。

五、從新負載均衡

        當一個新的OSD被加入集羣,集羣Map會更新,對象對應的PG也會改變,下圖描述了一個從新負載均衡的過程,不是全部的PG都會從當前的OSD遷移到新的OSD,大部分的PG保持原樣,每個OSD的可存儲空間增大。

六、數據一致性

        和Data Scrubbing 一節描述同樣。

6、糾刪碼

        每個對象被劃分紅K+M個chunk,K個數據chunk,M個校驗chunk,存儲池的大小爲K+M個OSD,每個chunk存儲在Acting Set的OSD中,chunk的信息做爲對象的屬性。例如存儲池有(K+M=5)個OSD,M=2,那麼可以壞2個OSD。

一、讀寫chunk

        一個叫NYAN的對象,它的內容爲ABCDEFGHI,它要被寫入存儲池,糾刪碼函數將內容分爲ABC,DEF,GHI分塊,不足K(3)的整數倍將會被補充。生成兩個校驗chunk:YXY和GOC。每個chunk存在一個Acting Set的OSD中,他們的名字都叫NYAN,這五個chunk的建立順序將被保存,並和對象名一塊兒做爲對象的屬性 (shard_t)。

        對象被讀出時,decoding函數讀chunk1,3,4,而後重構內容ABCDEFGHI。函數被告知chunk2,5丟失。OSD4故障了,chunk5不能讀出,OSD2最慢,它的chunk不算,這樣的狀況下三個chunk一讀出立馬重構內容。

二、被中斷的FULL WRITES

        up集(up set )的主OSD接受全部寫操做請求。它負責分紅若干chunk並把它們下發到其它OSD,一樣負責維護一個PG的日誌。在下圖中一個PG有三個相應的OSD,2個是K,1個是M。活躍集(acting set)的OSD有1,2,3。一個對象在這些OSd中是這樣的:chunk D1v1 (i.e. Data chunk number 1, version 1) 在OSD1上,D2v2在OSd2上,C1v1在OSD3上,每個OSD上的PG日誌都是惟一的。

      

          OSD1是主OSD,全寫意味着D1v2徹底覆蓋D1v1,D2v2徹底覆蓋D2v1,C1v2徹底覆蓋C1v2,而不是隻寫差別的部分。每一個OSD寫完後也會更新本身的log。

 

 

        若是所有進行順利,chunks會被通知寫完成,日誌的last_complete 指針會從1,1移動到1,2。

        而後D1v1,D2v1,C1v1被刪除。

        可是,若是有狀況發生,例如OSD1在D2v2沒有寫完的狀況下down了,D2v2只被寫了一部分,不能經過他和OSD3上的校驗數據恢復。糾刪碼要求至少兩個chunk都是完整的這樣才能重構第三個。這是OSD4變爲主OSD,它找last_complete所指向的日誌入口1,1得到新的日誌。

       這是OSD3上的日誌1,2發現和OSD4上的1,1不一致,那麼OSD3上的C1v2被刪除,D1v1被重構並存到OSD4上。

 

7、cache分層

        分層包括一個相對較快的存儲池,如SSD,做爲一個cache層,和一個相對經濟一些的包括糾刪碼的存儲池做爲存儲層。objecter決定對象存到哪,分層代理決定何時將對象從cache中flush到存儲層中。cache層和存儲層徹底對用戶透明。

8、擴展

        這裏說的擴展是說在已有的ceph中加入本身寫的新功能,這時你須要建立一個共享的對象類,叫Ceph Classes。Ceph loads .so classes動態存檔在osd class dir目錄下 (i.e., $libdir/rados-classes by default)。實現一個class後,能夠建立一個對象的新方法來調用Ceph Object Store中提供的方法,或者其餘你經過libraries建立的方法。

相關文章
相關標籤/搜索