Ceph架構剖析

來源:UnitedStack有云  作者:朱榮澤

1. 介紹

雲硬盤是IaaS雲平臺的重要組成部分,雲硬盤給虛擬機提供了持久的塊存儲設備。目前的AWS EBS(Elastic Block store)AmazonEC2實例提供了高可用高可靠的塊級存儲卷,EBS適合於一些需要訪問塊設備的應用,比如數據庫、文件系統等。OpenStack中,可以使用CephSheepdogGlusterFS作爲雲硬盤的開源解決方案,下面我們來了解Ceph的架構。

Ceph是統一存儲系統,支持三種接口。

·        Object:有原生的API,而且也兼容SwiftS3API

·        Block:支持精簡配置、快照、克隆

·        FilePosix接口,支持快照

Ceph也是分佈式存儲系統,它的特點是:

·        高擴展性:使用普通x86服務器,支持10~1000臺服務器,支持TBPB級的擴展。

·        高可靠性:沒有單點故障,多數據副本,自動管理,自動修復。

·        高性能:數據分佈均衡,並行化度高。對於objects storageblock storage,不需要元數據服務器。


wKioL1X_qAHzdQHPAAJnAyCqx3U949.jpg

2. 背景

目前Inktank公司掌控Ceph的開發,但Ceph是開源的,遵循LGPL協議。Inktank還積極整合Ceph和其他雲計算和大數據平臺,目前Ceph支持OpenStackCloudStackOpenNebulaHadoop等。

當前Ceph的最新穩定版本0.67(Dumpling),它的objects storageblock storage已經足夠穩定,而且Ceph社區還在繼續開發新功能,包括跨機房部署和容災、支持Erasure encoding等。Ceph具有完善的社區設施和發佈流程[1](每三個月發佈一個穩定版本)

目前Ceph有很多用戶案列,這是2013.03Inktank公司在郵件列表中做的調查,共收到了81份有效反饋[2]。從調查中可以看到有26%的用戶在生產環境中使用Ceph,有37%的用戶在私有云中使用Ceph,還有有16%的用戶在公有云中使用Ceph

ceph-census-status-1.png

 

wKiom1X_poTjYR6oAACOfy50UEM294.jpg


wKioL1X_qMKQ2VlDAACYx9ZgnQU568.jpg

 

 
目前Ceph最大的用戶案例是DreamhostObject Service,目前總容量是3PB,可靠性達到99.99999%,數據存放採用三副本,它的價格比S3還便宜。下圖中,左邊是Inktank的合作伙伴,右邊是Inktank的用戶。

wKiom1X_pxbgAJItAAHhOpxyUgY105.jpg

 

3. 架構

3.1 組件

wKioL1X_qYbCUZWMAAF55-7Qij4950.jpg

Ceph的底層是RADOS,它的意思是“A reliable,autonomous, distributed object storage” RADOS由兩個組件組成:

·        OSD Object StorageDevice,提供存儲資源。

·        Monitor:維護整個Ceph集羣的全局狀態。

RADOS具有很強的擴展性和可編程性,Ceph基於RADOS開發了
Object Storage
Block StorageFileSystemCeph另外兩個組件是:

·        MDS:用於保存CephFS的元數據。

·        RADOS Gateway:對外提供REST接口,兼容S3SwiftAPI

3.2 映射

Ceph的命名空間是 (Pool, Object),每個Object都會映射到一組OSD(由這組OSD保存這個Object)

(Pool, Object) →(Pool, PG) → OSD set → Disk

CephPools的屬性有:

·        Object的副本數

·        Placement Groups的數量

·        所使用的CRUSH Ruleset

Ceph中,Object先映射到PG(PlacementGroup),再由PG映射到OSD set。每個Pool有多個PG,每個Object通過計算hash值並取模得到它所對應的PGPG再映射到一組OSDOSD的個數由Pool 的副本數決定),第一個OSDPrimary,剩下的都是Replicas

數據映射(Data Placement)的方式決定了存儲系統的性能和擴展性。(Pool, PG) → OSDset 的映射由四個因素決定:

·        CRUSH算法:一種僞隨機算法。

·        OSD MAP:包含當前所有Pool的狀態和所有OSD的狀態。

·        CRUSH MAP:包含當前磁盤、服務器、機架的層級結構。

·        CRUSH Rules:數據映射的策略。這些策略可以靈活的設置object存放的區域。比如可以指定 pool1中所有objecst放置在機架1上,所有objects的第1個副本放置在機架1上的服務器A上,第2個副本分佈在機架1上的服務器B上。 pool2中所有的object分佈在機架234上,所有Object的第1個副本分佈在機架2的服務器上,第2個副本分佈在機架3的服器上,第3個副本分佈在機架4的服務器上。

wKiom1X_p4jBkMOGAAGeOR5v-XM671.jpg

ClientMonitors中得到CRUSH MAPOSD MAPCRUSH Ruleset,然後使用CRUSH算法計算出Object所在的OSD set。所以Ceph不需要Name服務器,Client直接和OSD進行通信。僞代碼如下所示:

  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:]

這種數據映射的優點是:

·        Object分成組,這降低了需要追蹤和處理metadata的數量(在全局的層面上,我們不需要追蹤和處理每個objectmetadataplacement,只需要管理PGmetadata就可以了。PG的數量級遠遠低於object的數量級)

·        增加PG的數量可以均衡每個OSD的負載,提高並行度。

·        分隔故障域,提高數據的可靠性。

3.3 強一致性

·        Ceph的讀寫操作採用Primary-Replica模型,Client只向Object所對應OSD setPrimary發起讀寫請求,這保證了數據的強一致性。

·        由於每個Object都只有一個Primary OSD,因此對Object的更新都是順序的,不存在同步問題。

·        Primary收到Object的寫請求時,它負責把數據發送給其他Replicas,只要這個數據被保存在所有的OSD上時,Primary才應答Object的寫請求,這保證了副本的一致性。

wKiom1X_p7Wi--x5AACJojMprBQ289.jpg

3.4 容錯性

在分佈式系統中,常見的故障有網絡中斷、掉電、服務器宕機、硬盤故障等,Ceph能夠容忍這些故障,並進行自動修復,保證數據的可靠性和系統可用性。

·        MonitorsCeph管家,維護着Ceph的全局狀態。Monitors的功能和zookeeper類似,它們使用QuorumPaxos算法去建立全局狀態的共識。

·        OSDs可以進行自動修復,而且是並行修復。

故障檢測:

OSD之間有心跳檢測,當OSD A檢測到OSD B沒有迴應時,會報告給MonitorsOSD B無法連接,則MonitorsOSD B標記爲down狀態,並更新OSD Map。當過了M秒之後還是無法連接到OSD B,則MonitorsOSD B標記爲out狀態(表明OSD B不能工作),並更新OSD Map

備註:可以在Ceph中配置M的值。

故障恢復:

1.   當某個PG對應的OSD set中有一個OSD被標記爲down(假如是Primary被標記爲down,則某個Replica會成爲新的Primary,並處理所有讀寫 object請求),則該PG處於active+degraded狀態,也就是當前PG有效的副本數是N-1

2.   過了M秒之後,假如還是無法連接該OSD,則它被標記爲outCeph會重新計算PGOSD set的映射(當有新的OSD加入到集羣時,也會重新計算所有PGOSD set的映射),以此保證PG的有效副本數是N

3.   OSD setPrimary先從舊的OSD set中收集PG log,得到一份AuthoritativeHistory(完整的、全序的操作序列),並讓其他Replicas同意這份AuthoritativeHistory(也就是其他ReplicasPG的所有objects的狀態達成一致),這個過程叫做Peering

4.   Peering過程完成之後,PGactive+recoverying狀態,Primary會遷移和同步那些降級的objects到所有的replicas上,保證這些objects 的副本數爲N

 

 

 

4. 優點

4.1 高性能

·        ClientServer直接通信,不需要代理和轉發

·        多個OSD帶來的高併發度。objects是分佈在所有OSD上。

·        負載均衡。每個OSD都有權重值(現在以容量爲權重)

·        client不需要負責副本的複製(primary負責),這降低了client的網絡消耗。

wKiom1X_qBGiPkMCAAFFUjlYJP4040.jpg

4.2 高可靠性

·        數據多副本。可配置的per-pool副本策略和故障域佈局,支持強一致性。

·        沒有單點故障。可以忍受許多種故障場景;防止腦裂;單個組件可以滾動升級並在線替換。

·        所有故障的檢測和自動恢復。恢復不需要人工介入,在恢復期間,可以保持正常的數據訪問。

·        並行恢復。並行的恢復機制極大的降低了數據恢復時間,提高數據的可靠性。

wKioL1X_qrTB6-sdAAGKJo8LUtc930.jpg

wKiom1X_qHbzDBP9AAEddWV6FhE178.jpg


4.3 高擴展性

·        高度並行。沒有單箇中心控制組件。所有負載都能動態的劃分到各個服務器上。把更多的功能放到OSD上,讓OSD更智能。

·        自管理。容易擴展、升級、替換。當組件發生故障時,自動進行數據的重新複製。當組件發生變化時(添加/刪除),自動進行數據的重分佈。

wKiom1X_qL_jSooCAAFn7i-WnRE758.jpg

5. 測試

使用fio測試RBDIOPS,使用dd測試RBD的吞吐率,下面是測試的參數:

·        fio的參數:bs=4K,ioengine=libaio, iodepth=32, numjobs=16, direct=1

·        dd的參數:bs=512M,oflag=direct

我們的測試服務器是AWS上最強的實例:

·        117GB內存

·        雙路 E5-2650,16

·        24 * 2TB 硬盤

服務器上的操作系統是Ubuntu 13.04,安裝Ceph Cuttlefish 0.61版,副本數設置爲2RBD中的塊大小設置爲1M。爲了對比,同時還對軟件RAID10進行了測試。下面表格中的性能比是CephRAID10性能之間的比較。

 

5.1 注意

因爲使用的是AWS上的虛擬機,所以它(Xen)掛載的磁盤都是設置了Cache的。因此下面測試的數據並不能真實反應物理磁盤的真實性能,僅供與RAID10進行對比。

5.2 IOPS

磁盤數

隨機寫

隨機讀


Ceph

RAID10

性能比

Ceph

RAID10

性能比

24

1075

3772

28%

6045

4679

129%

12

665

1633

40%

2939

4340

67%

6

413

832

49%

909

1445

62%

4

328

559

58%

666

815

81%

2

120

273

43%

319

503

63%

5.3 吞吐率

磁盤數

順序寫(MB/S)

順序讀(MB/S)


Ceph

RAID10

性能比

Ceph

RAID10

性能比

24

299

879

33%

617

1843

33%

12

212

703

30%

445

1126

39%

6

81

308

26%

233

709

32%

4

67

284

23%

170

469

36%

2

34

153

22%

90

240

37%

5.4 結果分析

從測試結果中,我們看到在單機情況下,RBD的性能不如RAID10,這是爲什麼?我們可以通過三種方法找到原因:

·        閱讀Ceph源碼,查看I/O路徑

·        使用blktrace查看I/O操作的執行

·        使用iostat觀察硬盤的讀寫情況

RBDI/O路徑很長,要經過網絡、文件系統、磁盤:

Librbd -> networking -> OSD ->FileSystem -> Disk

Client的每個寫操作在OSD中要經過8種線程,寫操作下發到OSD之後,會產生2~3個磁盤seek操作:

·        把寫操作記錄到OSDJournal文件上(Journal是爲了保證寫操作的原子性)

·        把寫操作更新到Object對應的文件上。

·        把寫操作記錄到PG Log文件上。

我使用fioRBD不斷寫入數據,然後使用iostat觀察磁盤的讀寫情況。在1分鐘之內,fioRBD寫入了3667 MB的數據,24塊硬盤則被寫入了16084 MB的數據,被讀取了288 MB的數據。

RBD寫入1MB數據 = 向硬盤寫入4.39MB數據 + 讀取0.08MB數據

6. 結論

在單機情況下,RBD的性能不如傳統的RAID10,這是因爲RBDI/O路徑很複雜,導致效率很低。但是Ceph的優勢在於它的擴展性,它的性能會隨着磁盤數量線性增長,因此在多機的情況下,RBDIOPS和吞吐率會高於單機的RAID10(不過性能會受限於網絡的帶寬)

如前所述,Ceph優勢顯著,使用它能夠降低硬件成本和運維成本,但它的複雜性會帶來一定的學習成本。

Ceph的特點使得它非常適合於雲計算,那麼OpenStack使用Ceph的效果如何?下期《CephOpenStack》將會介紹Ceph的自動化部署、CephOpenStack的對接。

 

[1]  http://www.ustack.com/blog/ceph-distributed-block-storage/#2_Ceph

[2]  http://ceph.com/community/results-from-the-ceph-census/

 

本文來源:UnitedStack有云


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章