分布式存儲(chǔ)簡(jiǎn)介
分布式存儲(chǔ)系統(tǒng),是將數(shù)據(jù)分散存儲(chǔ)在多臺(tái)獨(dú)立的設(shè)備上。傳統(tǒng)的網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)采用集中的存儲(chǔ)服務(wù)器存放所有數(shù)據(jù),存儲(chǔ)服務(wù)器成為系統(tǒng)性能的瓶頸,也是可靠性和安全性的焦點(diǎn),不能滿足大規(guī)模存儲(chǔ)應(yīng)用的需要。分布式網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)采用可擴(kuò)展的系統(tǒng)結(jié)構(gòu),利用多臺(tái)存儲(chǔ)服務(wù)器分擔(dān)存儲(chǔ)負(fù)荷,利用位置服務(wù)器定位存儲(chǔ)信息,它不但提高了系統(tǒng)的可靠性、可用性和存取效率,還易于擴(kuò)展。
分布式存儲(chǔ)常見(jiàn)的架構(gòu)
中間控制節(jié)點(diǎn)架構(gòu)(HDFS)
分布式存儲(chǔ)最早是由谷歌提出的,其目的是通過(guò)廉價(jià)的服務(wù)器來(lái)提供使用與大規(guī)模,高并發(fā)場(chǎng)景下的Web訪問(wèn)問(wèn)題。如圖3是谷歌分布式存儲(chǔ)(HDFS)的簡(jiǎn)化的模型。在該系統(tǒng)的整個(gè)架構(gòu)中將服務(wù)器分為兩種類型,一種名為namenode,這種類型的節(jié)點(diǎn)負(fù)責(zé)管理管理數(shù)據(jù)(元數(shù)據(jù)),另外一種名為datanode,這種類型的服務(wù)器負(fù)責(zé)實(shí)際數(shù)據(jù)的管理。
圖3 HDFS簡(jiǎn)化架構(gòu)圖示意圖
上圖分布式存儲(chǔ)中,如果客戶端需要從某個(gè)文件讀取數(shù)據(jù),首先從namenode獲取該文件的位置(具體在哪個(gè)datanode),然后從該位置獲取具體的數(shù)據(jù)。在該架構(gòu)中namenode通常是主備部署,而datanode則是由大量節(jié)點(diǎn)構(gòu)成一個(gè)集群。由于元數(shù)據(jù)的訪問(wèn)頻度和訪問(wèn)量相對(duì)數(shù)據(jù)都要小很多,因此namenode通常不會(huì)成為性能瓶頸,而datanode集群可以分散客戶端的請(qǐng)求。因此,通過(guò)這種分布式存儲(chǔ)架構(gòu)可以通過(guò)橫向擴(kuò)展datanode的數(shù)量來(lái)增加承載能力,也即實(shí)現(xiàn)了動(dòng)態(tài)橫向擴(kuò)展的能力。
完全無(wú)中心架構(gòu)---計(jì)算模式(Ceph)
如圖是Ceph存儲(chǔ)系統(tǒng)的架構(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)的性能瓶頸。
圖4 Ceph無(wú)中心架構(gòu)
在Ceph存儲(chǔ)系統(tǒng)架構(gòu)中核心組件有Mon服務(wù)、OSD服務(wù)和MDS服務(wù)等。對(duì)于塊存儲(chǔ)類型只需要Mon服務(wù)、OSD服務(wù)和客戶端的軟件即可。其中Mon服務(wù)用于維護(hù)存儲(chǔ)系統(tǒng)的硬件邏輯關(guān)系,主要是服務(wù)器和硬盤(pán)等在線信息。Mon服務(wù)通過(guò)集群的方式保證其服務(wù)的可用性。OSD服務(wù)用于實(shí)現(xiàn)對(duì)磁盤(pán)的管理,實(shí)現(xiàn)真正的數(shù)據(jù)讀寫(xiě),通常一個(gè)磁盤(pán)對(duì)應(yīng)一個(gè)OSD服務(wù)。
完全無(wú)中心架構(gòu)---一致性哈希(Swift)
與Ceph的通過(guò)計(jì)算方式獲得數(shù)據(jù)位置的方式不同,另外一種方式是通過(guò)一致性哈希的方式獲得數(shù)據(jù)位置。一致性哈希的方式就是將設(shè)備做成一個(gè)哈希環(huán),然后根據(jù)數(shù)據(jù)名稱計(jì)算出的哈希值映射到哈希環(huán)的某個(gè)位置,從而實(shí)現(xiàn)數(shù)據(jù)的定位。
圖5 一致性哈希原理
如圖5是一致性哈希的基本原理,為了繪制簡(jiǎn)單,本文以一個(gè)服務(wù)器上的一個(gè)磁盤(pán)為例進(jìn)行介紹。為了保證數(shù)據(jù)分配的均勻性及出現(xiàn)設(shè)備故障時(shí)數(shù)據(jù)遷移的均勻性,一致性哈希將磁盤(pán)劃分為比較多的虛擬分區(qū),每個(gè)虛擬分區(qū)是哈希環(huán)上的一個(gè)節(jié)點(diǎn)。整個(gè)環(huán)是一個(gè)從0到32位最大值的一個(gè)區(qū)間,并且首尾相接。當(dāng)計(jì)算出數(shù)據(jù)(或者數(shù)據(jù)名稱)的哈希值后,必然落到哈希環(huán)的某個(gè)區(qū)間,然后以順時(shí)針,必然能夠找到一個(gè)節(jié)點(diǎn)。那么,這個(gè)節(jié)點(diǎn)就是存儲(chǔ)數(shù)據(jù)的位置。
Swift存儲(chǔ)的整個(gè)數(shù)據(jù)定位算法就是基于上述一致性哈希實(shí)現(xiàn)的。在Swift對(duì)象存儲(chǔ)中,通過(guò)賬戶名/容器名/對(duì)象名三個(gè)名稱組成一個(gè)位置的標(biāo)識(shí),通過(guò)該唯一標(biāo)識(shí)可以計(jì)算出一個(gè)整型數(shù)來(lái)。而在存儲(chǔ)設(shè)備方面,Swift構(gòu)建一個(gè)虛擬分區(qū)表,表的大小在創(chuàng)建集群是確定(通常為幾十萬(wàn)),這個(gè)表其實(shí)就是一個(gè)數(shù)組。這樣,根據(jù)上面計(jì)算的整數(shù)值,以及這個(gè)數(shù)組,通過(guò)一致性哈希算法就可以確定該整數(shù)在數(shù)組的位置。而數(shù)組中的每項(xiàng)內(nèi)容是數(shù)據(jù)3個(gè)副本(也可以是其它副本數(shù)量)的設(shè)備信息(包含服務(wù)器和磁盤(pán)等信息)。也就是經(jīng)過(guò)上述計(jì)算,可以確定一個(gè)數(shù)據(jù)存儲(chǔ)的具體位置。這樣,Swift就可以將請(qǐng)求重新定向到該設(shè)備進(jìn)行處理。
圖6 Swift數(shù)據(jù)定位示意圖
上述計(jì)算過(guò)程是在一個(gè)名為Proxy的服務(wù)中進(jìn)行的,該服務(wù)可以集群化部署。因此可以分?jǐn)傉?qǐng)求的負(fù)載,不會(huì)成為性能瓶頸。
責(zé)任編輯人:CC
評(píng)論