本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用寫入分片在分割區之間平均分配工作負載
在 Amazon 密鑰空間中更好地將寫入分配到分區之間的一種方法是擴展空間。您可以數種不同的方式來執行此動作:您可以新增一個額外的分割區索引鍵資料欄,以便在分割區之間分配資料列。或者,您可以使用根據您查詢內容計算的數字。
使用複合分區鍵和隨機值進行分片
將負載更均勻地分配到分割區之間的其中一個策略是新增額外的分割區索引鍵資料欄,您可以在其中寫入隨機數字。如此您就能在較大的空間中將寫入隨機化。
例如,請考慮下表,它具有代表日期的單一分區索引鍵。
CREATE TABLE IF NOT EXISTS tracker.blogs ( publish_date date, title text, description int, PRIMARY KEY (publish_date));
若要在分割區之間更均勻地分配此表格,您可以加入儲存隨機數shard
的額外分割索引鍵資料欄。例如:
CREATE TABLE IF NOT EXISTS tracker.blogs ( publish_date date, shard int, title text, description int, PRIMARY KEY ((publish_date, shard)));
插入資料時,您可以在1
shard
和200
之間選擇一個隨機數字。這會產生複合分區索引鍵值 (2020-07-09, 1)
(2020-07-09, 2)
,例如、等等(2020-07-09, 200)
。因為您隨機化了分割區索引鍵,每天對資料表的寫入會平均分配在多個分割區中。這可帶來更優良的平行處理與更高的整體傳輸量。
但是,要讀取給定日期的所有行,您必須查詢所有碎片的行,然後合併結果。例如,您首先要針對分割區索引鍵值發出SELECT
陳述式(2020-07-09,
1)
。然後發出另一個SELECT
聲明(2020-07-09,
2)
,等等,通過(2020-07-09, 200)
。最後,您的應用程序將不得不合併所有這些SELECT
語句的結果。
使用複合分區鍵和計算值進行分片
隨機化的策略可大幅改善寫入傳輸量。但是很難讀取特定的行,因為您不知道在寫入行shard
時將哪個值寫入列。為了更容易閱讀個別列,您可以使用不同的策略。而不是使用隨機數在分區之間分配行,而是使用可以根據您要查詢的項目計算的數字。
考量先前的範例,其中資料表會使用分割區索引鍵中的今天日期。現在假設每一行都有一個可訪問的title
列,並且除了日期之外,您通常需要按標題查找行。在應用程式將資料列寫入資料表之前,它可以根據標題計算雜湊值,並使用它來填入資shard
料行。計算應會產生介於 1 到 200 之間的數字,此分佈非常平均,與隨機策略產生的結果相當類似。
一個簡單的計算可能就足夠了,例如 UTF -8 代碼點值的乘積為標題中的字符,模數 200,+ 1。然後,複合分區鍵值將成為日期和計算結果的組合。
有了這項策略,即可在分割區索引鍵值之間,以及實體分割區之間平均分配寫入。您可以輕鬆地針對特定資料列和日期執行SELECT
陳述式,因為您可以計算特定值的分區索引鍵title
值。
要讀取給定日期的所有行,您仍然必須SELECT
每個(2020-07-09, N)
鍵(其中N
為 1—200),然後您的應用程序必須合併所有結果。好處是您能避免讓單一「經常性」分割區索引鍵值承受所有工作負載。