分布式儲存系統設計 資料分片

2021-09-05 10:29:22 字數 2581 閱讀 8237

**:

在分布式儲存系統中,資料需要分散儲存在多台裝置上,資料分片(sharding)就是用來確定資料在多台儲存裝置上分布的技術。資料分片要達到三個目的:

分布均勻,即每台裝置上的資料量要盡可能相近;

負載均衡,即每台裝置上的請求量要盡可能相近;

擴縮容時產生的資料遷移盡可能少。

資料分片一般都是使用key或key的雜湊值來計算key的分布,常見的幾種資料分片的方法如下:

劃分號段。這種一般適用於key為整型的情況,每台裝置上存放相同大小的號段區間,如把key為[1, 10000]的資料放在第一台裝置上,把key為[10001, 20000]的資料放在第二台裝置上,依次類推。這種方法實現很簡單,擴容也比較方便,成倍增加裝置即可,如原來有n臺裝置,再新增n臺裝置來擴容,把每台老裝置上一半的資料遷移到新裝置上,原來號段為[1, 10000]的裝置,擴容後只保留號段[1, 5000]的資料,把號段為[5001, 10000]的資料遷移到一台新增的裝置上。此方法的缺點是資料可能分布不均勻,如小號段資料量可能比大號段的資料量要大,同樣的各個號段的熱度也可能不一樣,導致各個裝置的負載不均衡;並且擴容也不夠靈活,只能成倍地增加裝置。

取模。這種方法先計算key的雜湊值,再對裝置數量取模(整型的key也可直接用key取模),假設有n臺裝置,編號為0~n-1,通過hash(key)%n就可以確定資料所在的裝置編號。這種方法實現也非常簡單,資料分布和負載也會比較均勻,可以新增任何數量的裝置來擴容。主要的問題是擴容的時候,會產生大量的資料遷移,比如從n臺裝置擴容到n+1臺,絕大部分的資料都要在裝置間進行遷移。

檢索表。在檢索表中儲存key和裝置的對映關係,通過查詢檢索表就可以確定資料分布,這裡的檢索表也可以比較靈活,可以對每個key都儲存對映關係,也可結合號段劃分等方法來減小檢索表的容量。這樣可以做到資料均勻分布、負載均衡和擴縮容資料遷移量少。缺點是需要儲存檢索表的空間可能比較大,並且為了保證擴縮容引起的資料遷移量比較少,確定對映關係的演算法也比較複雜。

一致性雜湊。一致性雜湊演算法(consistent hashing)在2023年由麻省理工學院提出的一種分布式雜湊(dht)實現演算法,設計目標是為了解決網際網路中的熱點(hot spot)問題,該方法的詳細介紹參考此處一致性雜湊的演算法簡單而巧妙,很容易做到資料均分布,其單調性也保證了擴縮容的資料遷移是比較少的。

通過上面的對比,在這個系統選擇一致性雜湊的方法來進行資料分片。

為了讓系統有更好的擴充套件性,這裡提出儲存層vserver(虛擬伺服器)的概念,乙個vserver是乙個邏輯上的儲存伺服器,是分布式儲存系統的乙個儲存單元,一台物理裝置上可以部署多個vserver,乙個vserver支援乙個寫程序和多個讀程序。

通過vserver的方式,會有下面一些好處:

提高單機效能。為了不引入複雜的鎖機制,採用了單寫程序的設計,如果單機只有乙個寫程序,寫併發能力會受到限制,通過vserver方式把單機上的儲存資源(記憶體、硬碟)劃分為多個儲存單元,這樣就支援多個寫程序同時工作,大大提公升單機寫併發能力。

部署擴充套件性更好。vserver的方式在部署上非常靈活,可以根據單機的資源情況來確定vserver的數量,針對不同的機型配置不同的vserver數量,這樣不同的機型都能充分利用機器上的資源,即使在乙個系統中使用多種機型,也能做到機器的負載比較均衡。

資料分片是在介面層實現的,目的是把資料均勻地劃分到不同的vserver上。有了介面層的存在,邏輯層定址就輕量了很多,定址儲存層vserver的工作全部由介面層負責,邏輯層只需要隨機選乙個介面層機器訪問即可。

介面層使用了一致性雜湊的割環演算法來實現資料分片,在割環演算法中,為了讓資料均勻分布到各個vserver,每個vserver需要有多個vnode(虛擬節點)。乙個key定址的過程如下圖所示,首先根據hash(key)在雜湊環上找到對應的vnode,在根據vnode和vserver的對映表確定所屬的vserver。

由上述查詢過程可知,需要事先離線計算出vnode在雜湊環上的分布、vserver和vnode對映關係。為了是計算結果具有通用性,即在擁有任何數量vserver的乙個系統都可以使用該結果得到一致性雜湊的對映表,這就要求結果是與機器無關的,比如不能使用ip來計算vnode的雜湊值。在計算前需要確定每個vserver包含的vnode數量,以及乙個系統所支援的最大vserver數量。乙個簡單的方法是類似上文鏈結中提到的方法,但不能和ip相關,可以改用vserver和vnode的編號來計算雜湊值,如hash("1#1"),hash("1#2")… 這種方法要求乙個vserver包含的vnode的數量比較多,大概需要500個才能使各個vserver上的資料比較均勻。當然還有其他的一些方法做到乙個vserver上包含更少的vnode數量,並且讓資料分布偏差在一定範圍內。

google提出了一種新的一致性雜湊演算法jump consistent hash,此演算法零記憶體消耗,均勻分配,快速,並且只有5行**,優勢非常明顯,詳細介紹見此處和上面介紹的方法相比,乙個最大的不同點是,在擴容重新分布資料時,在上面的方法中,新機器的乙個vnode上的資料只會來自乙個老機器上的vnode,而這種方法是會來自所有老機器上的vnode。這個問題可能會導致一些設計上複雜化,所以使用的時候要慎重考慮。

分布式 分布式系統的設計

在計算機領域,當單機效能達到瓶頸時,一般有兩種方式解決效能問題 而分布式系統的設計說白了就是 如何合理將乙個系統拆分成多個子系統部署到不同機器上。講設計方法前,先介紹分布式系統的特性 1 分布性 空間中隨機分布。這些計算機可以分布在不同的機房,不同的城市,甚至不同的國家。2 對等性 分布式系統中的計...

python分布式儲存系統 分布式系統

danger 什麼是分布式系統 分布式系統是由一組通過網路進行通訊 為了完成共同的任務而協調工作的計算機節點組成的系統。分布式系統的出現是為了用廉價的 普通的機器完成單個計算機無法完成的計算 儲存任務。其目的是利用更多的機器,處理更多的資料。首先需要明確的是,只有當單個節點的處理能力無法滿足日益增長...

分布式儲存系統設計(3) 儲存結構

在nosql儲存系統中,一般都採用key value的資料型別,key value結構簡單,易於儲存,非常適合分布式nosql儲存系統。但簡單的資料型別對業務儲存的資料就有一定的侷限性,比如需要儲存列表型別的資料。針對這個問題,系統對key value型別的資料做了一些擴充套件,支援在乙個key下儲...