同步複製 -> 強一致性, 弱可用性 一旦某個從節點宕機則寫失敗
解決方案:一個從節點同步複製,其餘異步複製,一旦同步節點宕機提高一個異步節點爲同步節點
新強一致性複製算法: chain replication 算法
異步複製 -> 強可用性,弱一致性 安全
增長從節點:
挑戰:主節點數據仍在寫入,直接複製會致使數據不一致
方案:
複製數據時鎖主節點不容許寫 ,太粗暴
更好的方案分3步: 服務器
從節點宕機恢復:
從宕機前複製日誌位置開始追趕 網絡
主節點宕機 -> FAILOVER 機制
比較複雜,通常須要3步:併發
複製日誌實現:less
複製延時的問題:
最終一致性: 以較弱的一致性換取讀的可擴展性
一致性多弱取決於複製延時和讀取策略dom
read-your-own-write-consistency (read-after-write consistency): 確保本身寫入的數據必定會被隨後的讀請求讀到
實現方式:
若是用戶只修改自身的數據並知道自身數據的ID, 自身數據從主節點讀,其餘數據從隨機節點讀
若是用戶能夠修改許多其餘的數據,須要客戶端記錄 key -> last modify time. 在必定時間範圍內只從主節點讀, 不然從隨機節點讀. 或者客戶端把 key+last modify time 發給查詢節點, 查詢節點比較時間戳,等待遇上再返回結果或者將讀請求
多數據中心: 路由讀請求到同一數據中心異步
monotonic read: 確保第二次讀結果不會比第一次舊
實現方式:
對同一主鍵每次讀從同一副本(可能出現數據傾斜)分佈式
經過分佈式事務解決複製延時問題.ide
支持多點寫入
每一個LEADER對於另外一個LEADER是FOLLOWER
主要應用場景是多數據中心
每一個數據中心有一個LEADER, 數據從LEADER複製到本數據中心的FOLLOWER和另外一個數據中心的LEADER.
性能:寫請求可由LOCAL 數據中心的LEADER處理. 不用跨廣域網
數據中心容錯: 一個數據中心宕機後另外一個數據中心仍可獨立運行,數據中心恢復後再將數據複製過去
網絡容錯:跨廣域網異步複製,暫時網絡不穩定不會影響寫入
缺點:必須解決寫衝突
設計時必須考慮自增主鍵衝突. TRIGGER, 數據完整性約束等
寫衝突檢測和解決
解決衝突的時機:
寫時:一旦衝突發生,只能後臺解決沒法讓用戶干預 (Bucardo)
讀時: 保存衝突數據,在下次讀的時候自動解決或提示用戶(CouchDB)
事務中的每一個寫衝突會單獨解決,沒法保持事務邊界
自動衝突解決:
Conflict free replicated data types
Mergeable persistent data structures (GIT)
Operational transformation
多主複製拓撲:(超過兩個MASTER)
星狀
環狀
全部對全部
須要防止循環複製(寫請求記錄通過的節點編號)
星狀或者環狀複製某個節點宕機會致使不可寫
全部對全部 容易因延遲致使數據一致性問題或寫失敗
沒有副本概念,客戶端直接寫多個節點
多數節點響應寫請求則成功
讀請求也發送到多個節點,版本號保證讀取最新的數據
保證: 寫成功節點數(W) + 讀節點數(R) > 集羣節點數(N)
讀寫並行發往全部節點, W, R 爲響應的節點數量
若是 W + R < N 犧牲一致性換取低延時和高可用性
通常選擇 W > N/2, R > N/2,允許最多N/2 節點宕機
W + R > N 依然有可能讀到舊數據:
監控數據陳舊程度很困難, 沒法像主從複製同樣監控REPLICATION LAG. 寫順序不肯定
Sloppy quorum: 部分節點宕機致使沒法寫入一般寫入的節點(讀寫遷移)
Hinted handoff: 節點恢復後讀寫遷移的節點將臨時寫入數據寫回一般寫入節點
Sloppy quorum 提升了可用性可是下降了讀到最新數據的可能
無主複製也適合多數據中心的場景: 寫請求發送多數據中心但只等待本數據中心確認
保證宕機節點最終一致性:
Read repair: 客戶端發現讀版本衝突自動更新版本比較舊的節點
Anti-entropy process: 後臺進程自動比較數據版本並修復 (不一致時間長)
寫衝突可能發生在如下狀況:
寫衝突處理: