讓我們了解 Ceph 分布式存儲(chǔ)
前言
最近在學(xué)習(xí)kubernetes過(guò)程中,想實(shí)現(xiàn)pod數(shù)據(jù)的持久化。在調(diào)研的過(guò)程中,發(fā)現(xiàn)ceph在最近幾年發(fā)展火熱,也有很多案例落地企業(yè)。在選型方面,個(gè)人更加傾向于社區(qū)火熱的項(xiàng)目,GlusterFS、Ceph都在考慮的范圍之內(nèi),但是由于GlusterFS只提供對(duì)象存儲(chǔ)和文件系統(tǒng)存儲(chǔ),而Ceph則提供對(duì)象存儲(chǔ)、塊存儲(chǔ)以及文件系統(tǒng)存儲(chǔ)。懷著對(duì)新事物的向往,果斷選擇Ceph來(lái)實(shí)現(xiàn)Ceph塊存儲(chǔ)對(duì)接kubernetes來(lái)實(shí)現(xiàn)pod的數(shù)據(jù)持久化。
一、初始Ceph
1.1了解什么是塊存儲(chǔ)/對(duì)象存儲(chǔ)/文件系統(tǒng)存儲(chǔ)?
直接進(jìn)入主題,ceph目前提供對(duì)象存儲(chǔ)(RADOSGW)、塊存儲(chǔ)RDB以及CephFS文件系統(tǒng)這3種功能。對(duì)于這3種功能介紹,分別如下:
1.對(duì)象存儲(chǔ),也就是通常意義的鍵值存儲(chǔ),其接口就是簡(jiǎn)單的GET、PUT、DEL和其他擴(kuò)展,代表主要有Swift、S3以及Gluster等;
2.塊存儲(chǔ),這種接口通常以QEMUDriver或者KernelModule的方式存在,這種接口需要實(shí)現(xiàn)Linux的BlockDevice的接口或者QEMU提供的BlockDriver接口,如Sheepdog,AWS的EBS,青云的云硬盤(pán)和阿里云的盤(pán)古系統(tǒng),還有Ceph的RBD(RBD是Ceph面向塊存儲(chǔ)的接口)。在常見(jiàn)的存儲(chǔ)中DAS、SAN提供的也是塊存儲(chǔ);
3.文件存儲(chǔ),通常意義是支持POSIX接口,它跟傳統(tǒng)的文件系統(tǒng)如Ext4是一個(gè)類(lèi)型的,但區(qū)別在于分布式存儲(chǔ)提供了并行化的能力,如Ceph的CephFS(CephFS是Ceph面向文件存儲(chǔ)的接口),但是有時(shí)候又會(huì)把GlusterFS,HDFS這種非POSIX接口的類(lèi)文件存儲(chǔ)接口歸入此類(lèi)。當(dāng)然NFS、NAS也是屬于文件系統(tǒng)存儲(chǔ);
1.2Ceph組件介紹
從下面這張圖來(lái)簡(jiǎn)單學(xué)習(xí)下,Ceph的架構(gòu)組件。(提示:本人在學(xué)習(xí)過(guò)程中所繪,如果發(fā)現(xiàn)問(wèn)題歡迎留言,不要噴我喲)
Monitor,負(fù)責(zé)監(jiān)視整個(gè)集群的運(yùn)行狀況,信息由維護(hù)集群成員的守護(hù)程序來(lái)提供,各節(jié)點(diǎn)之間的狀態(tài)、集群配置信息。Cephmonitormap主要包括OSDmap、PGmap、MDSmap和CRUSH等,這些map被統(tǒng)稱為集群Map。cephmonitor不存儲(chǔ)任何數(shù)據(jù)。下面分別開(kāi)始介紹這些map的功能:
- Monitormap:包括有關(guān)monitor節(jié)點(diǎn)端到端的信息,其中包括Ceph集群ID,監(jiān)控主機(jī)名和IP以及端口。并且存儲(chǔ)當(dāng)前版本信息以及最新更改信息,通過(guò)"cephmondump"查看monitormap。
- OSDmap:包括一些常用的信息,如集群ID、創(chuàng)建OSDmap的版本信息和最后修改信息,以及pool相關(guān)信息,主要包括pool名字、pool的ID、類(lèi)型,副本數(shù)目以及PGP等,還包括數(shù)量、狀態(tài)、權(quán)重、最新的清潔間隔和OSD主機(jī)信息。通過(guò)命令"cephosddump"查看。
- PGmap:包括當(dāng)前PG版本、時(shí)間戳、最新的OSDMap的版本信息、空間使用比例,以及接近占滿比例信息,同事,也包括每個(gè)PGID、對(duì)象數(shù)目、狀態(tài)、OSD的狀態(tài)以及深度清理的詳細(xì)信息。通過(guò)命令"cephpgdump"可以查看相關(guān)狀態(tài)。
- CRUSHmap:CRUSHmap包括集群存儲(chǔ)設(shè)備信息,故障域?qū)哟谓Y(jié)構(gòu)和存儲(chǔ)數(shù)據(jù)時(shí)定義失敗域規(guī)則信息。通過(guò)命令"cephosdcrushmap"查看。
- MDSmap:MDSMap包括存儲(chǔ)當(dāng)前MDSmap的版本信息、創(chuàng)建當(dāng)前的Map的信息、修改時(shí)間、數(shù)據(jù)和元數(shù)據(jù)POOLID、集群MDS數(shù)目和MDS狀態(tài),可通過(guò)"cephmdsdump"查看。
OSD,CephOSD是由物理磁盤(pán)驅(qū)動(dòng)器、在其之上的Linux文件系統(tǒng)以及CephOSD服務(wù)組成。CephOSD將數(shù)據(jù)以對(duì)象的形式存儲(chǔ)到集群中的每個(gè)節(jié)點(diǎn)的物理磁盤(pán)上,完成存儲(chǔ)數(shù)據(jù)的工作絕大多數(shù)是由OSDdaemon進(jìn)程實(shí)現(xiàn)。在構(gòu)建CephOSD的時(shí)候,建議采用SSD磁盤(pán)以及xfs文件系統(tǒng)來(lái)格式化分區(qū)。BTRFS雖然有較好的性能,但是目前不建議使用到生產(chǎn)中,目前建議還是處于圍觀狀態(tài)。
Ceph元數(shù)據(jù),MDS。ceph塊設(shè)備和RDB并不需要MDS,MDS只為CephFS服務(wù)。
RADOS,ReliableAutonomicDistributedObjectStore。RADOS是ceph存儲(chǔ)集群的基礎(chǔ)。在ceph中,所有數(shù)據(jù)都以對(duì)象的形式存儲(chǔ),并且無(wú)論什么數(shù)據(jù)類(lèi)型,RADOS對(duì)象存儲(chǔ)都將負(fù)責(zé)保存這些對(duì)象。RADOS層可以確保數(shù)據(jù)始終保持一致。
librados,librados庫(kù),為應(yīng)用程度提供訪問(wèn)接口。同時(shí)也為塊存儲(chǔ)、對(duì)象存儲(chǔ)、文件系統(tǒng)提供原生的接口。
ADOS塊設(shè)備,它能夠自動(dòng)精簡(jiǎn)配置并可調(diào)整大小,而且將數(shù)據(jù)分散存儲(chǔ)在多個(gè)OSD上。
RADOSGW,網(wǎng)關(guān)接口,提供對(duì)象存儲(chǔ)服務(wù)。它使用librgw和librados來(lái)實(shí)現(xiàn)允許應(yīng)用程序與Ceph對(duì)象存儲(chǔ)建立連接。并且提供S3和Swift兼容的RESTfulAPI接口。
CephFS,Ceph文件系統(tǒng),與POSIX兼容的文件系統(tǒng),基于librados封裝原生接口。
簡(jiǎn)單說(shuō)下CRUSH,ControlledReplicationUnderScalableHashing,它表示數(shù)據(jù)存儲(chǔ)的分布式選擇算法,ceph的高性能/高可用就是采用這種算法實(shí)現(xiàn)。CRUSH算法取代了在元數(shù)據(jù)表中為每個(gè)客戶端請(qǐng)求進(jìn)行查找,它通過(guò)計(jì)算系統(tǒng)中數(shù)據(jù)應(yīng)該被寫(xiě)入或讀出的位置。CRUSH能夠感知基礎(chǔ)架構(gòu),能夠理解基礎(chǔ)設(shè)施各個(gè)部件之間的關(guān)系。并且CRUSH保存數(shù)據(jù)的多個(gè)副本,這樣即使一個(gè)故障域的幾個(gè)組件都出現(xiàn)故障,數(shù)據(jù)依然可用。CRUSH算是使得ceph實(shí)現(xiàn)了自我管理和自我修復(fù)。
RADOS分布式存儲(chǔ)相較于傳統(tǒng)分布式存儲(chǔ)的優(yōu)勢(shì)在于:
1.將文件映射到object后,利用ClusterMap通過(guò)CRUSH計(jì)算而不是查找表方式定位文件數(shù)據(jù)存儲(chǔ)到存儲(chǔ)設(shè)備的具體位置。優(yōu)化了傳統(tǒng)文件到塊的映射和BlockMAp的管理。
2.RADOS充分利用OSD的智能特點(diǎn),將部分任務(wù)授權(quán)給OSD,最大程度地實(shí)現(xiàn)可擴(kuò)展。
二、安裝Ceph
2.1環(huán)境準(zhǔn)備
##環(huán)境說(shuō)明
主機(jī)IP功能
ceph-node01192.168.58.128 deploy、mon*1、osd*3
ceph-node02192.168.58.129 mon*1、osd*3
ceph-node03192.168.58.130 mon*1、osd*3
##準(zhǔn)備yum源
- cd /etc/yum.repos.d/ && sudo mkdir bak
- sudo mv *.repo bak/
- sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
- sudo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
- sudo sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo
- sudo sed -i '/aliyuncs/d' /etc/yum.repos.d/epel.repo
- sudo sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo
##添加Ceph源
- sudo cat <<EOF > /etc/yum.repos.d/ceph.repo
- [Ceph]
- name=Ceph packages for x86_64
- baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
- enabled=1
- gpgcheck=1
- type=rpm-md
- gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
- [Ceph-noarch]
- name=Ceph noarch packages
- baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
- enabled=1
- gpgcheck=1
- type=rpm-md
- gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
- [ceph-source]
- name=Ceph source packages
- baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/
- enabled=1
- gpgcheck=1
- type=rpm-md
- gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
- EOF
##配置免密鑰(略)
提示:如果使用普通用戶進(jìn)行安裝,請(qǐng)授予用戶相關(guān)權(quán)限,如下:
a.將yangsheng用戶加入到sudo權(quán)限(yangshengALL=(ALL)NOPASSWD:ALL)
b.將/etc/sudoers中的“Defaultsrequiretty”注釋
2.2開(kāi)始安裝
##安裝部署工具(在192.168.58.128執(zhí)行如下操作)
- yum makecache
- yum -y install ceph-deploy
- ceph-deploy --version
- 1.5.39
##初始化monitor
- mkdir ceph-cluster && cd ceph-cluster
- ceph-deploy new ceph-node01 ceph-node02 ceph-node03
根據(jù)自己的IP配置向ceph.conf中添加public_network,并稍微增大mon之間時(shí)差允許范圍(默認(rèn)為0.05s,現(xiàn)改為2s):
- # change default replica 3 to 2
- osd pool default size = 2
- public network = 192.168.58.0/24
- cluster network = 192.168.58.0/24
##安裝ceph
- ceph-deployinstallceph-node01ceph-node02ceph-node03
##開(kāi)始部署monitor
- ceph-deploy mon create-initial
- [root@ceph-node01 ceph]# ls
- ceph.bootstrap-mds.keyring ceph.bootstrap-osd.keyring ceph.client.admin.keyring ceph-deploy-ceph.log rbdmap
- ceph.bootstrap-mgr.keyring ceph.bootstrap-rgw.keyring ceph.conf ceph.mon.keyring
查看集群狀態(tài)
- [root@ceph-node01 ceph]# ceph -s
- cluster b5108a6c-7e3d-4295-88fa-88dc825be3ba
- health HEALTH_ERR
- no osds
- monmap e1: 3 mons at {ceph-node01=192.168.58.128:6789/0,ceph-node02=192.168.58.129:6789/0,ceph-node03=192.168.58.130:6789/0}
- election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03
- osdmap e1: 0 osds: 0 up, 0 in
- flags sortbitwise,require_jewel_osds
- pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects
- 0 kB used, 0 kB / 0 kB avail
- 64 creating
提示:Monitor創(chuàng)建成功后,檢查集群的狀態(tài),此時(shí)集群狀態(tài)并不處于健康狀態(tài)。
##開(kāi)始部署OSD
- ### 列出節(jié)點(diǎn)所有磁盤(pán)信息
- ceph-deploy disk list ceph-node01 ceph-node02 ceph-node03
- ### 清除磁盤(pán)分區(qū)和內(nèi)容
- ceph-deploy disk zap ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb
- ### 分區(qū)格式化并激活
- ceph-deploy osd create ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb
- ceph-deploy osd activate ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb
此時(shí),再次查看集群狀態(tài)
- [root@ceph-node01 ceph-cluster]# ceph -s
- cluster 86fb7c8b-9ad1-4eaf-a24c-0d2d9f36ab29
- health HEALTH_OK
- monmap e2: 3 mons at {ceph-node01=192.168.58.128:6789/0,ceph-node02=192.168.58.129:6789/0,ceph-node03=192.168.58.130:6789/0}
- election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03
- osdmap e15: 3 osds: 3 up, 3 in
- flags sortbitwise,require_jewel_osds
- pgmap v32: 64 pgs, 1 pools, 0 bytes data, 0 objects
- 100 MB used, 45946 MB / 46046 MB avail
- 64 active+clean
2.3清理環(huán)境
如果之前部署失敗了,不必刪除ceph客戶端,或者重新搭建虛擬機(jī),只需要在每個(gè)節(jié)點(diǎn)上執(zhí)行如下指令即可將環(huán)境清理至剛安裝完ceph客戶端時(shí)的狀態(tài)!強(qiáng)烈建議在舊集群上搭建之前清理干凈環(huán)境,否則會(huì)發(fā)生各種異常情況。
- sudo ps aux|grep ceph | grep -v "grep"| awk '{print $2}'|xargs kill -9
- sudo ps -ef|grep ceph
- sudo umount /var/lib/ceph/osd/*
- sudo rm -rf /var/lib/ceph/osd/*
- sudo rm -rf /var/lib/ceph/mon/*
- sudo rm -rf /var/lib/ceph/mds/*
- sudo rm -rf /var/lib/ceph/bootstrap-mds/*
- sudo rm -rf /var/lib/ceph/bootstrap-osd/*
- sudo rm -rf /var/lib/ceph/bootstrap-rgw/*
- sudo rm -rf /var/lib/ceph/tmp/*
- sudo rm -rf /etc/ceph/*
- sudo rm -rf /var/run/ceph/*
三、配置客戶端
3.1安裝客戶端
- ssh-copy-id 192.168.58.131
- ceph-deploy install 192.168.58.131
將Ceph配置文件復(fù)制到192.168.58.131。
- ceph-deploy config push 192.168.58.131
3.2新建用戶密鑰
客戶機(jī)需要ceph秘鑰去訪問(wèn)ceph集群。ceph創(chuàng)建了一個(gè)默認(rèn)的用戶client.admin,它有足夠的權(quán)限去訪問(wèn)ceph集群。但是不建議把client.admin共享到所有其他的客戶端節(jié)點(diǎn)。這里我用分開(kāi)的秘鑰新建一個(gè)用戶(client.rdb)去訪問(wèn)特定的存儲(chǔ)池。
- cephauthget-or-createclient.rbdmon'allowr'osd'allowclass-readobject_prefixrbd_children,allowrwxpool=rbd'
為192.168.58.131上的client.rbd用戶添加秘鑰
- cephauthget-or-createclient.rbd|ssh192.168.58.131tee/etc/ceph/ceph.client.rbd.keyring
到客戶端(192.168.58.131)檢查集群健康狀態(tài)
- [root@localhost ~]# cat /etc/ceph/ceph.client.rbd.keyring >> /etc/ceph/keyring
- [root@localhost ~]# ceph -s --name client.rbd
- cluster 86fb7c8b-9ad1-4eaf-a24c-0d2d9f36ab29
- health HEALTH_OK
- monmap e2: 3 mons at {ceph-node01=192.168.58.128:6789/0,ceph-node02=192.168.58.129:6789/0,ceph-node03=192.168.58.130:6789/0}
- election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03
- osdmap e15: 3 osds: 3 up, 3 in
- flags sortbitwise,require_jewel_osds
- pgmap v32: 64 pgs, 1 pools, 0 bytes data, 0 objects
- 100 MB used, 45946 MB / 46046 MB avail
- 64 active+clean
3.3創(chuàng)建塊設(shè)備
- rbd create foo --size 4096 --name client.rbd # 創(chuàng)建一個(gè) 4096MB 大小的RADOS塊設(shè)備
- rbd create rbd01 --size 10240 --name client.rbd # 創(chuàng)建一個(gè) 10240MB 大小的RADOS塊設(shè)備
映射塊設(shè)備
- [root@localhost ceph]# rbd create rbd02 --size 10240 --image-feature layering --name client.rbd
- [root@localhost ceph]# rbd map --image rbd02 --name client.rbd /dev/rdb02
- /dev/rbd0
提示:在映射塊設(shè)備的時(shí)候,發(fā)生了如下錯(cuò)誤。
- [root@localhost ceph]# rbd map --image rbd01 --name client.rbd /dev/rdb01
- rbd: sysfs write failed
- RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
- In some cases useful info is found in syslog - try "dmesg | tail" or so.
- rbd: map failed: (6) No such device or address
解決該辦法有多種方式,分別如下所示:
1.在創(chuàng)建的過(guò)程中加入如下參數(shù)"--image-featurelayering"也解決該問(wèn)題。
2.手動(dòng)disable掉相關(guān)參數(shù),如下所示:
- rbdfeaturedisablefooexclusive-lock,object-map,fast-diff,deep-flatten
3.在每個(gè)ceph節(jié)點(diǎn)的配置文件中,加入該配置項(xiàng)"rbd_default_features=1"。
3.4檢查被映射的塊設(shè)備
- [root@localhost ceph]# rbd showmapped --name client.rbd
- id pool image snap device
- 0 rbd rbd02 - /dev/rbd0
創(chuàng)建并掛載該設(shè)備
- fdisk -l /dev/rbd0
- mkfs.xfs /dev/rbd0
- mkdir /mnt/ceph-disk1
- mount /dev/rbd1 /mnt/ceph-disk1
驗(yàn)證
- [root@localhost ceph]# df -h /mnt/ceph-disk1/
- 文件系統(tǒng) 容量 已用 可用 已用% 掛載點(diǎn)
- /dev/rbd0 10G 33M 10G 1% /mnt/ceph-disk1
一個(gè)ceph塊設(shè)備就創(chuàng)建完成。