預先分割總覽

這份文件提供的資訊可協助您預先分割資料庫。

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);

UserIdINT64 空間中隨機產生的雜湊,您需要新增 100 個拆分點,才能在 UserInfo 資料表及其交錯表上平均分配預期的流量增加量。由於分割點平均分配,您需要找出各分割點之間的列數或 offset

offset = UserId 範圍的最大值 / 99

接著,系統會根據 UserIdUserId_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 字串的前置字串,決定分割方式,將 UserIdUserLocationInfo 資料表放在 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 可能會根據流量合併分割作業。

您也可以在分割點到期前更新其到期時間。舉例來說,如果流量增加的情況未減緩,您可以延長分割作業的到期時間。如果您不再需要分割點,可以將其設為立即到期。如要瞭解如何設定分割點的到期時間,請參閱「如何讓分割點到期」。

預先分割資料庫的結果

新增分割點後,可能會出現下列結果:

  • 延遲時間變更:新增分割點是模擬資料庫流量增加的一種方式。資料庫的分割作業越多,讀取和寫入作業的延遲時間就會永久增加,因為交易參與者和查詢分割作業的數量會增加。每個讀取或寫入要求的運算和查詢用量也會增加。

  • 分割點成效:如要判斷新增的分割點是否有益,請監控延遲資料剖析結果,找出最少變動的部分,並使用關鍵視覺化工具找出熱點。如果您發現熱點,可以立即讓分割點到期並建立新的分割點。如要進一步瞭解到期分割點,請參閱「如何讓分割點到期」。建議您在下次新增區隔時,採用較少的區隔數,並觀察延遲時間設定檔。

  • 流量增加後的分割點行為:流量增加穩定後,應移除新增的分割點。分割發布作業可能不會收斂到負載增加前的狀態。由於流量變化和支援流量所需的切割,資料庫可能會採用不同的延遲設定檔。

用途範例

假設您是遊戲公司的資料庫管理員,並預期新遊戲推出後的流量會增加。您預期空白新表格的流量。

您必須確保流量不會造成服務中斷,以免對延遲或錯誤率造成明顯影響。

針對此用途,請考慮採用下列高層級預先區隔策略:

  1. 找出執行個體需要的節點數量,以便支援增加的流量。如要瞭解如何找出節點數,請參閱「效能總覽」一文。如果您使用自動調度資源,請將最大限制參數設為您指定的節點數量。此外,請將最小限制參數設為 (您識別的節點數量 / 5)。

  2. 找出流量最多且最能從使用分割點獲益的表格和索引。分析目前的資料,然後選擇使用自訂分割點或平均分布分割點。

  3. 建立分割點的時間應在預期流量增加前 7 天以上,且不晚於 12 小時。

  4. 確認已建立分割項目。如要查看在執行個體上建立的分割點,請參閱「查看分割點」。

注意事項

建立分割點時,請考量下列注意事項:

  • 資料表、索引和資料庫刪除作業:刪除資料表、索引或資料庫前,請務必確認所有對應的新增分割點都已到期。您可以將分割作業到期日設為目前時間。這項操作是為了回收執行個體層級配額。如要進一步瞭解到期分割點,請參閱「如何讓分割點到期」。

  • 備份及還原資料庫:系統不會備份新增的區隔。您必須在已還原的資料庫上建立分割項目。

  • 非對稱自動調整資源配置:如果您使用非對稱自動調整資源配置,用來判斷分割點數量的節點數量,就是所有區域的節點數量下限。

  • 儲存空間用量指標暫時增加:新增分割點會暫時增加資料庫總儲存空間指標,直到 Spanner 完成壓縮作業為止。詳情請參閱「儲存空間使用率」。只有在進一步分割現有鍵範圍時才會發生,新鍵範圍分割時不會發生。

  • 請在預期流量增加前,至少提前七天,最晚則在流量增加前 12 小時建立分割點。

分割前限制

資料庫預先分割有下列限制:

  • 您無法預先分割搜尋索引。您只需要預先拆分基礎資料表。詳情請參閱「搜尋索引分割」。

  • 您無法預先分割向量索引。如要進一步瞭解向量索引,請參閱「向量索引」。

  • 如要瞭解分割點的配額,請參閱「配額與限制」。

後續步驟