常
用的資料結構包括:陣列,佇列,堆疊,鍊錶,樹(平衡二叉樹,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級別。
分布式系統的資料結構
常用的資料結構包括 陣列,佇列,堆疊,鍊錶,樹 平衡二叉樹,b樹,trie樹,堆 雜湊表,圖,字尾陣列,等等。其中,堆,圖結構,trie樹及字尾陣列解決特定問題,其它資料結構解決通用的查詢,更新,刪除操作。查詢,更新和刪除操作一般是o 1 o logn 或者o n 通用的資料結果大致可分為如下三種 ...
分布式 分布式系統的設計
在計算機領域,當單機效能達到瓶頸時,一般有兩種方式解決效能問題 而分布式系統的設計說白了就是 如何合理將乙個系統拆分成多個子系統部署到不同機器上。講設計方法前,先介紹分布式系統的特性 1 分布性 空間中隨機分布。這些計算機可以分布在不同的機房,不同的城市,甚至不同的國家。2 對等性 分布式系統中的計...
分布式系統 資料分布方式
分布式系統如何拆解輸入資料,將資料分發到不同的機器中。下面將介紹幾種不同的資料分布方式。color red b 一 雜湊方式 b color 雜湊方式是最常見的資料分布方式,其方法是按照資料的某一特徵計算雜湊值,並將雜湊值與機器中的機器建立對映關係,從而將不同雜湊值的資料分布到不同的機器上。所謂資料...