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