四大開源分布式存儲_如何評估Kubernetes持久化存儲方案


       在2018年的Garnter技術成熟度曲線中,容器存儲出現在了技術觸發期,已經開始進入大眾的視野。我相信,在未來的兩年內,容器存儲會隨着Kubernetes的進一步成熟和商業化,其地位會越來越重要。如何在五花八門的存儲產品中,選擇適合自己的一款,將會是IT大佬們必須要面對的問題。本文將會從使用場景角度分析,如何評估容器存儲方案。

存儲概念

       從用戶角度看,存儲就是一塊盤或者一個目錄,用戶不關心盤或者目錄如何實現,用戶要求非常“簡單”,就是穩定,性能好。為了能夠提供穩定可靠的存儲產品,各個廠家推出了各種各樣的存儲技術和概念。為了能夠讓大家有一個整體認識,本文先介紹存儲中的這些概念。從存儲介質角度,存儲介質分為機械硬盤和固態硬盤(SSD)。機械硬盤泛指采用磁頭尋址的磁盤設備,包括SATA硬盤和SAS硬盤。由於采用磁頭尋址,機械硬盤性能一般,隨機IOPS一般在200左右,順序帶寬在150MB/s左右。固態硬盤是指采用Flash/DRAM芯片+控制器組成的設備,根據協議的不同,又分為SATA SSD,SAS SSD,PCIe SSD和NVMe SSD。從產品定義角度,存儲分為本地存儲(DAS),網絡存儲(NAS),存儲局域網(SAN)和軟件定義存儲(SDS)四大類。

  • DAS就是本地盤,直接插到服務器上

  • NAS是指提供NFS協議的NAS設備,通常采用磁盤陣列+協議網關的方式

  • SAN跟NAS類似,提供SCSI/iSCSI協議,后端是磁盤陣列

  • SDS是一種泛指,包括分布式NAS(並行文件系統),ServerSAN等

 

      從應用場景角度,存儲分為文件存儲(Posix/MPI),塊存儲(iSCSI/Qemu)和對象存儲(S3/Swift)三大類。Kubernetes是如何給存儲定義和分類呢?Kubernetes中跟存儲相關的概念有PersistentVolume (PV)和PersistentVolumeClaim(PVC),PV又分為靜態PV和動態PV。靜態PV方式如下:


 

 

 動態PV需要引入StorageClass的概念,使用方式如下:

 

 

PersistentVolume的in-tree Plugin,如下圖所示。從圖中可以看到,Kubernetes通過訪問模式給存儲分為三大類,RWO/ROX/RWX。這種分類將原有的存儲概念混淆,其中包含存儲協議,存儲開源產品,存儲商業產品,公有雲存儲產品等等。

 

 

如何將Kubernetes中的分類和熟知的存儲概念對應起來呢?本文選擇將其和應用場景進行類比。

  1. 塊存儲通常只支持RWO,比如AWSElasticBlockStore,AzureDisk,有些產品能做到支持ROX,比如GCEPersistentDisk,RBD,ScaleIO等
  2. 文件存儲(分布式文件系統)支持RWO/ROX/RWX三種模式,比如CephFS,GlusterFS和AzureFile
  3. 對象存儲不需要PV/PVC來做資源抽象,應用可以直接訪問和使用

        這里不得不吐槽Kubernetes社區前期對存儲層的抽象,一個字——亂,把開源項目和商業項目都納入進來。現在社區已經意識到問題並設計了統一的存儲接口層——Flexvolume/CSI。目前來看,CSI將會是Kubernetes的主流,做了完整的存儲抽象層。

應用場景

        介紹完存儲概念之后,選擇哪種存儲仍然懸而未決。這個時候,請問自己一個問題,業務是什么類型?選擇合適的存儲,一定要清楚自己的業務對存儲的需求。本文整理了使用容器存儲的場景及其特點:

配置無論集群配置信息還是應用配置信息,其特點是並發訪問,也就是前邊提到的ROX/RWX,在不同集群或者不同節點,都能夠訪問同樣的配置文件,分布式文件存儲是最優選擇。

日志在容器場景中,日志是很重要的一部分內容,其特點是高吞吐,有可能會產生大量小文件。如果有日志分析場景,還會有大量並發讀操作。分布式文件存儲是最優選擇。

應用(數據庫/消息隊列/大數據)Kafka,MySQL,Cassandra,PostgreSQL,ElasticSearch,HDFS等應用,本身具備了存儲數據的能力,對底層存儲的要求就是高IOPS,低延遲。底層存儲最好有數據冗余機制,上層應用就可以避免復雜的故障和恢復處理。以HDFS為例,當某個datanode節點掉線后,原有邏輯中,會選擇啟動新的datanode,觸發恢復邏輯,完成數據副本補全,這段時間會比較長,而且對業務影響也比較大。如果底層存儲有副本機制,HDFS集群就可以設置為單副本,datanode節點掉線后,啟動新的datanode,掛載原有的pv,集群恢復正常,對業務的影響縮短為秒級。高性能分布式文件存儲高性能分布式塊存儲是最優選擇。

備份(應用數據的備份或者數據庫的備份),其特點是高吞吐,數據量大,低成本。文件存儲對象存儲最優。綜合應用場景,高性能文件存儲是最優選擇。

存儲產品

          市面上的存儲產品種類繁多,但是對於容器場景,主要集中在4種方案:分布式文件存儲,分布式塊存儲,Local-Disk和傳統NAS。

  • 分布式塊存儲包括開源社區的Ceph,Sheepdog,商業產品中EMC的Scale IO,Vmware的vSAN等。分布式塊存儲不適合容器場景,關鍵問題是缺失RWX的特性。
  • 分布式文件存儲包括開源社區的Glusterfs,Cephfs,Lustre,Moosefs,Lizardfs,商業產品中EMC的isilon,IBM的GPFS等。分布式文件存儲適合容器場景,但是性能問題比較突出,主要集中在GlusterFS,CephFS,MooseFS/LizardFS。
  • Local-Disk方案有明顯的缺點,尤其是針對數據庫,大數據類的應用。節點故障后,數據的恢復時間長,對業務影響范圍廣。
  • 傳統NAS也是一種文件存儲,但是協議網關(機頭)是性能瓶頸,傳統NAS已經跟不上時代發展的潮流。

這里簡單對比下開源項目的優缺點,僅供參考。

 

 

評估策略

存儲的核心需求是穩定,可靠,可用。無論是開源的存儲項目還是商業的存儲產品,評估方法具有普適性,本文會介紹常見的評估項和評估方法。

數據可靠性

數據可靠性是指數據不丟失的概率。通常情況下,存儲產品會給出幾個9的數據可靠性,或者給出最多允許故障盤/節點個數。評估方式就是暴力拔盤,比如說存儲提供3副本策略,拔任意2塊盤,只要數據不損壞,說明可靠性沒問題。存儲采用不同的數據冗余策略,提供的可靠性是不一樣的。

數據可用性

數據可用性和數據可靠性很容易被混淆,可用性指的是數據是否在線。比如存儲集群斷電,這段時間數據是不在線,但是數據沒有丟失,集群恢復正常后,數據可以正常訪問。評估可用性的主要方式是拔服務器電源,再有查看存儲的部署組件是否有單點故障的可能。

數據一致性

數據一致性是最難評估的一項,因為大部分場景用戶不知道程序寫了哪些數據,寫到了哪里。該如何評估數據一致性呢?普通的測試工具可以采用fio開啟crc校驗選項,最好的測試工具就是數據庫。如果發生了數據不一致的情況,數據庫要么起不來,要么表數據不對。具體的測試用例還要細細斟酌。

存儲性能

存儲的性能測試很有講究,塊存儲和文件存儲的側重點也不一樣。

塊存儲 fio/iozone是兩個典型的測試工具,重點測試IOPS,延遲和帶寬。

以fio為例,測試命令如下:

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

關注幾個主要參數:iodepth,bs,rw和ioengine。

測試IOPS,iodepth=32/64/128,bs=4k/8k,rw=randread/randwrite,ioengine=libaio

測試延遲,iodepth=1,bs=4k/8k,rw=randread/randwrite,ioengine=sync

測試帶寬,iodepth=32/64/128,bs=512k/1m,rw=read/write,ioengine=libaio

文件存儲  fio/vdbench/mdtest是測試文件系統常用的工具,fio/vdbench用來評估IOPS,延遲和帶寬,mdtest評估文件系統元數據性能。

以fio和mdtest為例,測試命令如下:

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

與塊存儲的測試參數有一個很大區別,就是ioengine都是用的sync,用numjobs替換iodepth。

測試IOPS,bs=4k/8k,rw=randread/randwrite,numjobs=32/64

測試延遲,bs=4k/8k,rw=randread/randwrite,numjobs=1

測試帶寬,bs=512k/1m,rw=read/write,numjobs=32/64


mdtest是專門針對文件系統元數據性能的測試工具,主要測試指標是creation和stat,需要采用mpirun並發測試:

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

 

存儲性能測試不僅僅測試集群正常場景下的指標,還要包含其他場景:

  1. 存儲容量在70%以上或者文件數量上億的性能指標

  2. 節點/磁盤故障后的性能指標

  3. 擴容過程時的性能指標

容器存儲功能除了存儲的核心功能(高可靠/高可用/高性能),對於容器存儲,還需要幾個額外的功能保證生產環境的穩定可用。

  1. Flexvolume/CSI接口的支持,動態/靜態PV的支持
  2. 存儲配額。對於Kubernetes的管理員來說,存儲的配額是必須的,否則存儲的使用空間會處於不可控狀態
  3. 服務質量(QoS)。如果沒有QoS,存儲管理員只能期望存儲提供其他監控指標,以保證在集群超負荷時,找出罪魁禍首

 

總結

Kubernetes持久化存儲方案的重點在存儲和容器支持上。因此首要考慮存儲的核心功能和容器的場景支持。綜合本文所述,將選擇項按優先級列舉:

  1. 存儲的三大核心,高可靠,高可用和高性能
  2. 業務場景,選擇分布式文件存儲
  3. 擴展性,存儲能橫向擴展,應對業務增長需求
  4. 可運維性,存儲的運維難度不亞於存儲的開發,選擇運維便捷存儲產品
  5. 成本

 

 

 

 

 

 


————————————————
版權聲明:本文為CSDN博主「weixin_39608526」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_39608526/article/details/111390396

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM