文章目錄
一、單機的一致性
問題
數據庫讀寫速度受單機硬件的影響,硬盤的性能時影響讀寫的重要因素。
解決方案
- 縱向擴展
提高單機的物理配置 - 橫向擴展
添加更多的結點,節點之間用告訴網絡連接,當需要更高的性能或更大的容量時,可迅速想集羣中添加結點,而不會導致任何宕機。
二、計算平臺分類
Flynn於 1972年提出了基於分而治之的思想的計算平臺的Flynn分類法,主要根據數據流來分類,共分爲四種類型的計算平臺。
- SISD:單指令流單數據流
- SIMD: 單指令流多數據流
- MISD:多指令流多數據流
- MIMD:多指令流多數據流
以下內容即爲水平擴展的方法。
三、集羣
-
集羣是緊密耦合的一些服務器或節點。這些服務器通過高速網絡連接在一起作爲一個工作單元。
-
集羣中每個節點都有自己的專屬資源: CPU、內存和硬盤
-
通過將任務分解成若干個小任務分配給集羣中的節點服務器上,協同完成任務
四、 I/O並行
-
通過在多個節點(計算機)上對多個磁盤上的數據集進行分區,減少從磁盤檢索數據所需的時間,主要兩種形式
1)跨節點並行
2)一個節點跨磁盤並行 -
水平分區一數據記錄被劃 分在多個節點上,即每個節點上存儲一個數據子集
1)垂直分區:例如r(A,B,C,D),主鍵爲A, 劃分爲r1(A,B)和r2(A,C,D)
2)默認是水平分區
I/O並行技術(設節點數爲n):
-
輪詢方法(Round-robin) :
第i條記錄存儲到的節點爲imod n. -
Hash分區:
選擇一個或多個屬性作爲分區屬性.
選擇取值範圍爲0…n-1的哈希函數h
設i爲哈希函數h應用於記錄屬性的計算結果,然後將記錄存儲在節點i -
範圍分區:
選擇分區的屬性.
選定分區向量vector [vo,v1 …]
設v是一條記錄分區屬性的值,那麼1≤V1的記錄分配到節點i+1; V< Vo的記錄分配到節點0;V≥Vn2的記錄分配到節點n-1.
五、分片
水平的將大的數據集劃分爲較小的,易於管理的數據集的過程,數據切成碎片。
- 每個碎片可以獨立地爲所負責的數據提供讀寫的服務
- 某個查詢的數據可能來自兩個碎片
- 數據分片要考慮查詢模式以便碎片本身不會稱爲性能瓶頸
六、複製
多個結點上存儲數據集的多個拷貝,稱作副本。
相同的數據在不同的結點上存在多個副本,提供了可伸縮性,可用性和容錯性
複製實現方法
- 主從複製
- 對等複製
主從複製
-
系統配置是主從配置環境
-
所有數據寫入主節點,持久化後複製到多個從節點。
-
數據的寫(增刪改)操作訪問主節點的數據,讀(查詢)操作訪問任意節點。
-
適用於讀密集型應用
-
需要考慮讀一致性的問題
主要解決方法有:
1)投票機制:大多數從節點包含相同版本的記錄,則聲明讀操作是一致的
2)實現投票機制需要從節點之間建立可靠、快速的溝通機制
對等複製
-
節點之間不分主從,每個節點是對等的,每個寫操作數據複製到所有對等的節點上。
-
每個節點都可以處理讀請求和寫請求。
-
對等複製容易導致寫不一致問題:同時更新多個節點的同一個數據
1)悲觀併發策略:基於鎖機制
2) 樂觀併發策略:不用鎖,最終一致性 -
讀不一致性問題
投票機制
七、數據分佈傾斜(Data-Distribution skew)
-
一些節點擁有較多記錄,而其他節點則擁有的記錄數很少。
-
.數據分佈傾斜類型
1)屬性-值傾斜
➢一些分區屬性值出現在多個記錄中
➢分區屬性值相同的所有記錄最終都在同一個分區中
➢範圍分區和hash分區都會出現這個問題.
2)分區傾斜
➢選擇不當的範圍分區向量可能會將太多記錄分配給某些分區,而將太少記錄分配給其
3)執行傾斜
➢某些運算符運行的時間比其他運算符長,執行時間的差異可能會導致一些處理器空閒,而其他處理器仍然計算查詢的一部分。
處理範圍中分區傾斜
- 創建平衡的分區向量
1)基於分區屬性對數據進行排序
2)按照如下順序掃描數據來構造分區向量
➢每讀取1/n的數據之後,下一個記錄的分區屬性值被添加到分區向量中(n表示分區數量)
3)如果分區屬性中存在重複項,則可能導致不平衡. - 減少代價
➢分區向量可以使用記錄的隨機樣本創建
➢另外一種方法:採用直方圖(histograms) 建立分區向量
八、 虛擬結點分區
核心思想:假設虛擬節點的數量是實際節點倍數
-
虛擬節點映射到真實節點
-
使用範圍分區向量跨虛擬節點劃分記錄
➢Hash分區也可以用 -
虛擬節點映射到真實節點
1)輪詢:虛擬節點i映射到真實節點(imod n)+1
2)映射表:映射表virtual to_ real map[]記錄哪一個虛擬節點在哪一個真實節點上
➢允許通過將虛擬節點從加載較多的節點移動到加載較少的節點來處理傾斜
➢解決了數據傾斜和執行傾斜
九、一致性HASH
1997年由MIT的Karger等人在解決分佈式Cache中提出。
場景: 假設有N個Cache, 如何將數據對象映射到N個Cache?
-> Hash (object) % N
如果Cache m壞了,則所有映射到cachem的對象會失效
-> Hash (object) % (N-1)
如果訪問負載增加,需要添加cache
->Hash (object) % (N+1)
如果硬件能力增強,希望增加的節點承擔更多的負載,普通hash算法難以實現
算法原理
-
環形空間:共有2^32個bucket空間,首尾相接形成環
-
數據映射到環形hash空間
-
使用相同的hash函數將結點(cache/server)映射到hash空間,通常用結點的ip
-
將數據映射到結點
沿順時針方向,根據數據對象的key,遇到第一個cache/server就將數據存入其中。 -
如果某節點server宕機
按順時針遷移的規則,opject2遷移至object3,其他不變
-
如果增加新服務器
按順時針遷移規則,object4被遷移到server4中,其他不變。
引入虛擬結點的一致性hash
節點分佈不均勻,出現Skew問題
設虛擬節點個數爲4
Server11, Server12, server31, server32數據對象Object到虛擬節點的對應關係Object1→server12;
Object2 > server32
Object3 >server31
Object4 > server11
虛擬節點的hash計算採用對應節點的IP地址;數字後綴的方式
➢例如,Server1 的IP地址爲202.168.110.241
Hash (“202.168.110.241#1" ),
Hash (“202.168.110.241#2” )