Partition
)什麼是分區?node
分區主要是爲了可擴展性。不一樣的分區能夠放在不共享集羣中的不一樣節點上mysql
爲何要分區?sql
水平切分經常使用於分佈式系統數據庫
垂直切分經常使用於DBMS
bash
分區partition
在不一樣數據庫有不一樣的稱謂數據結構
Shard
[分片] MongoDB
,Elasticsearch
Region
[區域] HBase
tablet
[表塊] BigTable
vnode
[虛節點] Cassandra
,Riak
分區一般與複製結合使用,使得每一個分區的副本存儲在多個節點上。 這意味着,即便每條記錄屬於一個分區,它仍然能夠存儲在多個不一樣的節點上以得到容錯能力。 併發
分區目標是將數據和查詢負載均勻分佈在各個節點上。若是每一個節點均勻分享數據和負載,那麼理論上10個節點應該可以處理10倍的數據量和10倍的單個節點的讀寫吞吐量。負載均衡
skew
&hot spot
skew
:一些分區比其餘分區有更多的數據或查詢,咱們稱之爲偏斜hot spot
:不均衡致使的高負載的分區被稱爲熱點一種分區的方法是爲每一個分區指定一塊連續的鍵範圍(從最小值到最大值)分佈式
拿mysql range partition
爲例,建立一個employees
表微服務
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN (21)
);
複製代碼
能夠看到store_id
= 1~5被分到p0
分區,6-11被分到p2
分區,而後依次類推
range partition
的優缺點
load skew
hash partition
哈希散列
Map the (skewed) range of keys to a uniformly distributed range of hashes
上篇文章已經介紹過一致性hash
的內容了,再也不贅述。
基於文檔的分區(document-based
)和基於關鍵詞(term-based
)的分區。
local index
Every partition manages its own index with all pointers to local data items
適用於OnLine Transaction Processing(聯機事務處理過程)
global index
Index entries are partitioned by their key independently from local data items
適用於OnLine Analytical Processing(分析處理過程)
Things change:
hash mod N
若是n
改變了,那麼對於mod n
的數值也會隨着變動 好比:
123456 % 10 = 6, 123456 % 11 = 3, 123456 % 12 = 0,
若是一個節點被添加到集羣中,新節點能夠從當前每一個節點中竊取一些分區,直到分區再次公平分配
相似於B
樹數據結構
如今咱們已經將數據集分割到多個機器上運行的多個節點上。可是仍然存在一個未解決的問題。當客戶端想要發出請求時,如何知道要鏈接哪一個節點?隨着分區從新平衡,分區對節點的分配也發生變化。
這個問題能夠歸納爲 服務發現(service discovery
)
Round-Robin Load Balancer
)若是節點剛好有請求的分區,則直接處理,不然轉發到適當的節點許多分佈式數據系統都依賴於一個獨立的協調服務,好比ZooKeeper
來跟蹤集羣元數據。每一個節點在ZooKeeper
中註冊本身,ZooKeeper
維護分區到節點的可靠映射。
Cassandra
和Riak
採起不一樣的方法:他們在節點之間使用流言協議(gossip protocol
) 來傳播羣集狀態的變化。請求能夠發送到任意節點,該節點會轉發到包含所請求的分區的適當節點