這份文件提供的資訊可協助您預先分割資料庫。
Spanner 會管理資料庫分割作業,並根據負載和大小變更進行調整。系統會根據流量動態進行分割和合併。當某個分組接收更多流量時,Spanner 會將該分組細分為較小的範圍,並將產生的分組重新分配至執行個體中的其他可用資源。如果分割區持續接收較少流量,Spanner 就會合併分割區。
拆分作業不會立即生效。如果拆分和重新平衡無法跟上流量,拆分作業可能會耗盡可用的運算和記憶體資源。發生這種情況時,Spanner 的工作排程器會將後續要求排入佇列,導致延遲時間增加,並可能導致逾時和中止交易。
透過預先分割資料庫,Spanner 就能為預期的流量增加做好準備。您可以建立分割點,預先分割資料庫。
在下列情況下,建議您預先分割資料庫:
- 您首次將大量資料集載入 Spanner 資料庫中的新資料表和索引,例如一次性大量載入。
- 您預期現有 Spanner 資料庫的流量負載會在近期內增加。舉例來說,您可能需要支援大量流量事件,例如產品發布或銷售活動。
判斷分割數量
建議您為每個節點建立 10 個分割點。由於 Spanner 可為較小的執行個體快速分割及調整流量,因此您不需要預先分割較小的執行個體。
判斷分割點
決定資料庫的分割點時,請考量下列事項:
如果流量平均分配至索引鍵範圍 (例如使用 UUID 或位元反轉的序列索引鍵),請選擇可平均分配後端流量索引鍵空間的拆分點。
如果流量集中在某些已知的索引鍵範圍,請將這些索引鍵範圍分割並隔離。
如果您預期索引會有流量,請在對應的索引中使用拆分點。
如果分割點新增至父項資料表,交錯式資料表就會分割。如果預期交錯式資料表的流量較高,請務必在對應的交錯式資料表中使用分割點。
您可以根據結構定義物件增加的流量,按比例將分割點分配給結構定義物件。
用於判斷分割點的工作流程範例
假設您的資料庫有以下 DDL 定義的資料表結構:
CREATE TABLE UserInfo (
UserId INT64 NOT NULL,
Info BYTES(MAX),
) PRIMARY KEY (UserId);
CREATE TABLE UserLocationInfo (
UserId INT64 NOT NULL,
LocationId STRING(MAX) NOT NULL,
ActivityData BYTES(MAX),
) PRIMARY KEY (UserId, LocationId), INTERLEAVE IN PARENT UserInfo ON DELETE CASCADE;
CREATE INDEX UsersByLocation ON UserLocationInfo(LocationId);
UserId
是 INT64
空間中隨機產生的雜湊,您需要新增 100 個拆分點,才能在 UserInfo
資料表及其交錯表上平均分配預期的流量增加量。由於分割點平均分配,您需要找出各分割點之間的列數或 offset
:
offset
= UserId
範圍的最大值 / 99
接著,系統會根據 UserId
或 UserId_first
的第一列,判斷資料表 UserInfo
的分割點。如要判斷第 N 個分割點,請使用下列計算方式:
第 N 個分割點:UserId_first
+ (offset
* (N-1))
舉例來說,第一個分割點是 UserId_first
+ (offset
* 0),第三個分割點是 UserId_first
+ (offset
* 2)。
由於 UserLocationInfo
資料表是 UserInfo
資料表的交錯資料表,因此也會在 UserId
邊界處分割。您也可以在 LocationId
欄的 UserLocationInfo
資料表中建立分割點。
假設 LocationId
遵循 $COUNTRY_$STATE_$CITY_$BLOCK_$NUMBER
格式,例如 US_CA_SVL_MTL_1100_7
。
針對 UserId
,您可以根據 LocationId
字串的前置字串,決定分割方式,將 UserId
的 UserLocationInfo
資料表放在 3 個不同國家/地區的 3 個分割區中:
- 分割點 1:(1000, "CN")
- 分割點 2:(1000, "FR")
- 分割點 3:(1000, "US")
您可以只使用前置字串新增分割點,而不需要符合資料欄或索引的指定格式。在這個範例中,分割點不符合 LocationId
的指定格式,且只使用 $COUNTRY
做為前置字串。
如果您想拆分 UsersByLocation
索引,可以將拆分點平均分配在 LocationId
欄上,或是分離出幾個預期會收到更多流量的 LocationId
欄值:
- 分割點 1:「CN」
- 分割點 2:「US」
- 分割點 3:「US_NYC」
您可以針對流量更高的地區,使用索引資料表索引鍵部分進一步分割索引。舉例來說,如果您預期 CN
位置的流量會增加,可以導入下列分割點:
- 分割點 1:「CN」和 TableKey:(1000, 「CN」)
- 分割點 2:「CN」和 TableKey:(2000, "CN")
- 分割點 3:「CN」和 TableKey:(3000, 「CN」)
分割點到期
您可以為每個分割點設定到期時間。視用途而定,請在預期流量上升的情況消退後,設定分割點到期時間。
預設的到期時間為分割項目建立或更新後的 10 天。允許的到期時間上限為建立或更新分割時起算的 30 天。
分割作業到期後,Spanner 會接手管理分割作業,您將無法再查看分割作業。Spanner 可能會根據流量合併分割作業。
您也可以在分割點到期前更新其到期時間。舉例來說,如果流量增加的情況未減緩,您可以延長分割作業的到期時間。如果您不再需要分割點,可以將其設為立即到期。如要瞭解如何設定分割點的到期時間,請參閱「如何讓分割點到期」。
預先分割資料庫的結果
新增分割點後,可能會出現下列結果:
延遲時間變更:新增分割點是模擬資料庫流量增加的一種方式。資料庫的分割作業越多,讀取和寫入作業的延遲時間就會永久增加,因為交易參與者和查詢分割作業的數量會增加。每個讀取或寫入要求的運算和查詢用量也會增加。
分割點成效:如要判斷新增的分割點是否有益,請監控延遲資料剖析結果,找出最少變動的部分,並使用關鍵視覺化工具找出熱點。如果您發現熱點,可以立即讓分割點到期並建立新的分割點。如要進一步瞭解到期分割點,請參閱「如何讓分割點到期」。建議您在下次新增區隔時,採用較少的區隔數,並觀察延遲時間設定檔。
流量增加後的分割點行為:流量增加穩定後,應移除新增的分割點。分割發布作業可能不會收斂到負載增加前的狀態。由於流量變化和支援流量所需的切割,資料庫可能會採用不同的延遲設定檔。
用途範例
假設您是遊戲公司的資料庫管理員,並預期新遊戲推出後的流量會增加。您預期空白新表格的流量。
您必須確保流量不會造成服務中斷,以免對延遲或錯誤率造成明顯影響。
針對此用途,請考慮採用下列高層級預先區隔策略:
找出執行個體需要的節點數量,以便支援增加的流量。如要瞭解如何找出節點數,請參閱「效能總覽」一文。如果您使用自動調度資源,請將最大限制參數設為您指定的節點數量。此外,請將最小限制參數設為 (您識別的節點數量 / 5)。
找出流量最多且最能從使用分割點獲益的表格和索引。分析目前的資料,然後選擇使用自訂分割點或平均分布分割點。
建立分割點的時間應在預期流量增加前 7 天以上,且不晚於 12 小時。
確認已建立分割項目。如要查看在執行個體上建立的分割點,請參閱「查看分割點」。
注意事項
建立分割點時,請考量下列注意事項:
資料表、索引和資料庫刪除作業:刪除資料表、索引或資料庫前,請務必確認所有對應的新增分割點都已到期。您可以將分割作業到期日設為目前時間。這項操作是為了回收執行個體層級配額。如要進一步瞭解到期分割點,請參閱「如何讓分割點到期」。
備份及還原資料庫:系統不會備份新增的區隔。您必須在已還原的資料庫上建立分割項目。
非對稱自動調整資源配置:如果您使用非對稱自動調整資源配置,用來判斷分割點數量的節點數量,就是所有區域的節點數量下限。
儲存空間用量指標暫時增加:新增分割點會暫時增加資料庫總儲存空間指標,直到 Spanner 完成壓縮作業為止。詳情請參閱「儲存空間使用率」。只有在進一步分割現有鍵範圍時才會發生,新鍵範圍分割時不會發生。
請在預期流量增加前,至少提前七天,最晚則在流量增加前 12 小時建立分割點。
分割前限制
資料庫預先分割有下列限制: