1簡介
? Ceph是加州大學(xué)Santa Cruz分校的Sage Weil( DreamHost的聯(lián)合創(chuàng)始人) 專為博士論文設(shè)計的新一代自由軟件分布式文件系統(tǒng)叮阅。
2004年醉拓, Ceph項目開始业岁, 提交了第一行代碼。
2006年邮偎, OSDI學(xué)術(shù)會議上肌似, Sage發(fā)表了介紹Ceph的論文, 并在該篇論文的末尾提供了Ceph項目的下載鏈接垮兑。
2010年冷尉, Linus Torvalds將CephClient合并到內(nèi)核2.6.34中, 使Linux與Ceph磨合度更高系枪。
2012年雀哨, 擁抱OpenStack, 進(jìn)入Cinder項目, 成為重要的存儲驅(qū)動雾棺。
2014年膊夹, Ceph正趕上OpenStack大熱, 吸引來自不同廠商越來越多的開發(fā)者加入捌浩, Intel割疾、 SanDisk等公司都參與其中, 同時Inktank公司被Red Hat公司1.75億美元收購嘉栓。
2015年宏榕, Red Hat宣布成立Ceph顧問委員會, 成員包括Canonical侵佃、 CERN麻昼、 Cisco、 Fujitsu馋辈、Intel抚芦、 SanDisk和SUSE。 Ceph顧問委員會將負(fù)責(zé)Ceph軟件定義存儲項目的廣泛議題迈螟, 目標(biāo)是使Ceph成為云存儲系統(tǒng)叉抡。
2016年, OpenStack社區(qū)調(diào)查報告公布答毫, Ceph仍為存儲首選褥民, 這已經(jīng)是Ceph第5次位居調(diào)查的首位了。
目前洗搂,ceph FS 可以作為Hadoop后端數(shù)據(jù)存儲池消返,可代替HDFS的存儲方案。
Ceph與KVM虛擬化結(jié)合耘拇,ceph塊存儲RBD可作為KVM虛擬化的后端存儲撵颊。
ceph塊存儲RBD可作為openstack的后端存儲。
Ceph的RGW與OwnCloud搭配惫叛,搭建本地網(wǎng)盤倡勇。
特別說明:Ceph支持三種調(diào)用接口:對象存儲,塊存儲嘉涌,文件系統(tǒng)掛載妻熊。
后面主要講解對象存儲模塊相關(guān)。
2ceph架構(gòu)圖
Ceph基本組成結(jié)構(gòu):
更詳細(xì)的架構(gòu)圖如下:
Ceph 分上下兩層洛心, 下面為ceph RADOS Cluster 集群固耘。上面為對外提供的應(yīng)用層。
RADOS Cluster是分布式文件存儲词身。
LIBRADOS 是調(diào)用庫厅目,允許應(yīng)用程序訪問RADOS Cluster。
RGW 是一套基于當(dāng)前流行的RESTful協(xié)議網(wǎng)關(guān),兼容S3和SWIFT损敷。
RBD 通過Linux內(nèi)核(Kernel)客戶端和QEMU/KVM驅(qū)動葫笼,提供一個完全分布式的塊存儲。
CEPH FS 通過Linux內(nèi)核(Kernel)客戶端結(jié)合FUSE拗馒,來提供一個兼容POSIX的文件系統(tǒng)路星。
3 Rados Cluster
首先介紹ceph的后端存儲:Rados Cluste。Rados Cluster屬于存儲層級诱桂, 沒有REST洋丐、用戶、桶的概念挥等。
3.1 Rados Cluster基本組件
一個ceph集群組件必有:MON友绝、OSD組件, 可選MDS(供ceph FS使用)肝劲。
Osd :用于集群中所有數(shù)據(jù)與對象的存儲迁客。處理集群數(shù)據(jù)的復(fù)制、恢復(fù)辞槐、回填掷漱、再均衡。并向其他osd守護(hù)進(jìn)程發(fā)送心跳榄檬,然后向Mon提供一些監(jiān)控信息卜范。當(dāng)Ceph存儲集群設(shè)定數(shù)據(jù)有兩個副本時(一共存兩份),則至少需要兩個OSD守護(hù)進(jìn)程即兩個OSD節(jié)點丙号,集群才能達(dá)到active+clean狀態(tài)先朦。
Monitor :監(jiān)控整個集群的狀態(tài),維護(hù)集群的cluster MAP二進(jìn)制表犬缨,保證集群數(shù)據(jù)的一致性。Monitor map包含以下map:OSD MAP棉浸、PG MAP怀薛、MDS MAP和CRUSH MAP等。
MON :服務(wù)利用Paxos實例迷郑,把每個映射圖存儲為一個文件枝恋, MON高可用集群實現(xiàn)一般為3臺。
MDS(可選) :為Ceph文件系統(tǒng)提供元數(shù)據(jù)計算嗡害、緩存與同步。在ceph中霸妹,元數(shù)據(jù)也是存儲在osd節(jié)點中的,mds類似于元數(shù)據(jù)的代理緩存服務(wù)器。MDS進(jìn)程并不是必須的進(jìn)程鹃骂,只有需要使用CEPHFS時,才需要配置MDS節(jié)點畏线。
3.2 Rados Cluster I/O流
數(shù)據(jù)分布是分布式存儲系統(tǒng)的一個重要部分静盅。
數(shù)據(jù)分布算法目前主流有兩種:一致性HASH和ceph的CRUSH算法。 在Aamzon的Dyanmo鍵值系統(tǒng)中采用一致性HASH算法寝殴,openstack的swift也使用一致性HASH算法,在ceph中使用CRUSH算法蚣常。
3.2.1 crush算法簡介
CRUSH(controlled replication under scalable hashing)是一種基于偽隨機(jī)控制數(shù)據(jù)分布、復(fù)制算法史隆。它是一種偽隨機(jī)的算法魂务,在相同的環(huán)境下,相似的輸入得到的結(jié)果之間沒有相關(guān)性泌射,相同的輸入得到的結(jié)果是確定的。它只需要一個集群的描述地圖和一些規(guī)則就可以根據(jù)一個整型的輸入得到存放數(shù)據(jù)的一個設(shè)備列表熔酷。
Crush同時支持多種數(shù)據(jù)備份策略,典型如鏡像拒秘、RAID及其衍生的糾錯碼等,并受控地將數(shù)據(jù)的多個備份映射到集群不同物理區(qū)域中的底層存儲設(shè)備之上躺酒,從而保證數(shù)據(jù)可靠性。
3.2.2 CEPH I/O流
Rados Cluster中羹应,monitor組件存儲了以下map: OSD MAP、 pg map园匹、mds map雳刺、crush map裸违、mds map、以及monitoer map供汛。
?(1) 將文件切割為按照一個特定的size(ceph系統(tǒng)默認(rèn)是4M)被切分成若干個對象涌穆。(這里的對象時RADOS層的對象, 不是RGW中的對象)蒲犬。
(2) 通過對Oid進(jìn)行Hash, 可以得到對應(yīng)PG_ID原叮,(poolid, hash(oid) & mask)
(3) 通過CRUSH算法得到一個OSD列表(OSD1,OSD2奋隶,OSD3),Crush(pgid)->(osd1,osd2…)
(4) 獲取到osd后唯欣,應(yīng)用層客戶端直接向OSD(primary osd)發(fā)起I/O請求。
所以一句話說明CRUSH的作用就是境氢,根據(jù)pgid得到一個OSD列表。
3.3 Rados Cluster 部署實例
下圖為雅虎利用ceph構(gòu)建存儲的服務(wù)器部署圖:
4 CEPH-RGW
對象存儲是一種新型的存儲形態(tài)萍聊,通常情況提供HTTP訪問接口悦析。從狹義上講寿桨,對象存儲即云存儲强戴。
4.1 RGW架構(gòu)
Ceph的核心模塊RADOS是一個基于對象的分布式存儲系統(tǒng)(注意:這里的對象時指RADOS內(nèi)部的一種數(shù)據(jù)存儲單元亭螟,與對象存儲中的對象概念有區(qū)別)骑歹,通常情況下應(yīng)用通過RADOS抽象庫librados提供的接口訪問RADOS集群,但是librados只提供私有接口陵刹,并不提供HTTP協(xié)議訪問,Ceph為了支持通用的HTTP接口設(shè)計了RGW(RADOS GateWay衰琐,即對象存儲網(wǎng)關(guān))炼蹦。
4.2 數(shù)據(jù)組織和存儲
通常情況羡宙,一個對象存儲(RGW)的實體包含用戶掐隐、存儲桶和對象狗热,三者之間是一種層級關(guān)系。
(1) 用戶管理
用戶管理設(shè)計包含以下:用戶認(rèn)證信息匿刮、訪問控制權(quán)限信息和配額信息。
S3用戶認(rèn)證流程請參考《對象存儲概述》文檔熟丸。
RGW將用戶信息保存在RADOS對象的數(shù)據(jù)部分,一個用戶對應(yīng)一個RADOS對象光羞。該對象用用戶ID命名。
(2) 存儲桶信息
一個存儲桶對應(yīng)一個RADOS對象纱兑。一個存儲桶包含的信息分兩類,一類是對RGW網(wǎng)關(guān)透明的信息潜慎,例如:用戶自定義的元數(shù)據(jù) type:音頻文件;一類是RGW網(wǎng)關(guān)關(guān)注的信息铐炫,這類信息包含存儲桶中對象的存儲策略、存儲桶中索引對象的數(shù)目以及應(yīng)用與索引對象的映射關(guān)系驳遵、存儲桶配額等,此類信息由RGWBucketInfo管理堤结。
(3 )對象
應(yīng)用上傳的對象包含數(shù)據(jù)和元數(shù)據(jù)兩部分,數(shù)據(jù)部分保存在一個活多個RADOS對象的數(shù)據(jù)部分竞穷,元數(shù)據(jù)保存在其中一個RADOS對象的擴(kuò)展屬性中。RGW對單個對象提供了兩種上傳接口: 整體上傳和分段上傳瘾带。這里不詳細(xì)介紹。
4.3 功能實現(xiàn)
RGW近幾年一直在不停對齊S3 API
基本功能包含用戶看政、存儲桶、對象的增刪改查允蚣。
引申的功能有存儲桶和對象的訪問控制功能,用戶認(rèn)證功能嚷兔,桶配額功能等森渐。
訪問控制策略如下:
5CEPH-RBD
? RBD是CEPH對外三大存儲服務(wù)組件之一,也是當(dāng)前CEPH最穩(wěn)定竟块、應(yīng)用最廣泛的存儲接口。上傳應(yīng)用訪問RBD塊存儲有兩種途徑:librdb和krdb浪秘。其中l(wèi)ibrdb是一個基于librados的用戶態(tài)接口庫,而krbd是集成在GNU/LINUX內(nèi)核中的一個內(nèi)核模塊秫逝,通過用戶態(tài)的rbd命令行工具,可以將RBD塊存儲映射為本地的一個塊設(shè)備文件违帆。
5.1 RBD架構(gòu)
? RBD架構(gòu):
6 CEPH-FS
? Ceph FS是為了接管傳統(tǒng)存儲系統(tǒng)產(chǎn)生的。
Ceph FS的MDS是基于動態(tài)子樹分區(qū)法實現(xiàn)刷后,這種算法是一種高效的元數(shù)據(jù)組織和索引方式。
MDS的基于動態(tài)子樹分區(qū)法和CRUSH算法并稱Ceph的兩大核心尝胆。
6.1 Ceph FS架構(gòu)
(1) CephFs kernel object
為內(nèi)核態(tài)接口护桦,3.10以后的內(nèi)核版本默認(rèn)支持沿后,它通過mount –t ceph將cephFs掛載到操作系統(tǒng)指定目錄下。
(2) CephFs FUSE
指基于FUSE(Filesystem in Userspace, 即用戶空間文件系統(tǒng)廉邑。Linux 在2.6.14內(nèi)核增加FUSE模塊)的用戶態(tài)接口傅寡,通過 ceph-fuse命令將CephFs掛載到操作系統(tǒng)指定目錄廊敌。
(3) User Space Client
為直接通過客戶端應(yīng)用程序調(diào)用CephFs提供的文件系統(tǒng)接口因妙,比如Hadoop調(diào)用CephFs提供的java文件系統(tǒng)接口實現(xiàn)文件存儲痰憎。
7 Ceph與K8s
Kubernetes支持Ceph的塊存儲(Ceph RDB)和文件存儲(CephFS)作為Kubernetes的持久存儲后端。
k8s提供了非常豐富的組件:volume攀涵,Persistent Volumes,Dynamic Volume Provisioning以故。對于volume涡拘,如果K8s pod掛掉据德,對應(yīng)的volume也就消失了鳄乏,所有后面主要介紹Persistent Volumes和Dynamic Volume Provisioning利用ceph創(chuàng)建。
7.1 RBD與K8S
參考資料:https://zhangchenchen.github.io/2017/11/17/kubernetes-integrate-with-ceph/
Persistent Volumes
(1) 在ceph中創(chuàng)建一個2G的image橱野。
創(chuàng)建image過程中有個坑:在jewel版本下默認(rèn)format是2,開啟了rbd的一些屬性善玫,而這些屬性有的內(nèi)核版本是不支持的,會導(dǎo)致map不到device的情況茅郎,可以在創(chuàng)建時指定feature(我們就是這樣做的),也可以在ceph配置文件中關(guān)閉這些新屬性:rbd_default_features = 2蜗元。參考rbd無法map(rbd feature disable)系冗。
需要指定feature:rbd create test-image -s 2G --image-feature layering
(2) k8s在image上創(chuàng)建pv和pvc奕扣,并創(chuàng)建pod使用Pvc。
Dynamic Volume Provisioning
(1) 創(chuàng)建一個storageclass
(2) 創(chuàng)建一個PVC掌敬,指定storageclass
(3) 創(chuàng)建 rbd-provisioner
(注意:如果直接創(chuàng)建pod掛載的話會報錯如下:
Error creating rbd image: executable file not found in $PATH
原因:這是因為我們的k8s集群是使用kubeadm創(chuàng)建的,k8s的幾個服務(wù)也是跑在集群靜態(tài)pod中奔害,而kube-controller-manager組件會調(diào)用rbd的api楷兽,但是因為它的pod中沒有安裝rbd华临,所以會報錯芯杀,如果是直接安裝在物理機(jī)中,因為我們已經(jīng)安裝了ceph-common揭厚,所以不會出現(xiàn)這個問題。)
(4) 就可以創(chuàng)建pod使用pvc了寻馏。
7.2 cephFs與K8s
參考資料:https://tonybai.com/2017/05/08/mount-cephfs-acrossing-nodes-in-kubernetes-cluster/
CephRBD的問題:在不同node上多個Pod是無法以ReadWriteMany模式掛載同一個CephRBD的,在一個node上多個Pod是可以以ReadWriteMany模式掛載同一個CephRBD的诚欠。
CephFs: 不同節(jié)點可以掛載同一CephFS顽染。
CephFs掛載方式:
在K8s中,至少可以通過兩種方式掛載CephFS粉寞,一種是通過Pod直接掛載;另外一種則是通過pv和pvc掛載左腔,此方法與掛載RBD類似唧垦。