Ceph是最近開源系統中很火的一個項目,基于Sage Weil的一片博士論文發展而來的一個分布式文件系統,可提供PB級,動態可擴展,數據安全可靠的存儲服務。Ceph提供分布式存儲服務包括:塊存儲RBD,對象存儲RADOSGW和CephFS三種,基本覆蓋了絕大部分企業對存儲的需求,所以越來越多企業加入到使用Ceph的行列。在國內也有越來越多的個人和企業參與到Ceph的研發中,貢獻自己的力量。
首先,我們來看下Ceph系統的整體架構:
如上圖所示,有如下幾部分:
1). RADOS: Ceph的核心模塊,提供固定大小的Object存儲
2). LIBRADOS: RADOS的library,提供C, C++, Java, Python, Ruby, PHP的API訪問RADOS
3). RADOSGW: Rados GateWay,基于bucket策略,提供一個兼容S3和Swift的的REST gateway
4). RBD: 提供可靠的分布式塊存儲服務,結合Openstack,應用非常之廣
5). CEPH FS:提供POSIX協議的文件系統服務
從上面可以看出,RADOS是Ceph的核心,它主要由MDS + OSD組成,下圖描述的即是一個個笑臉(object)如何存儲到OSDs中:
Client端會跟Monitors通信,獲取Cluster Maps信息,然后通過固定的算法算出每個Object存儲的OSD位置,直接與OSD通信,寫入Object數據。
這里Ceph的一大優勢很好的體現出來:無需元數據服務器節點,所有都是“無需查表,算算就好”!
前面我們提到了Ceph是一個動態可擴展,數據安全可靠的存儲服務,現在我們逐一來討論下Ceph作為一個分布式系統必須的三種特性:
1). 高擴展性
針對集群的擴容需求,Ceph支持OSD和Monitor集群的動態可擴容,并通過兩層Map機制[(pool, object) -> (pool, PG) -> OSD set)來有效的隔離了集群擴容對上層client的影響,提供了很好的擴展性。這樣我們可以利用大量的低配置設備輕松的搭建出PB甚至EB級的存儲系統。
上圖描述了Client段的一個File如何經過多層的映射,寫入到OSDs中的,也正是這多層映射和CRUSH算法,保證了Ceph的高擴展行。在PG數不變的情況下,底層OSD的擴展對Client端是完全透明的。
2). 高可靠性
針對數據的安全可靠,Ceph會在集群中存儲同一數據的多個副本(或者其他類型的冗余,例如erasure code),來保證在某些設備故障后,用戶存入的數據還可用,針對用戶不同的高可用需求,Ceph可以很方便的設置Pool的數據冗余規則,另外通過Ceph Crushmap,用戶也可以方便的設置各個備份之間存儲位置的邏輯關系,比如達到多個副本跨機房、跨機架、跨機器等目的,提高集群的數據可靠性。
另外Ceph能自動探測到OSD/Monitor/MDS的故障,并自行恢復,有效減少了單設備節點的穩定性對集群的影響。
下圖是Ceph中一個寫IO的流程,保證數據的強一致性:
從圖中可以明顯的看出,Ceph的寫會由Client發給Primary OSD,由Primary OSD發送副本給Replica OSD上,而只有所有的副本都寫完成后,寫IO才算完成,保證了數據的一致性和高可靠性。
3). 高性能
Ceph中通過文件切分和CRUSH算法,保證數據chunk分布基本均衡,同時Ceph的無元數據信息的設計(CephFS除外),保證了Client可以根據cluster map,通過固定算法確定數據的位置信息,避免了單個元數據節點的性能瓶頸,可以提供非常高的并行化IO性能。
如上圖所示,Client端數據經過切分為Objects后,可以同時與多個OSDs交互,寫入數據。
前面大致介紹了Ceph系統的原理和架構,那我們為什么選擇Ceph呢?
對比現有的一些其他的分布式存儲系統,Ceph有如下優點:
1). 完全的開源系統
2). 能提供塊存儲,對象存儲和文件系統存儲的統一架構
3). 設計理念先進,是個高擴展,高可用,高性能的分布式文件系統
4). 與Openstack完美結合,社區支持好
5). Ceph社區活躍度很大
總之,作為一個比較完善的分布式存儲系統,Ceph能滿足絕大多數企業的存儲需求,同時它也提供了足夠多的配置選項,給用戶根據需求定制化自己的存儲系統。
上面大致介紹了Ceph的原理架構和設計理念,下面我們來介紹下Ceph在云英的具體實踐,給大家一個真實的感受。
首先說一下云英,云英的全稱是北京云英傳奇技術有限公司。我們是一家專注于為創客和行業客戶提供云計算服務的公司,我們提供的有公有云和私有云服務,包括IAAS和PAAS層產品,網址為:www.cloudin.cn
在云計算的技術上我們選擇了openstack + ceph的架構,基于之上實現了我們自己的邏輯和特色功能,包括云監控,自動化運維,RDS等服務。針對這么多應用,絕大部分服務的數據都依靠Ceph系統提供可靠的存儲服務,在應用實踐中,針對我們自己的系統架構和機房部署,我們對Ceph也進行了部分調優和優化,達到了我們的應用需求。
下面我們來介紹下Ceph存儲在云英的應用,大致可以分為如下幾種:
- RBD塊存儲服務
- CephFS提供服務器間數據共享
- RADOSGW提供對象存儲服務
- Ceph的性能測試
- Ceph的優化
- Ceph的監控
首先我們先介紹下第一項。
- RBD塊存儲服務
我們的塊存儲服務主要給Openstack組件使用,分為如下幾類:
- Glance鏡像存儲
- Nova instance數據存儲
- Cinder volume存儲
- Backup服務
應用中,把Openstack的Glance組件image和Nova instance數據一起存儲到Ceph集群中,可以很好的避免Openstack創建虛擬機時的image復制,并且利用Ceph RBD的snapshot功能,基本可以實現秒級創建Nova instance。
同樣利用RBD的snapshot功能,可以有效的減少Cinder Volume,Nova instance的備份創建時間和空間占用。
另外因為Ceph底層是一個共享存儲,所以基于此可以便利的實現Nova instance的熱遷移功能,縮短了虛擬機熱遷移導致的服務停頓時間。
整個應用場景如下圖所示,Ceph作為了一個統一存儲,對Openstack各個組件提供服務:
- CephFS提供服務器間數據共享
CephFS是基于Rados實現的PB級分布式文件系統,這里引入了一個新的組件MDS(Meta Data Server),它主要為兼容POSIX文件系統提供元數據,如目錄和文件元數據。同時,MDS會將元數據也存在RADOS(Ceph Cluster)中。元數據存儲在RADOS中后,元數據本身也達到了并行化,大大加強了文件操作的速度。需要注意的是MDS并不會直接為Client提供文件數據,而只是為Client提供元數據的操作。
在我們的生產環境中,遇到過服務器間共享數據的需求。之前的思路可以通過NFS來實現,現在基于CephFS,可以輕松的滿足需求。雖說我們用的版本Hammer中,Ceph官方沒說CephFS完善到可用于生產環境,但也是經過大規模測試后的版本,據說在雅虎也有大規模使用的集群,另外我們共享的數據對可靠性沒那么大要求,IO量也不是很大,所以CephFS已經能很好的滿足我們的需求了。
最近Ceph發布的JEWEL版本是官方聲稱的第一個CephFS穩定版本,如果對CephFS有強烈需求的話,可以部署最新的JEWEL版本。
另外部署中最好使用單MDS的方式,雖說Ceph支持MDS集群和很多很酷的特性,比如負載均衡,動態子樹遷移,故障恢復等,但MDS集群還不是Ceph官方的推薦。
- RADOSGW提供對象存儲服務
RadosGW是基于Librados之上實現的,它主要提供兼容S3、Swfit的RESTful接口。同時RadosGW提供了Bucket的命名空間(類似于文件夾)和賬戶支持,并且具備用于賬單目的使用記錄。相對的,它增加了Http協議的負載。
RadosGW使得Ceph Cluster有了分布式對象存儲的能力,如上面提到的Amazon S3和Swift等。企業也可以直接使用其作為數據存儲或備份等用途。
RADOSGW在云英主要應用于以下兩方面:
1). RDS的數據備份存儲
RDS服務是云英提供的一項的MySQL服務,我們保證了MySQL的高可用和性能,用戶只需創建自己的RDS服務即可使用,而不用麻煩的自己搭建MySQL服務并配置其高可用等特性。
在RDS服務中,用戶會有創建MySQL備份的需求,而這種備份是最適合對象存儲的,我們自己實現了RDS的S3備份接口,把RDS的備份數據上傳到兼容S3的RADOSGW中。這樣使用統一的Ceph系統,我們就不需要再搭建一套Swift對象存儲系統了,簡化了公司的運維成本。
2). 對象存儲服務
Object Storage Service是很重要的一項存儲服務,越來越多的應用都開始使用便利的對象存儲來存儲數據。Openstack源生的對象存儲服務系統是Swift,對比Ceph,Swift可以便利的搭建部署,但它也有自己的劣勢,我們也不想同時維護兩套存儲系統,所以我們就選擇RADOSGW提供兼容S3和Swift的對象存儲服務。
- Ceph的性能測試
為了做到心中有數,我們需要在現有硬件配置條件下,測試Ceph的性能,看是否滿足我們的期望。
結合網上的參考,Ceph性能測試可分為如下幾類:
1). RADOS性能測試
rados bench 命令
rados load-gen 命令
2). rbd塊設備性能測試
rbd bench-write 命令
3). fio工具測試:
fio + rbd ioengine 測試
fio + libaio 測試
在云英的應用中,Ceph主要提供的是rbd塊設備,所以經過評估,我們選擇了比較貼合實際應用的方式,使用fio + libaio的測試方法來測試虛擬機中云硬盤的性能。
為此我們寫了一系列的測試腳本來自動化測試和分析測試結果,結合Ceph的參數優化,給出實際的性能參考。
當然,測試并不是一帆風順的,測試中的我們也會遇到一些問題,也會做一些調整,這里分享下常見的幾個注意事項:
1). 云硬盤需要先dd一遍后再測試
2). 每輪測試前清空虛擬機的緩存數據
3). 每輪測試前清空物理服務器的緩存數據
4). 每輪測試中通過iostat命令搜集磁盤負載數據
5). 測試獲取順序讀寫的bandwidth和隨機讀寫的iops
6). 獨占系統,防止產生干擾
7). 每輪測試后分析測試數據,找到系統評價和優化可能性
測試統計結果樣本如下:
device: /dev/rbd1
ioengine: libaio size: 1000 runtime: 300
models: randread randwrite
mixread: 50
blocks: 4
iodepth: 2
numjobs: 1
processes: 1 2 4
rate: , ratemin:
rate_iops: 100, rate_iops_min:
host: 10.10.0.12 10.10.0.13 10.10.0.14 10.10.0.15
hosts,model,mixread,bs,iodepth,numjobs,r-bw(KB/s),r-iops,r-avglat(msec),w-bw(KB/s),w-iops,w-avglat(msec)
1,randread,/,4,2,1,1329.03,331,24.13,0,0,0
1,randwrite,/,4,2,1,0,0,0,1437.01,356,15.14
2,randread,/,4,2,1,3187.00,792,2.41,0,0,0
2,randwrite,/,4,2,1,0,0,0,3175.73,792,13.54
4,randread,/,4,2,1,6399.24,1591,1.72,0,0,0
4,randwrite,/,4,2,1,0,0,0,6344.70,1582,15.95
上述測試結果可以方便的導出到excel,制作成表格進行分析對比:
- Ceph的優化
我們前面說過,Ceph提供了很多的配置參數來允許用戶訂制自己的分布式存儲系統,在賦予用戶這個便利性的同時,也意味著如果用戶想獲取自己系統的最大性能時,必須自己進行分析調優。
Ceph是一個復雜的系統,官方的默認配置能保證系統基本運行,但是不能貼合用戶實際需求,達到最大化用戶物理系統性能的要求。雖說現在也已經有了一些朋友分享Ceph的配置參考和調優,但對每個用戶來說都不是拿來主義。他們只是提供了一種優化的參考,具體的效果如何還需要用戶貼合自己的實際測試結果來調整。
對于云英來說,我們的物理機配置是相當前衛的,用于Ceph系統的物理機硬件配置大致如下:
1). 200G+內存
3). 1:3的SSD和SATA配比,SSD分區做Journal,SATA盤做OSD
3). PCIE的存儲卡提供超高性能存儲Pool
4). 萬兆網卡提供Ceph的Cluster Network通信
5). 千兆網卡提供Ceph的Public Network通信
參考網上朋友的Ceph配置和調優參數后,結合我們的經驗和測試分析,我們做了適合自己的獨特優化,對比各種調優項前后,很好的達到我們的要求。
依據我們的經驗,可以在以下幾個方面做Ceph的性能調優:
1). BIOS設置:
關閉CPU節能
關閉NUMA
2). Linux參數調優
CPU設置為performance模式
調整內核的pid_max限制
調整SATA/SSD IO Scheduler
調整磁盤的read_ahead_kb大小
3). XFS相關
xfs mkfs options
xfs mount options
4). filestore調整
filestore fd cache size
filestore omap header cache size
filestore queue相關參數
filestore wbthrottle相關參數
object size
5). journal
性能高的SSD分區做journal
journal size > 5G
journal queue
6). osd相關
osd上PG總數限制
osd op threads
osd recovery threads
7). crushmap優化
給osd劃分合理的pools
故障域切分,降低數據丟失概率
- Ceph的監控
對于一個大型系統來說,完善的監控很重要,我們不可能時刻靠人工來發現系統的問題。
針對Ceph系統,我們調研了很多種方案,主要有如下幾種:
1). Ceph官方的Calamari(已一年多沒有提交)
2). Intel的VSM
3). Ceph-Dash
4). Inkscope
5). 定制化的Diamond + Grafana
6). Ceph Collectd + Grafana
最后選擇了適合我們的,方便我們擴展的一種。即:Diamond + Graphite + Grafana,下面介紹一下這些組件:
1). Diamond是一個客戶端性能收集工具,Python編寫,易與擴展。
2). Graphite是一個Python編寫的企業級開源監控工具,采用django框架。
3). Grafana是功能齊全的度量儀表盤和圖形編輯器,支持Graphite,InfluxDB和OpenTSDB。
部署后,我們可以在Grafana的前端訂制我們自己的監控項,類似下圖:
另外,Ceph進程的監控,集群狀態的監控,我們通過自己寫的腳本,完美的集成到Zabbix系統,實現了Ceph系統有問題的實時通知。
我們的腳本監控主要有如下幾個方面:
1). Ceph狀態和空間使用率的監控
2). OSD狀態的監控和自動拉起
3). Monitor狀態的監控和自動拉起
4). PG狀態的監控和報警
5). Slow Requests的監控和報警
總之,Ceph是一個大型的完善的分布式系統,對它的研究和優化是一個持續的過程。
審核編輯:郭婷
評論
查看更多