大多數分佈式存儲系統要麼實現一個分佈式Hash表,要麼實現分佈式B+樹

突然很想知道NoSQL到底是什麼的時候,在網上搜到了這麼一篇帖子,感覺介紹的很不錯,轉過來學一下。裏面又提到了一個Log-Structured Hash Table概念,以後深入挖掘一下。

http://zhan.renren.com/nosqlgroup?tagId=168636&checked=true

分佈式系統的數據結構

常用的數據結構包括:數組,隊列,堆棧,鏈表,樹(平衡二叉樹,B樹,Trie樹,堆),哈希表,圖,後綴數組,等等。其中,堆,圖結構,Trie樹及後綴數組解決特定問題,其它數據結構解決通用的查找,更新,刪除操作。

查找,更新和刪除操作一般是O(1),O(logN)或者O(N),通用的數據結果大致可分爲如下三種:

1, 極端型;某些操作的算法複雜度爲O(1),另外一些算法複雜度爲O(N),比如有序鏈表查找複雜度爲O(N),更新和刪除爲O(1);

2, 平衡型:主要操作的複雜度爲O(logN),比如平衡二叉樹及各種變種,B樹的查找,更新和刪除操作的複雜度都爲O(logN);

3, 取巧型:主要指哈希表,最差情況下的算法複雜度雖然很高,但是隻要hash函數計算hash值比較隨機,插入、更新和刪除操作都可以在常數時間內完成,當然,有所得必有所失,哈希數據結構犧牲的是範圍查詢功能;

 

雖然數據結構很多,然後當數據量變大時,比如達到百萬級別或者千萬級別時,工程實踐中常見的數據結構一般有兩種:Hash表與平衡樹,平衡樹主要使用B樹,這時因爲B樹同時適應磁盤和內存。Hash數據結構實現簡單,高效,可以高效地執行根據主鍵的插入、刪除以及查找操作,當然,相比B樹,Hash數據結構也有一些弊端,比如不支持範圍查詢,不支持對整個數據數據執行瞬時的快照操作。分佈式存儲系統從本質上就是實現分佈式Hash表或者分佈式B+樹。

普通的Key-Value系統可以認爲是一個分佈式Hash表。Hash算法有兩種,模N(N爲機器數)Hash或者一致性Hash。其中,模N哈希的主要問題在於機器上下線時機器數變化導致所有的數據都需要重新分佈,而一致性Hash用來解決這個問題。先將數據通過Hash算法分成若干個桶,每臺工作機服務這些桶中的數據。由於採用Hash算法數據分佈天然比較均勻,不需要考慮多個桶之間的數據動態調整,大大降低了系統設計的複雜度。假如採用一致性Hash分桶,每個桶內使用Log-Structured Hash Table存儲數據,系統的數據結構如下:

1, Hash空間組織成一個環,環上相鄰節點包含的數據構成一個桶;比如Hash空間爲A, B, C,那麼有(A, B], (B, C], 以及(C, A]三個桶;

2, 每個桶內的數據結構爲Log-Structured Hash Table;當然,可根據需要修改每個桶的單機數據結構;

3, 桶是負載均衡和任務調度的基本單元;

4, 每個桶存放3個副本;

類似Bigtable這種同時支持隨機讀取和順序掃描的系統實現了分佈式B+樹數據結構。B+樹按照順序將數據劃分爲一個一個的桶(對應Bigtable的子表),順序劃分可能分佈不均勻,需要動態調整,這就是爲什麼Bigtable這樣的系統往往有複雜的子表分裂和合並操作。Bigtable採用兩級的B+樹結構組織,每個子表相當於B+樹的一個葉子節點。數據結構如下:

1, 每個表按照主鍵(row key)組成一個B+樹,主鍵是binary string;

2, 一個葉子節點包含表的一個前開後閉的主鍵範圍(prev_end_key, end_key];

3, 每個葉子節點內部按照更小的主鍵範圍劃分爲多個塊(block)並內建塊索引(block index);

4, 每個塊的大小通常在8KB~64KB之間並內建行索引;

5, 數據壓縮以塊爲單位,壓縮算法由用戶指定;

6, 葉子節點可能合併或者分裂;

7, 葉子節點是負載均衡和任務調度的基本單元;

8, 葉子節點存放3個副本;

總之,大多數分佈式存儲系統要麼實現一個分佈式Hash表,要麼實現分佈式B+樹,對應的存儲引擎分別爲前面博文中提到的隨機讀取存儲引擎和Merge-dump存儲引擎。分佈式Hash存儲系統由於只支持隨機讀取,一般用選擇相對較好的磁盤,分佈式B+樹存儲系統同時支持隨機讀取和順序掃描,當用來支持使用模式主要爲順序掃描的應用時,可以選擇相對較差的磁盤,比如SATA盤。

另外,我們都知道,關係型數據庫系統的存儲引擎基本都是一顆B樹結構,然而在NOSQL系統中存儲引擎可能是Log-Structured Hash Table或者Merge-dump存儲引擎,很重要的一個原因是NOSQL系統的存儲引擎只需要存儲分佈式Hash表的一個桶或者分佈式B+樹的一個葉子,而每個桶或者每個葉子服務的數據量往往也只有百MB級別。


發佈了81 篇原創文章 · 獲贊 7 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章