張文濤?Docker
在2018年的Garnter技術(shù)成熟度曲線中鸣剪,容器存儲(chǔ)出現(xiàn)在了技術(shù)觸發(fā)期组底,已經(jīng)開(kāi)始進(jìn)入大眾的視野丈积。我相信,在未來(lái)的兩年內(nèi)债鸡,容器存儲(chǔ)會(huì)隨著Kubernetes的進(jìn)一步成熟和商業(yè)化江滨,其地位會(huì)越來(lái)越重要。如何在五花八門(mén)的存儲(chǔ)產(chǎn)品中厌均,選擇適合自己的一款牙寞,將會(huì)是IT大佬們必須要面對(duì)的問(wèn)題。本文將會(huì)從使用場(chǎng)景角度分析莫秆,如何評(píng)估容器存儲(chǔ)方案间雀。
五花八門(mén)的存儲(chǔ)概念
從用戶角度看,存儲(chǔ)就是一塊盤(pán)或者一個(gè)目錄镊屎,用戶不關(guān)心盤(pán)或者目錄如何實(shí)現(xiàn)惹挟,用戶要求非常“簡(jiǎn)單”缝驳,就是穩(wěn)定连锯,性能好。為了能夠提供穩(wěn)定可靠的存儲(chǔ)產(chǎn)品用狱,各個(gè)廠家推出了各種各樣的存儲(chǔ)技術(shù)和概念运怖。為了能夠讓大家有一個(gè)整體認(rèn)識(shí),本文先介紹存儲(chǔ)中的這些概念夏伊。
從存儲(chǔ)介質(zhì)角度摇展,存儲(chǔ)介質(zhì)分為機(jī)械硬盤(pán)和固態(tài)硬盤(pán)(SSD)。機(jī)械硬盤(pán)泛指采用磁頭尋址的磁盤(pán)設(shè)備溺忧,包括SATA硬盤(pán)和SAS硬盤(pán)咏连。由于采用磁頭尋址,機(jī)械硬盤(pán)性能一般鲁森,隨機(jī)IOPS一般在200左右祟滴,順序帶寬在150MB/s左右。固態(tài)硬盤(pán)是指采用Flash/DRAM芯片+控制器組成的設(shè)備歌溉,根據(jù)協(xié)議的不同垄懂,又分為SATA SSD,SAS SSD痛垛,PCIe SSD和NVMe SSD草慧。
從產(chǎn)品定義角度,存儲(chǔ)分為本地存儲(chǔ)(DAS)榜晦,網(wǎng)絡(luò)存儲(chǔ)(NAS)冠蒋,存儲(chǔ)局域網(wǎng)(SAN)和軟件定義存儲(chǔ)(SDS)四大類。
DAS就是本地盤(pán)乾胶,直接插到服務(wù)器上
NAS是指提供NFS協(xié)議的NAS設(shè)備抖剿,通常采用磁盤(pán)陣列+協(xié)議網(wǎng)關(guān)的方式
SAN跟NAS類似,提供SCSI/iSCSI協(xié)議识窿,后端是磁盤(pán)陣列
SDS是一種泛指斩郎,包括分布式NAS(并行文件系統(tǒng)),ServerSAN等
從應(yīng)用場(chǎng)景角度喻频,存儲(chǔ)分為文件存儲(chǔ)(Posix/MPI)缩宜,塊存儲(chǔ)(iSCSI/Qemu)和對(duì)象存儲(chǔ)(S3/Swift)三大類。
Kubernetes是如何給存儲(chǔ)定義和分類呢甥温?Kubernetes中跟存儲(chǔ)相關(guān)的概念有PersistentVolume (PV)和PersistentVolumeClaim(PVC)锻煌,PV又分為靜態(tài)PV和動(dòng)態(tài)PV。靜態(tài)PV方式如下:
動(dòng)態(tài)PV需要引入StorageClass的概念姻蚓,使用方式如下:
社區(qū)列舉出PersistentVolume的in-tree Plugin宋梧,如下圖所示。從圖中可以看到狰挡,Kubernetes通過(guò)訪問(wèn)模式給存儲(chǔ)分為三大類捂龄,RWO/ROX/RWX。這種分類將原有的存儲(chǔ)概念混淆加叁,其中包含存儲(chǔ)協(xié)議倦沧,存儲(chǔ)開(kāi)源產(chǎn)品,存儲(chǔ)商業(yè)產(chǎn)品它匕,公有云存儲(chǔ)產(chǎn)品等等展融。
如何將Kubernetes中的分類和熟知的存儲(chǔ)概念對(duì)應(yīng)起來(lái)呢?本文選擇將其和應(yīng)用場(chǎng)景進(jìn)行類比豫柬。
塊存儲(chǔ)通常只支持RWO愈污,比如AWSElasticBlockStore,AzureDisk轮傍,有些產(chǎn)品能做到支持ROX暂雹,比如GCEPersistentDisk,RBD创夜,ScaleIO等
文件存儲(chǔ)(分布式文件系統(tǒng))支持RWO/ROX/RWX三種模式杭跪,比如CephFS,GlusterFS和AzureFile
對(duì)象存儲(chǔ)不需要PV/PVC來(lái)做資源抽象驰吓,應(yīng)用可以直接訪問(wèn)和使用
這里不得不吐槽Kubernetes社區(qū)前期對(duì)存儲(chǔ)層的抽象涧尿,一個(gè)字——亂,把開(kāi)源項(xiàng)目和商業(yè)項(xiàng)目都納入進(jìn)來(lái)∶史。現(xiàn)在社區(qū)已經(jīng)意識(shí)到問(wèn)題并設(shè)計(jì)了統(tǒng)一的存儲(chǔ)接口層——Flexvolume/CSI姑廉。目前來(lái)看,CSI將會(huì)是Kubernetes的主流翁涤,做了完整的存儲(chǔ)抽象層桥言。
多種多樣的應(yīng)用場(chǎng)景
介紹完存儲(chǔ)概念之后萌踱,選擇哪種存儲(chǔ)仍然懸而未決。這個(gè)時(shí)候号阿,請(qǐng)問(wèn)自己一個(gè)問(wèn)題并鸵,業(yè)務(wù)是什么類型?選擇合適的存儲(chǔ)扔涧,一定要清楚自己的業(yè)務(wù)對(duì)存儲(chǔ)的需求园担。本文整理了使用容器存儲(chǔ)的場(chǎng)景及其特點(diǎn)。
配置
無(wú)論集群配置信息還是應(yīng)用配置信息枯夜,其特點(diǎn)是并發(fā)訪問(wèn)弯汰,也就是前邊提到的ROX/RWX,在不同集群或者不同節(jié)點(diǎn)湖雹,都能夠訪問(wèn)同樣的配置文件咏闪,分布式文件存儲(chǔ)是最優(yōu)選擇。
日志
在容器場(chǎng)景中劝枣,日志是很重要的一部分內(nèi)容汤踏,其特點(diǎn)是高吞吐,有可能會(huì)產(chǎn)生大量小文件舔腾。如果有日志分析場(chǎng)景溪胶,還會(huì)有大量并發(fā)讀操作。分布式文件存儲(chǔ)是最優(yōu)選擇稳诚。
應(yīng)用(數(shù)據(jù)庫(kù)/消息隊(duì)列/大數(shù)據(jù))
Kafka哗脖,MySQL,Cassandra扳还,PostgreSQL才避,ElasticSearch,HDFS等應(yīng)用氨距,本身具備了存儲(chǔ)數(shù)據(jù)的能力桑逝,對(duì)底層存儲(chǔ)的要求就是高IOPS,低延遲俏让。底層存儲(chǔ)最好有數(shù)據(jù)冗余機(jī)制楞遏,上層應(yīng)用就可以避免復(fù)雜的故障和恢復(fù)處理。以HDFS為例首昔,當(dāng)某個(gè)datanode節(jié)點(diǎn)掉線后寡喝,原有邏輯中,會(huì)選擇啟動(dòng)新的datanode勒奇,觸發(fā)恢復(fù)邏輯预鬓,完成數(shù)據(jù)副本補(bǔ)全,這段時(shí)間會(huì)比較長(zhǎng)赊颠,而且對(duì)業(yè)務(wù)影響也比較大格二。如果底層存儲(chǔ)有副本機(jī)制劈彪,HDFS集群就可以設(shè)置為單副本,datanode節(jié)點(diǎn)掉線后蟋定,啟動(dòng)新的datanode粉臊,掛載原有的pv草添,集群恢復(fù)正常驶兜,對(duì)業(yè)務(wù)的影響縮短為秒級(jí)。高性能分布式文件存儲(chǔ)和高性能分布式塊存儲(chǔ)是最優(yōu)選擇远寸。
備份
應(yīng)用數(shù)據(jù)的備份或者數(shù)據(jù)庫(kù)的備份抄淑,其特點(diǎn)是高吞吐,數(shù)據(jù)量大驰后,低成本肆资。文件存儲(chǔ)和對(duì)象存儲(chǔ)最優(yōu)。
綜合應(yīng)用場(chǎng)景灶芝,高性能文件存儲(chǔ)是最優(yōu)選擇郑原。
形形色色的存儲(chǔ)產(chǎn)品
市面上的存儲(chǔ)產(chǎn)品種類繁多,但是對(duì)于容器場(chǎng)景夜涕,主要集中在4種方案:分布式文件存儲(chǔ)犯犁,分布式塊存儲(chǔ),Local-Disk和傳統(tǒng)NAS女器。
分布式塊存儲(chǔ)包括開(kāi)源社區(qū)的Ceph酸役,Sheepdog,商業(yè)產(chǎn)品中EMC的Scale IO驾胆,Vmware的vSAN等涣澡。分布式塊存儲(chǔ)不適合容器場(chǎng)景,關(guān)鍵問(wèn)題是缺失RWX的特性丧诺。
分布式文件存儲(chǔ)包括開(kāi)源社區(qū)的Glusterfs入桂,Cephfs,Lustre驳阎,Moosefs抗愁,Lizardfs,商業(yè)產(chǎn)品中EMC的isilon搞隐,IBM的GPFS等驹愚。分布式文件存儲(chǔ)適合容器場(chǎng)景,但是性能問(wèn)題比較突出劣纲,主要集中在GlusterFS逢捺,CephFS,MooseFS/LizardFS癞季。
這里簡(jiǎn)單對(duì)比下開(kāi)源項(xiàng)目的優(yōu)缺點(diǎn)劫瞳,僅供參考倘潜。
Local-Disk方案有明顯的缺點(diǎn),尤其是針對(duì)數(shù)據(jù)庫(kù)志于,大數(shù)據(jù)類的應(yīng)用涮因。節(jié)點(diǎn)故障后,數(shù)據(jù)的恢復(fù)時(shí)間長(zhǎng)伺绽,對(duì)業(yè)務(wù)影響范圍廣养泡。
傳統(tǒng)NAS也是一種文件存儲(chǔ),但是協(xié)議網(wǎng)關(guān)(機(jī)頭)是性能瓶頸奈应,傳統(tǒng)NAS已經(jīng)跟不上時(shí)代發(fā)展的潮流澜掩。
分門(mén)別類的評(píng)估策略
存儲(chǔ)的核心需求是穩(wěn)定,可靠杖挣,可用肩榕。無(wú)論是開(kāi)源的存儲(chǔ)項(xiàng)目還是商業(yè)的存儲(chǔ)產(chǎn)品,評(píng)估方法具有普適性惩妇,本文會(huì)介紹常見(jiàn)的評(píng)估項(xiàng)和評(píng)估方法株汉。
數(shù)據(jù)可靠性
數(shù)據(jù)可靠性是指數(shù)據(jù)不丟失的概率。通常情況下歌殃,存儲(chǔ)產(chǎn)品會(huì)給出幾個(gè)9的數(shù)據(jù)可靠性乔妈,或者給出最多允許故障盤(pán)/節(jié)點(diǎn)個(gè)數(shù)。評(píng)估方式就是暴力拔盤(pán)挺份,比如說(shuō)存儲(chǔ)提供3副本策略褒翰,拔任意2塊盤(pán),只要數(shù)據(jù)不損壞匀泊,說(shuō)明可靠性沒(méi)問(wèn)題优训。存儲(chǔ)采用不同的數(shù)據(jù)冗余策略,提供的可靠性是不一樣的各聘。
數(shù)據(jù)可用性
數(shù)據(jù)可用性和數(shù)據(jù)可靠性很容易被混淆揣非,可用性指的是數(shù)據(jù)是否在線。比如存儲(chǔ)集群斷電躲因,這段時(shí)間數(shù)據(jù)是不在線早敬,但是數(shù)據(jù)沒(méi)有丟失,集群恢復(fù)正常后大脉,數(shù)據(jù)可以正常訪問(wèn)搞监。評(píng)估可用性的主要方式是拔服務(wù)器電源,再有查看存儲(chǔ)的部署組件是否有單點(diǎn)故障的可能镰矿。
數(shù)據(jù)一致性
數(shù)據(jù)一致性是最難評(píng)估的一項(xiàng)琐驴,因?yàn)榇蟛糠謭?chǎng)景用戶不知道程序?qū)懥四男?shù)據(jù),寫(xiě)到了哪里。該如何評(píng)估數(shù)據(jù)一致性呢绝淡?普通的測(cè)試工具可以采用fio開(kāi)啟crc校驗(yàn)選項(xiàng)宙刘,最好的測(cè)試工具就是數(shù)據(jù)庫(kù)。如果發(fā)生了數(shù)據(jù)不一致的情況牢酵,數(shù)據(jù)庫(kù)要么起不來(lái)悬包,要么表數(shù)據(jù)不對(duì)。具體的測(cè)試用例還要細(xì)細(xì)斟酌馍乙。
存儲(chǔ)性能
存儲(chǔ)的性能測(cè)試很有講究布近,塊存儲(chǔ)和文件存儲(chǔ)的側(cè)重點(diǎn)也不一樣。
塊存儲(chǔ)
fio/iozone是兩個(gè)典型的測(cè)試工具潘拨,重點(diǎn)測(cè)試IOPS吊输,延遲和帶寬饶号。以fio為例铁追,測(cè)試命令如下:
fio -filename=/dev/sdc -iodepth=${iodepth} -direct=1 -bs=${bs} -size=100% --rw=${iotype} -thread -time_based -runtime=600 -ioengine=${ioengine} -group_reporting -name=fioTest
關(guān)注幾個(gè)主要參數(shù):iodepth,bs茫船,rw和ioengine琅束。
測(cè)試IOPS,iodepth=32/64/128算谈,bs=4k/8k涩禀,rw=randread/randwrite,ioengine=libaio
測(cè)試延遲然眼,iodepth=1艾船,bs=4k/8k,rw=randread/randwrite高每,ioengine=sync
測(cè)試帶寬屿岂,iodepth=32/64/128,bs=512k/1m鲸匿,rw=read/write爷怀,ioengine=libaio
文件存儲(chǔ)
fio/vdbench/mdtest是測(cè)試文件系統(tǒng)常用的工具,fio/vdbench用來(lái)評(píng)估IOPS带欢,延遲和帶寬运授,mdtest評(píng)估文件系統(tǒng)元數(shù)據(jù)性能。以fio和mdtest為例乔煞,測(cè)試命令如下:
fio -filename=/mnt/yrfs/fio.test -iodepth=1 -direct=1 -bs=${bs} -size=500G --rw=${iotype} -numjobs=${numjobs} -time_based -runtime=600 -ioengine=sync -group_reporting -name=fioTest
與塊存儲(chǔ)的測(cè)試參數(shù)有一個(gè)很大區(qū)別吁朦,就是ioengine都是用的sync,用numjobs替換iodepth渡贾。
測(cè)試IOPS逗宜,bs=4k/8k,rw=randread/randwrite,numjobs=32/64
測(cè)試延遲锦溪,bs=4k/8k不脯,rw=randread/randwrite,numjobs=1
測(cè)試帶寬刻诊,bs=512k/1m防楷,rw=read/write,numjobs=32/64
mdtest是專門(mén)針對(duì)文件系統(tǒng)元數(shù)據(jù)性能的測(cè)試工具则涯,主要測(cè)試指標(biāo)是creation和stat复局,需要采用mpirun并發(fā)測(cè)試:
mpirun --allow-run-as-root -mca btl_openib_allow_ib 1 -host yanrong-node0:${slots},yanrong-node1:${slots},yanrong-node2:${slots} -np ${num_procs} mdtest -C -T -d /mnt/yrfs/mdtest -i 1 -I ${files_per_dir} -z 2 -b 8 -L -F -r -u
存儲(chǔ)性能測(cè)試不僅僅測(cè)試集群正常場(chǎng)景下的指標(biāo),還要包含其他場(chǎng)景:
存儲(chǔ)容量在70%以上或者文件數(shù)量上億的性能指標(biāo)
節(jié)點(diǎn)/磁盤(pán)故障后的性能指標(biāo)
擴(kuò)容過(guò)程時(shí)的性能指標(biāo)
容器存儲(chǔ)功能
除了存儲(chǔ)的核心功能(高可靠/高可用/高性能)粟判,對(duì)于容器存儲(chǔ)亿昏,還需要幾個(gè)額外的功能保證生產(chǎn)環(huán)境的穩(wěn)定可用。
Flexvolume/CSI接口的支持档礁,動(dòng)態(tài)/靜態(tài)PV的支持
存儲(chǔ)配額角钩。對(duì)于Kubernetes的管理員來(lái)說(shuō),存儲(chǔ)的配額是必須的呻澜,否則存儲(chǔ)的使用空間會(huì)處于不可控狀態(tài)
服務(wù)質(zhì)量(QoS)递礼。如果沒(méi)有QoS,存儲(chǔ)管理員只能期望存儲(chǔ)提供其他監(jiān)控指標(biāo)羹幸,以保證在集群超負(fù)荷時(shí)脊髓,找出罪魁禍?zhǔn)?/p>
萬(wàn)變不離其宗的選擇
Kubernetes持久化存儲(chǔ)方案的重點(diǎn)在存儲(chǔ)和容器支持上。因此首要考慮存儲(chǔ)的核心功能和容器的場(chǎng)景支持栅受。綜合本文所述将硝,將選擇項(xiàng)按優(yōu)先級(jí)列舉:
存儲(chǔ)的三大核心,高可靠屏镊,高可用和高性能
業(yè)務(wù)場(chǎng)景依疼,選擇分布式文件存儲(chǔ)
擴(kuò)展性,存儲(chǔ)能橫向擴(kuò)展闸衫,應(yīng)對(duì)業(yè)務(wù)增長(zhǎng)需求
可運(yùn)維性涛贯,存儲(chǔ)的運(yùn)維難度不亞于存儲(chǔ)的開(kāi)發(fā),選擇運(yùn)維便捷存儲(chǔ)產(chǎn)品
成本
Q&A
Q:你好蔚出,我們公司采用GlusterFS存儲(chǔ)弟翘,掛載三塊盤(pán),現(xiàn)在遇到高并發(fā)寫(xiě)小文件(4KB)吞吐量上不去(5MB/S)骄酗,請(qǐng)問(wèn)有什么比較好的監(jiān)控工具或方法么稀余?謝謝!
A:GlusterFS本身對(duì)小文件就很不友好趋翻,GlusterFS是針對(duì)備份場(chǎng)景設(shè)計(jì)的睛琳,不建議用在小文件場(chǎng)景,如果可以的話,要么程序做優(yōu)化進(jìn)行小文件合并师骗,要么選用高性能的分布式文件存儲(chǔ)历等,建議看看Lustre或者YRCloudFile。
Q:你好辟癌,目前開(kāi)源在用Rook部署Ceph寒屯,Ceph對(duì)于塊設(shè)備存儲(chǔ)性能如何?可以提升嗎黍少?未來(lái)寡夹?
A:我們最近也在關(guān)注Rook項(xiàng)目,Rook的理念是很好的厂置,但是現(xiàn)在Rook就是Ceph的封裝菩掏,把Ceph跑到容器中,復(fù)用Kubernetes的監(jiān)控平臺(tái)昵济。而Ceph的運(yùn)維復(fù)雜度很高智绸,以目前的做法,項(xiàng)目想要做好砸紊,難度會(huì)非常大传于。
Q:我看您推薦分布式文件存儲(chǔ),文件系統(tǒng)能滿足數(shù)據(jù)庫(kù)應(yīng)用的需求嗎醉顽?塊存儲(chǔ)會(huì)不會(huì)好一些?
A:首先平挑,我推薦的是高性能分布式文件系統(tǒng)游添。數(shù)據(jù)庫(kù)一般對(duì)延遲都比較敏感,普通的萬(wàn)兆網(wǎng)絡(luò)+HDD肯定不行通熄,需要采用SSD唆涝,一般能將延遲穩(wěn)定在毫秒以內(nèi),通常能夠滿足要求唇辨。如果對(duì)延遲有特別要求廊酣,可以采用NVMe + RoCE的方案,即使在大壓力下赏枚,延遲也能穩(wěn)定在300微秒以內(nèi)亡驰。
Q:請(qǐng)問(wèn)為什么說(shuō)塊存儲(chǔ)不支持RWX?RWX就是指多個(gè)節(jié)點(diǎn)同時(shí)掛載同一塊塊設(shè)備并同時(shí)讀寫(xiě)嗎饿幅?很多FC存儲(chǔ)都可以做到凡辱。
A:傳統(tǒng)的SAN要支持RWX,需要ALUA機(jī)制栗恩,而且這是塊級(jí)別的多讀寫(xiě)透乾,如果要再加上文件系統(tǒng),是沒(méi)辦法做到的,這需要分布式文件系統(tǒng)來(lái)做文件元數(shù)據(jù)信息同步乳乌。
Q:請(qǐng)問(wèn)現(xiàn)在的Kubernetes環(huán)境下捧韵,海量小文件RWX場(chǎng)景,有什么相對(duì)比較好的開(kāi)源分布式存儲(chǔ)解決方案么汉操?
A:開(kāi)源的分布式文件存儲(chǔ)項(xiàng)目中纫版,沒(méi)有能解決海量小文件的,我在文中已經(jīng)將主流開(kāi)源文件系統(tǒng)都分析了一遍客情,在設(shè)計(jì)之初其弊,都是針對(duì)備份場(chǎng)景或者HPC領(lǐng)域。
Q:請(qǐng)問(wèn)膀斋,為什么說(shuō)Ceph性能不好梭伐,有依據(jù)嗎?
A:直接用數(shù)據(jù)說(shuō)話仰担,我們用NVMe + Ceph + Bluestore測(cè)試出來(lái)的糊识,延遲在毫秒級(jí)以上,而且很不穩(wěn)定摔蓝,我們用YRCloudFile + NVMe + RoCE赂苗,延遲能50微秒左右,差了幾十倍贮尉。
Q:Lustre沒(méi)接觸過(guò)拌滋,性能好嗎,和Ceph有對(duì)比過(guò)嗎猜谚?
A:網(wǎng)上有很多Lustre的性能指標(biāo)败砂,在同樣的配置下,性能絕對(duì)要比Ceph好魏铅,不過(guò)Lustre全部都是內(nèi)核態(tài)的昌犹,容器場(chǎng)景沒(méi)辦法用,而且按照部署以及運(yùn)維難度非常大览芳。Lustre在超算用的比較廣泛斜姥。
Q:Lustre只能靠本地磁盤(pán)陣列來(lái)保證數(shù)據(jù)冗余么?
A:Lustre本身不提供冗余機(jī)制沧竟,都是靠本地陣列的铸敏,不過(guò)EC好像已經(jīng)在開(kāi)發(fā)計(jì)劃中了。
Q:(對(duì)于小公司)如果不選用商業(yè)存儲(chǔ)屯仗,那么推薦哪款開(kāi)源實(shí)現(xiàn)作為生產(chǎn)存儲(chǔ)(可靠搞坝,高性能)。我們之前試了NFS發(fā)現(xiàn)速度不穩(wěn)定魁袜?
A:國(guó)內(nèi)還是有很多創(chuàng)業(yè)公司桩撮,也不貴的敦第。存儲(chǔ)不像其他項(xiàng)目,存儲(chǔ)經(jīng)不起折騰店量,一定要用穩(wěn)定可靠的芜果,Ceph/GlusterFS做了這么久,大家在采購(gòu)的時(shí)候融师,還是會(huì)依托于某家商業(yè)公司來(lái)做右钾,自己生產(chǎn)環(huán)境用開(kāi)源項(xiàng)目,風(fēng)險(xiǎn)太大了旱爆。
Q:GPFS用來(lái)做Kubernetes的PV舀射,性能怎么樣?
A:用GPFS的話怀伦,性能還是有一定保障的脆烟,不過(guò)GPFS跟Lustre一樣,都是帶著陣列一起賣的房待,很貴邢羔。