聊聊partition的方式

2021-09-14 05:49:09 字數 3732 閱讀 1061

本文主要聊一下開源主流產品的partition方式。

一般來說,資料庫的繁忙體現在:不同使用者需要訪問資料集中的不同部分,這種情況下,我們把資料的各個部分存放在不同的伺服器/節點中,每個伺服器/節點負責自身資料的讀取與寫入操作,以此實現橫向擴充套件,這種技術成為分片,即sharding。

理想情況下,不同的節點服務於不同的使用者,每個使用者只需要與乙個節點通訊,並且很快就能獲得伺服器的響應。當然理想情況比較罕見,為了獲得近乎理想的效果,必須保證需要同時訪問的那些資料都存放在同乙個節點上,而且節點必須排布好這些資料塊,使得訪問速度最優。

分片可以極大地提高讀取效能,但對於要頻繁寫的應用,幫助不大。另外,分片對改善故障恢復能力並沒有幫助,但是它減少了故障範圍,只有訪問這個節點的那些使用者才會受影響,其餘使用者可以正常訪問。雖然資料缺失了一部分,但是還是其餘部分還是可以正常運轉。

怎樣存放資料,才能保證使用者基本上只需要從乙個節點獲取它。如果使用的是面向聚合的資料庫而非面向元組的資料庫,那麼就非常容易解決了。之所以設計聚合這一結構,就是為了把那些經常需要同時訪問的資料存放在一起。因此,可以把聚合作為分布資料的單元。

另外還要考慮的是:如何保持負載均衡。即如何把聚合資料均勻地分布在各個節點中,讓它們需要處理的負載量相等。負載分布情況可能隨著時間變化,因此需要一些領域特定的規則。比如有的需要按字典順序,有的需要按逆網域名稱序列等。

很多nosql都提供自動分片(auto-sharding)功能,可以讓資料庫自己負責把資料分布到各個分片,並且將資料訪問請求引導到適當的分片上。

在動態增減機器或partition的情況下,如果重新rebalance,使資料分布均勻或者避免熱點訪問

這裡主要分為兩大類,一類是雜湊分片(hash based partitionning),一類是範圍分片(range based partitioning)

通過雜湊函式來進行資料分片,主要有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)來查詢。對於一致性雜湊可能造成的各個節點負載不均衡的情況,可以採用虛擬節點的方式來解決。乙個物理機節點虛擬成若干虛擬節點,對映到環狀結構的不同位置。

雜湊分片的好處是可以使資料均勻分布,但是可能造成資料無序不方便range

mongo2.4版本+支援hash partition

這個是根據key排序來分布的,比如字典按24個首字母來分,這個的好處是方便range,但是容易造成資料分布不均勻以及熱點訪問問題(比如個別節點的資料訪問量/查詢/計算量大,造成負載特別高)。

bigtable,hbase、2.4版本之前的mongo都使用此方式。

除了資料本身要分片外,索引也需要分片。比較著名的兩個反向索引分片策略就是document-based partitioning以及term-based partitioning。然後再此兩個基本的策略之上衍生出了hybrid的方案。

也稱作document-based partitioning.在每個partition本地維護乙份關於本地資料的反向索引。這種方式的話,主要使用的是scatter/gather模式,即每次查詢需要傳送請求給所有的partition,然後每個partition根據本地的索引檢索返回,之後彙總得出結果。

mongo,cassandra,es,solr採用此方案

也稱作term-based partitioning,這種方式的話,建立的索引不是基於partition的部分資料,而是基於所有資料來索引的。只不過這些全域性索引使用range-based partitioning的方式再分布到各個節點上。

dynamodb,riak支援此方案

當partition所在節點壞掉,或者新增機器的時候,這個時候就涉及到partition的rebalance。原來本應該請求這個node的,現在都需要轉移請求另外乙個node的過程叫做rebalancing。

即key-machine的直接對映,這個的缺點就是:增減機器要重新hash,缺乏靈活性。

為了提公升直接雜湊的靈活性,引入了兩級對映,即key-partition,partition-matchine/node這樣兩級,通過partition來解耦key跟machine/node的關聯。對於新加入機器時,只需要將原來各個node的一些partition劃分給新的機器,只要修改partition-machine對映即可,具有靈活性。

elasticsearch採用此方案,在建立索引的時候需指定shard/partition數目以及replication的數目

couchbase引入了vbucket的概念在這裡可以理解為虛擬的paritition。

partition的數目是動態變化的,根據設定的partition大小的閾值,來進行動態的**或合併。

hbase採用的就是這種方式

一致性雜湊與前兩者有些不同,因為該演算法把machine/node也一起進行了hash,然後與key的雜湊值一起進行區間匹配,來確定key落在哪個machine/node上面。分布式快取用到的比較多,比如redis就是用了一致性雜湊。

具體如下:

不過引入虛擬節點也會有問題,當新增machine的時候,也就相當於新增多個vnode分散到環上,但是這樣子就會造成更多的範圍的key需要rebalance。

1、提公升單調性(通過環形演算法減少增減節點時cache的遷移成本) 2、提公升平衡性(通過虛擬節點,盡可能減少節點增減帶來的cache分布不均勻問題)

產品

partition方式

索引分片策略

redis

一致性雜湊

-elasticsearch

固定partition兩級對映

local index

mongo

2.4版本之前是範圍分片,2.4+支援hash分片

local index

kafka

固定partition

-

kafka的key到partition的對映高版本支援自定義策略,如果cluster增減node,對之前建立的topic不生效,需要呼叫reassign-partitions重新分布,避免熱點

聊聊replication的方式

本文主要聊一聊主流開源產品的replication方式。replication和partition sharding是分布式系統必備的兩種能力。具體詳見複製 分片和路由.對於海量資料來說,replication一方面可以增加冗餘,保證系統可用性,一方面還可以提公升讀取的效率。本文主要聚焦於repli...

聊聊replication的方式

本文主要聊一聊主流開源產品的replication方式。replication和partition sharding是分布式系統必備的兩種能力。具體詳見複製 分片和路由.對於海量資料來說,replication一方面可以增加冗餘,保證系統可用性,一方面還可以提公升讀取的效率。本文主要聚焦於repli...

PARTITION 2000實現方式

drop table test create table test id int,groupname varchar 20 name varchar 20 gage int insert into test select 1,中國 劉德華 34union select 2,越南 周杰倫 3union...