Open JimmyFUFU opened 2 years ago
分區與複製
鍵值資料的分區
分區不良可能造成的問題?熱點、偏斜
3種分區方法
負載偏斜與熱點消除
次級索引分區方法
document-based
term-based
分區再平衡
再平衡應達成的事情
再平衡策略
請求路由
例如,執行在 10 個節點的叢集上的資料庫可能會從一開始就被拆分為 1,000 個分割槽,因此大約有 100 個分割槽被分配給每個節點。
這樣當節點變多的時候,可以從『每個節點』把多的分割槽讓給新的節點即可
Ex. Riak 【15】、Elasticsearch 【24】、Couchbase 【10】和 Voldemort 【25】
例如 HBase,一開始指會有一個分割槽,且上限是 10GB,如果資料超過了,就會動態配置一個,並且讓兩個分割槽儲存差不多量的資料。並且會依據分割槽容量的減少來一併縮減分割槽。
Ex. RethinkDB, MongoDB(2.4後支援)
Cassandra 和 Ketama 使用的第三種方法是使分割槽數與節點數成正比 。在這種情況下,每個分割槽的大小與資料集大小成比例地增長,而節點數量保持不變,但是當增加節點數時,分割槽將再次變小。當一個新節點加入叢集時,它隨機選擇固定數量的現有分割槽進行拆分,然後佔有這些拆分分割槽中每個分割槽的一半,同時將每個分割槽的另一半留在原地。
CREATE TABLE tbl_test (
uuid INT NOT NULL,
title VARCHAR(20)
)
PARTITION BY RANGE (uuid) (
PARTITION p0 VALUES LESS THAN (5),
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (15),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
CREATE TABLE tbl_test (
uuid INT NOT NULL,
title VARCHAR(20)
)
PARTITION BY List (uuid) (
PARTITION p0 VALUES in (1,2,3,5),
PARTITION p1 VALUES in (7,9,10),
PARTITION p2 VALUES in (11,15)
);
CREATE TABLE tbl_test (
uuid INT NOT NULL,
title VARCHAR(20)
)
PARTITION BY HASH (uuid) (
PARTITIONS 3
);
Why Partitioning? → Scalability
What?
兩種主要的 Partitioning Approach
Partitioning & Secondary Index
Request Routing 的三種做法
如何知道要打哪個?
將儲存分散在(多個)硬碟並分散查詢的處理器 範圍分區: 以鍵的最大、最小值分配分區範圍 散列分區: 以鍵(如哈希值或散射函數)平均分配
將大 database 切分為較小 database,增加 scalability,並可以放在不同 nodes 中
目前 database 無法自動檢測和補償高度 skew 的情況,需要在 application layer 額外實作
Ex: 社群網站上一個有百萬追蹤者的名人在做某事時
解法: 在 index 的開始或結尾加上隨機數
我沒準備 kahoot 會不會破壞傳統 Q
Partitioning
Partitioning by Key Range key 可以是資料中單詞的開頭字母,也可以是時間,用時間的話可以很輕鬆地獲取某日或某月的資料 缺點: hot spot => 幫 key 加上一些 prefix 來讓資料還是能分佈在不同的 partition 上
Partitioning by Hash of Key 為了要避免偏斜和熱點,可以用簡單的雜湊讓相似的原始資料們被平均且隨機分配在不同的 partition 缺點:導致範圍查詢會比 key-range 做 partition 來的要慢,需要將所有 query 都丟到各個 partition 上面去搜尋
Partitioning and Secondary Indexes
Rebalancing Partitioning
Request Routing