分布式存儲(chǔ)最早是由谷歌提出的,其目的是通過(guò)廉價(jià)的服務(wù)器來(lái)提供使用與大規(guī)模,高并發(fā)場(chǎng)景下的Web訪問(wèn)問(wèn)題。它采用可擴(kuò)展的系統(tǒng)結(jié)構(gòu),利用多臺(tái)存儲(chǔ)服務(wù)器分擔(dān)存儲(chǔ)負(fù)荷,利用位置服務(wù)器定位存儲(chǔ)信息,它不但提高了系統(tǒng)的可靠性、可用性和存取效率,還易于擴(kuò)展。
1、分布式存儲(chǔ)的興起
分布式存儲(chǔ)的興起與互聯(lián)網(wǎng)的發(fā)展密不可分,互聯(lián)網(wǎng)公司由于其數(shù)據(jù)量大而資本積累少,而通常都使用大規(guī)模分布式存儲(chǔ)系統(tǒng)。
與傳統(tǒng)的高端服務(wù)器、高端存儲(chǔ)器和高端處理器不同的是,互聯(lián)網(wǎng)公司的分布式存儲(chǔ)系統(tǒng)由數(shù)量眾多的、低成本和高性價(jià)比的普通PC服務(wù)器通過(guò)網(wǎng)絡(luò)連接而成。其主要原因有以下三點(diǎn)
(1)互聯(lián)網(wǎng)的業(yè)務(wù)發(fā)展很快,而且注意成本消耗,這就使得存儲(chǔ)系統(tǒng)不能依靠傳統(tǒng)的縱向擴(kuò)展的方式,即先買(mǎi)小型機(jī),不夠時(shí)再買(mǎi)中型機(jī),甚至大型機(jī)。互聯(lián)網(wǎng)后端的分布式系統(tǒng)要求支持橫向擴(kuò)展,即通過(guò)增加普通PC服務(wù)器來(lái)提高系統(tǒng)的整體處理能力。
(2)普通PC服務(wù)器性價(jià)比高,故障率也高,需要在軟件層面實(shí)現(xiàn)自動(dòng)容錯(cuò),保證數(shù)據(jù)的一致性。
(3)另外,隨著服務(wù)器的不斷加入,需要能夠在軟件層面實(shí)現(xiàn)自動(dòng)負(fù)載均衡,使得系統(tǒng)的處理能力得到線性擴(kuò)展。
2、分布式存儲(chǔ)的重要性
從單機(jī)單用戶到單機(jī)多用戶,再到現(xiàn)在的網(wǎng)絡(luò)時(shí)代,應(yīng)用系統(tǒng)發(fā)生了很多的變化。而分布式系統(tǒng)依然是目前很熱門(mén)的討論話題,那么,分布式系統(tǒng)給我們帶來(lái)了什么,或者說(shuō)是為什么要有分布式系統(tǒng)呢?
(1)升級(jí)單機(jī)處理能力的性價(jià)比越來(lái)越低;
企業(yè)發(fā)現(xiàn)通過(guò)更換硬件做垂直擴(kuò)展的方式來(lái)提升性能會(huì)越來(lái)越不劃算;
(2)單機(jī)處理能力存在瓶頸;
某個(gè)固定時(shí)間點(diǎn),單顆處理器有自己的性能瓶頸,也就說(shuō)即使愿意花更多的錢(qián)去買(mǎi)計(jì)算能力也買(mǎi)不到了;
(3)出于穩(wěn)定性和可用性的考慮
如果采用單擊系統(tǒng),那么在這臺(tái)機(jī)器正常的時(shí)候一切OK,一旦出問(wèn)題,那么系統(tǒng)就完全不能用了。當(dāng)然,可以考慮做容災(zāi)備份等方案,而這些方案就會(huì)讓系統(tǒng)演變?yōu)榉植际较到y(tǒng)了;
(4)云存儲(chǔ)和大數(shù)據(jù)發(fā)展的必然要求
云存儲(chǔ)和大數(shù)據(jù)是構(gòu)建在分布式存儲(chǔ)之上的應(yīng)用。移動(dòng)終端的計(jì)算能力和存儲(chǔ)空間有限,而且有在多個(gè)設(shè)備之間共享資源的強(qiáng)烈的需求,這就使得網(wǎng)盤(pán)、相冊(cè)等云存儲(chǔ)應(yīng)用很快流行起來(lái)。然而,萬(wàn)變不離其宗,云存儲(chǔ)的核心還是后端的大規(guī)模分布式存儲(chǔ)系統(tǒng)。大數(shù)據(jù)則更近一步,不僅需要存儲(chǔ)海量數(shù)據(jù),還需要通過(guò)合適的計(jì)算框架或者工具對(duì)這些數(shù)據(jù)進(jìn)行分析,抽取其中有價(jià)值的部分。如果沒(méi)有分布式存儲(chǔ),便談不上對(duì)大數(shù)據(jù)進(jìn)行分析。仔細(xì)分析還會(huì)發(fā)現(xiàn),分布式存儲(chǔ)技術(shù)是互聯(lián)網(wǎng)后端架構(gòu)的神器,掌握了這項(xiàng)技能,以后理解其他技術(shù)的本質(zhì)會(huì)變得非常容易。
3、分布式存儲(chǔ)的種類(lèi)和比較
分布式存儲(chǔ)包含的種類(lèi)繁多,除了傳統(tǒng)意義上的分布式文件系統(tǒng)、分布式塊存儲(chǔ)和分布式對(duì)象存儲(chǔ)外,還包括分布式數(shù)據(jù)庫(kù)和分布式緩存等,但其中架構(gòu)無(wú)外乎于三種
A、中間控制節(jié)點(diǎn)架構(gòu)
以HDFS(HadoopDistributionFileSystem)為代表的架構(gòu)是典型的代表。在這種架構(gòu)中,一部分節(jié)點(diǎn)NameNode是存放管理數(shù)據(jù)(元數(shù)據(jù)),另一部分節(jié)點(diǎn)DataNode存放業(yè)務(wù)數(shù)據(jù),這種類(lèi)型的服務(wù)器負(fù)責(zé)管理具體數(shù)據(jù)。這種架構(gòu)就像公司的層次組織架構(gòu),namenode就如同老板,只管理下屬的經(jīng)理(datanode),而下屬的經(jīng)理,而經(jīng)理們來(lái)管理節(jié)點(diǎn)下本地盤(pán)上的數(shù)據(jù)。
在上圖中,如果客戶端需要從某個(gè)文件讀取數(shù)據(jù),首先從NameNode獲取該文件的位置(具體在哪個(gè)DataNode),然后從該NameNode獲取具體的數(shù)據(jù)。在該架構(gòu)中NameNode通常是主備部署(SecondaryNameNode),而DataNode則是由大量節(jié)點(diǎn)構(gòu)成一個(gè)集群。由于元數(shù)據(jù)的訪問(wèn)頻度和訪問(wèn)量相對(duì)數(shù)據(jù)都要小很多,因此NameNode通常不會(huì)成為性能瓶頸,而DataNode集群中的數(shù)據(jù)可以有副本,既可以保證高可用性,可以分散客戶端的請(qǐng)求。因此,通過(guò)這種分布式存儲(chǔ)架構(gòu)可以通過(guò)橫向擴(kuò)展datanode的數(shù)量來(lái)增加承載能力,也即實(shí)現(xiàn)了動(dòng)態(tài)橫向擴(kuò)展的能力。
B、完全無(wú)中心架構(gòu)–計(jì)算模式
以Ceph為代表的架構(gòu)是其典型的代表。在該架構(gòu)中與HDFS不同的地方在于該架構(gòu)中沒(méi)有中心節(jié)點(diǎn)??蛻舳耸峭ㄟ^(guò)一個(gè)設(shè)備映射關(guān)系計(jì)算出來(lái)其寫(xiě)入數(shù)據(jù)的位置,這樣客戶端可以直接與存儲(chǔ)節(jié)點(diǎn)通信,從而避免中心節(jié)點(diǎn)的性能瓶頸。
如上圖所示,在Ceph存儲(chǔ)系統(tǒng)架構(gòu)中核心組件有MON服務(wù)、OSD服務(wù)和MDS服務(wù)等。
(1)MON服務(wù)用于維護(hù)存儲(chǔ)系統(tǒng)的硬件邏輯關(guān)系,主要是服務(wù)器和硬盤(pán)等在線信息。MON服務(wù)通過(guò)集群的方式保證其服務(wù)的可用性。
(2)OSD服務(wù)用于實(shí)現(xiàn)對(duì)磁盤(pán)的管理,實(shí)現(xiàn)真正的數(shù)據(jù)讀寫(xiě),通常一個(gè)磁盤(pán)對(duì)應(yīng)一個(gè)OSD服務(wù)。
(3)MDS只為CephFS文件存儲(chǔ)系統(tǒng)跟蹤文件的層次機(jī)構(gòu)和存儲(chǔ)元數(shù)據(jù)。Ceph塊設(shè)備和RADOS并不需要元數(shù)據(jù),因此也不需要CephMDS守護(hù)進(jìn)程
(4)RADOS:RADOS就是包含上述三種服務(wù)的ceph存儲(chǔ)集群。在Ceph中所有的數(shù)據(jù)都以對(duì)象形式存在的,并且無(wú)論哪種數(shù)據(jù)類(lèi)型RADOS對(duì)象存儲(chǔ)都將負(fù)責(zé)保存這些對(duì)象。RADOS層可以確保數(shù)據(jù)始終保持一致性。要做到這一點(diǎn)必須執(zhí)行數(shù)據(jù)復(fù)制、故障檢測(cè)和恢復(fù),以及數(shù)據(jù)遷移和所在集群節(jié)點(diǎn)實(shí)現(xiàn)在平衡
(5)RBD(塊設(shè)備):原名RADOS塊設(shè)備,提供可靠的分布式和高性能塊存儲(chǔ)磁盤(pán)給客戶端。
(6)CephFS:Ceph文件系統(tǒng)提供了一個(gè)使用Ceph存儲(chǔ)集群存儲(chǔ)用戶數(shù)據(jù)的與POSIX兼容的文件系統(tǒng)
(7)Librados:libRADOS庫(kù)為PHP、RUBY、Java、Python、C++等語(yǔ)言提供了方便的訪問(wèn)RADOS接口的方式
(8)RADOSGW:RGW提供對(duì)象存儲(chǔ)服務(wù),它允許應(yīng)用程序和Ceph對(duì)象存儲(chǔ)建立連接,RGW提供了與AmazonS3和openstackSwift兼容的RUSTFULAPI
客戶端訪問(wèn)存儲(chǔ)的大致流程是,客戶端在啟動(dòng)后會(huì)首先通過(guò)RADOSGW進(jìn)入,從MON服務(wù)拉取存儲(chǔ)資源布局信息,然后根據(jù)該布局信息和寫(xiě)入數(shù)據(jù)的名稱(chēng)等信息計(jì)算出期望數(shù)據(jù)的位置(包含具體的物理服務(wù)器信息和磁盤(pán)信息),然后和該位置信息對(duì)應(yīng)的CephFS對(duì)應(yīng)的位置直接通信,讀取或者寫(xiě)入數(shù)據(jù)
C、完全無(wú)中心架構(gòu)–一致性哈希
以swift為代表的架構(gòu)是其典型的代表。與Ceph的通過(guò)計(jì)算方式獲得數(shù)據(jù)位置的方式不同,另外一種方式是通過(guò)一致性哈希的方式獲得數(shù)據(jù)位置。一致性哈希的方式就是將設(shè)備做成一個(gè)哈希環(huán),然后根據(jù)數(shù)據(jù)名稱(chēng)計(jì)算出的哈希值映射到哈希環(huán)的某個(gè)位置,從而實(shí)現(xiàn)數(shù)據(jù)的定位。
Swift中存在兩種映射關(guān)系,對(duì)于一個(gè)文件,通過(guò)哈希算法(MD5)找到對(duì)應(yīng)的虛節(jié)點(diǎn)(一對(duì)一的映射關(guān)系),虛節(jié)點(diǎn)再通過(guò)映射關(guān)系(ring文件中二維數(shù)組)找到對(duì)應(yīng)的設(shè)備(多對(duì)多的映射關(guān)系),這樣就完成了一個(gè)文件存儲(chǔ)在設(shè)備上的映射。
D、分布式存儲(chǔ)的比較
那么現(xiàn)在問(wèn)題來(lái)了,如果我們要選擇分布式存儲(chǔ),選擇哪種好呢?其實(shí)它們各有各的優(yōu)勢(shì)和使用場(chǎng)景,具體要看需求。
(1)HDFS
主要用于大數(shù)據(jù)的存儲(chǔ)場(chǎng)景,是Hadoop大數(shù)據(jù)架構(gòu)中的存儲(chǔ)組件。HDFS在開(kāi)始設(shè)計(jì)的時(shí)候,就已經(jīng)明確的它的應(yīng)用場(chǎng)景,就是大數(shù)據(jù)服務(wù)。主要的應(yīng)用場(chǎng)景有:
a、對(duì)大文件存儲(chǔ)的性能比較高,例如幾百兆,幾個(gè)G的大文件。因?yàn)镠DFS采用的是以元數(shù)據(jù)的方式進(jìn)行文件管理,而元數(shù)據(jù)的相關(guān)目錄和塊等信息保存在NameNode的內(nèi)存中,文件數(shù)量的增加會(huì)占用大量的NameNode內(nèi)存。如果存在大量的小文件,會(huì)占用大量?jī)?nèi)存空間,引起整個(gè)分布式存儲(chǔ)性能下降,所以盡量使用HDFS存儲(chǔ)大文件比較合適。
b、適合低寫(xiě)入,多次讀取的業(yè)務(wù)。就大數(shù)據(jù)分析業(yè)務(wù)而言,其處理模式就是一次寫(xiě)入、多次讀取,然后進(jìn)行數(shù)據(jù)分析工作,HDFS的數(shù)據(jù)傳輸吞吐量比較高,但是數(shù)據(jù)讀取延時(shí)比較差,不適合頻繁的數(shù)據(jù)寫(xiě)入。
c、HDFS采用多副本數(shù)據(jù)保護(hù)機(jī)制,使用普通的X86服務(wù)器就可以保障數(shù)據(jù)的可靠性,不推薦在虛擬化環(huán)境中使用。
(2)Ceph
目前應(yīng)用最廣泛的開(kāi)源分布式存儲(chǔ)系統(tǒng),已得到眾多廠商的支持,許多超融合系統(tǒng)的分布式存儲(chǔ)都是基于Ceph深度定制。而且Ceph已經(jīng)成為LINUX系統(tǒng)和OpenStack的“標(biāo)配”,用于支持各自的存儲(chǔ)系統(tǒng)。Ceph可以提供對(duì)象存儲(chǔ)、塊設(shè)備存儲(chǔ)和文件系統(tǒng)存儲(chǔ)服務(wù)。同時(shí)支持三種不同類(lèi)型的存儲(chǔ)服務(wù)的特性,在分布式存儲(chǔ)系統(tǒng)中,是很少見(jiàn)的。
a、Ceph沒(méi)有采用HDFS的元數(shù)據(jù)尋址的方案,而且采用CRUSH算法,數(shù)據(jù)分布均衡,并行度高。而且在支持塊存儲(chǔ)特性上,數(shù)據(jù)可以具有強(qiáng)一致性,可以獲得傳統(tǒng)集中式存儲(chǔ)的使用體驗(yàn)。
b、對(duì)象存儲(chǔ)服務(wù),Ceph支持Swift和S3的API接口。在塊存儲(chǔ)方面,支持精簡(jiǎn)配置、快照、克隆。在文件系統(tǒng)存儲(chǔ)服務(wù)方面,支持Posix接口,支持快照。但是目前Ceph支持文件的性能相當(dāng)其他分布式存儲(chǔ)系統(tǒng),部署稍顯復(fù)雜,性能也稍弱,一般都將Ceph應(yīng)用于塊和對(duì)象存儲(chǔ)。
c、Ceph是去中心化的分布式解決方案,需要提前做好規(guī)劃設(shè)計(jì),對(duì)技術(shù)團(tuán)隊(duì)的要求能力比較高。特別是在Ceph擴(kuò)容時(shí),由于其數(shù)據(jù)分布均衡的特性,會(huì)導(dǎo)致整個(gè)存儲(chǔ)系統(tǒng)性能的下降
(3)Swift
主要面向的是對(duì)象存儲(chǔ)。和Ceph提供的對(duì)象存儲(chǔ)服務(wù)類(lèi)似。主要用于解決非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)問(wèn)題。它和Ceph的對(duì)象存儲(chǔ)服務(wù)的主要區(qū)別是。
a、客戶端在訪問(wèn)對(duì)象存儲(chǔ)系統(tǒng)服務(wù)時(shí),Swift要求客戶端必須訪問(wèn)Swift網(wǎng)關(guān)才能獲得數(shù)據(jù)。而Ceph使用一個(gè)運(yùn)行在每個(gè)存儲(chǔ)節(jié)點(diǎn)上的OSD(對(duì)象存儲(chǔ)設(shè)備)獲取數(shù)據(jù)信息,沒(méi)有一個(gè)單獨(dú)的入口點(diǎn),比Swift更靈活一些。
b、數(shù)據(jù)一致性方面,Swift的數(shù)據(jù)是最終一致,在海量數(shù)據(jù)的處理效率上要高一些,但是主要面向?qū)?shù)據(jù)一致性要求不高,但是對(duì)數(shù)據(jù)處理效率要求比較高的對(duì)象存儲(chǔ)業(yè)務(wù)。而Ceph是始終跨集群強(qiáng)一致性。主要的應(yīng)用場(chǎng)景,在OpenStack中,對(duì)象存儲(chǔ)服務(wù)使用的就是Swift,而不是Ceph。
責(zé)任編輯人:CC
電子發(fā)燒友App


























評(píng)論