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




















評論