複製、分片和路由

分佈式理論系列算法

本文主要講述分佈式nosql的兩大特性:複製和分片。傳統數據庫採用縱向Scale Up的方式,即改善單機硬件資源配置來解決問題;主流大數據存儲與計算系統採用橫向Scale Out的方式,支持系統可擴展性,即經過增長機器來得到水平擴展能力。nosql

對於海量數據,經過數據分片(shard/partition)來說數據進行切分並分配到各個機器中去,數據分片後,如何可以找到某條記錄的存儲位置就成爲必然要解決的問題,這通常稱爲數據路由(Routing)。分佈式

對於海量數據,經過數據分片實現系統的水平擴展,經過數據複製保證數據的高可用性。函數

數據複製除了可保證可用性以外,還能夠增長讀操做的效率,即客戶端能夠從多個備份數據中選擇物理距離較近的進行讀取,這既增長了讀操做的併發性又能夠提升單次讀的讀取效率。

分片與複製能夠組合,即同時採用主從複製與分片,則系統有多個節點,對每項數據來講,負責它的主節點只有一個。

聚合

NoSQL本質上是面向聚合操做的,也就是它將一組相互關聯的對象視爲一個總體單元來操做,這個單元就叫作聚合。

聚合是相對於元組來講的,元組不能在元組中嵌套另一個元組,也不能包含由值或元組組成的列表,這是傳統關係型數據庫的規範。其優點是在於消除數據的冗餘和一致性。可是對於join操做,複雜了的話,就很無能爲力。

聚合的話,一方面是能夠很方面的解決join操做問題的,可是其弱點是對於檢索記錄(不按聚合維度檢索),稍微欠缺。

數據分佈的兩條路徑

一、複製(replication):將同一份數據拷貝到多個節點(主從master-slave方式、對等式peer-to-peer)
二、分片(sharding):將不一樣數據存放在不一樣節點

若是想增長系統的讀取性能,複製,增長slave節點便可;
若是想提高寫入性能,則對數據進行分片。

分片

通常來講,數據庫的繁忙體如今:不一樣用戶須要訪問數據集中的不一樣部分,這種狀況下,咱們把數據的各個部分存放在不一樣的服務器/節點中,每一個服務器/節點負責自身數據的讀取與寫入操做,以此實現橫向擴展,這種技術成爲分片,即sharding。

理想狀況下,不一樣的節點服務於不一樣的用戶,每一個用戶只須要與一個節點通訊,而且很快就能得到服務器的響應。固然理想狀況比較罕見,爲了得到近乎理想的效果,必須保證須要同時訪問的那些數據都存放在同一個節點上,並且節點必須排布好這些數據塊,使得訪問速度最優。

爲此,必須考慮:

  • 1)怎樣存放數據,才能保證用戶基本上只須要從一個節點獲取它。若是使用的是面向聚合的數據庫而非面向元組的數據庫,那麼就很是容易解決了。之因此設計聚合這一結構,就是爲了把那些常常須要同時訪問的數據存放在一塊兒。所以,能夠把聚合做爲分佈數據的單元。

  • 2)另外還要考慮的是:如何保持負載均衡。即如何把聚合數據均勻地分佈在各個節點中,讓它們須要處理的負載量相等。負載分佈狀況可能隨着時間變化,所以須要一些領域特定的規則。好比有的須要按字典順序,有的須要按逆域名序列等。

不少NoSQL都提供自動分片(auto-sharding)功能,可讓數據庫本身負責把數據分佈到各個分片,而且將數據訪問請求引導到適當的分片上。

分片能夠極大地提升讀取性能,但對於要頻繁寫的應用,幫助不大。另外,分片對改善故障恢復能力並無幫助,可是它減小了故障範圍,只有訪問這個節點的那些用戶纔會受影響,其他用戶能夠正常訪問。雖然數據庫缺失了一部分,可是仍是其他部分仍是能夠正常運轉。

路由

路由的兩級映射抽象模型

1)Key-Partition映射,數據記錄到分片的映射(多對一)
2)Partition-Machine映射,分片到物理機器的映射(多對一)

分片類型:

1)哈希分片,點查詢,採用哈希函數創建Key-Partition映射(大多數KV數據庫都支持此方式)

經過哈希函數來進行數據分片,主要有Round Robbin、虛擬桶、一致性哈希三種算法。

  • A、Round Robbin
    俗稱哈希取模算法,H(key) = hash(key) mode K(其中對物理機進行從0到K-1編號,key爲某個記錄的主鍵,H(key)爲存儲該數據的物理機編號)。好處是簡單,缺點是增減機器要從新hash,缺少靈活性。它其實是將物理機和數據分片兩個功能點合二爲一了,於是缺少靈活性。

  • B、虛擬桶
    membase在待存儲記錄和物理機之間引入了虛擬桶,造成兩級映射。其中key-partition映射採用哈希函數,partition-machine採用表格管理實現。新加入機器時,只須要將原來一些虛擬桶劃分給新的機器,只要修改partition-machine映射便可,具備靈活性。

  • C、一致性哈希
    一致性哈希是分佈式哈希表的一種實現算法,將哈希數值空間按照大小組成一個首尾相接的環狀序列,對於每臺機器,能夠根據IP和端口號通過哈希函數映射到哈希數值空間內。經過有向環順序查找或路由表(Finger Table)來查找。對於一致性哈希可能形成的各個節點負載不均衡的狀況,能夠採用虛擬節點的方式來解決。一個物理機節點虛擬成若干虛擬節點,映射到環狀結構的不一樣位置。

2)範圍分片,範圍查詢,BigTable、Azure採用此方式,也能夠支持點查詢

複製

主從複製

master-slave模式,其中有個master節點,存放權威數據,一般負責數據的更新,其他節點都叫作slave節點,複製操做就是讓slave節點的數據與master節點的數據同步。
好處是:
1)在須要頻繁讀取的狀況下,有助於提高數據的訪問(讀取從庫分擔壓力),還能夠增長多個slave節點進行水平擴展,同時處理更多的讀取請求,可是對於寫操做頻繁的場景,則沒有什麼幫助
2)能夠加強讀取操做的故障恢復能力。萬一一個slave出故障,還有其餘slave支撐訪問。

問題:
數據一致性,若是數據更新沒有所有通知到slave節點,則會致使數據不一致。

對等複製

主從複製有助於加強讀取操做的故障恢復能力,然而對寫操做沒有幫助。它所提供的故障恢復能力,只有在從節點出錯時才能體現出來,master仍然是系統的瓶頸和弱點。

對等複製,是指兩個節點相互爲各自的副本,也同時能夠接受寫入請求,丟失其中一個不影響整個數據庫的訪問。

可是,同時接受寫入請求,容易出現數據不一致問題,實際使用上,一般是隻有一個節點接受寫入請求,另外一個master做爲stand-by,在對方掛掉的時候自動承接寫操做請求,獨當一面。

參考

相關文章
相關標籤/搜索