變更串流總覽

變更串流會監控並串流傳送 Spanner 資料庫的資料變更 (插入、更新和刪除),以近乎即時的方式傳送。

本頁面提供 Spanner 變更串流的概略說明,包括其用途和運作方式。如要瞭解如何在資料庫中建立及管理變更串流,並將其連結至其他服務,請參閱「後續步驟」中的連結。

變更串流的用途

變更串流可提供靈活、可擴充的資料串流方式,將資料變更串流至其他服務。常見用途包括:

  • 將 Spanner 資料變更複製到資料倉儲 (例如 BigQuery),以便進行分析。

  • 根據傳送至訊息佇列 (例如 Pub/Sub) 的資料變更,觸發應用程式邏輯。

  • 為符合法規或備份目的,將資料變更儲存在 Cloud Storage 中。

變更串流設定

Spanner 會將變更串流視為結構定義物件,就像資料表和索引一樣。因此,您可以使用 DDL 陳述式建立、修改及刪除變更串流,並查看資料庫的變更串流,就像其他 DDL 管理的結構定義物件一樣。

您可以設定變更串流,監控整個資料庫的資料變更,或是將範圍限制為特定資料表和欄。資料庫可以有多個變更串流,而特定資料表或欄可以有限制內的多個串流。

您可以選擇使用下列項目設定變更串流:

發出用於建立變更串流的 DDL 後,系統就會啟動長時間執行的作業。完成後,新的變更串流會立即開始查看指派給它的資料表和欄。

隱含監控資料表和欄

監控整個資料表的變更串流會隱含地監控該資料表中的所有資料欄,即使該資料表定義已更新也一樣。舉例來說,當您在該資料表中新增資料欄時,變更串流會自動開始監控這些新資料欄,而不需要修改變更串流的設定。同樣地,變更串流會自動停止監控從該資料表中刪除的任何欄。

整個資料庫變更串流的運作方式相同。這些監視器會隱含地監控每個資料表中的每個欄,自動監控變更串流建立後新增的任何資料表或欄,並停止監控任何已刪除的資料表或欄。

明確監控資料表和資料欄

如果您設定變更串流只監控資料表中的特定欄,之後如果在該資料表中新增欄,除非重新設定變更串流,否則變更串流不會開始監控這些欄。

資料庫的結構定義會將變更串流視為任何明確監控的欄或資料表的從屬物件。如要刪除任何這類資料欄或資料表,您必須先從任何明確監控該資料欄或資料表的變更資料流程中手動移除。

變更串流監控的資料變更類型

變更串流會監控的資料變更包括對監控的資料表和資料欄所做的所有插入、更新和刪除作業。這些變化可能來自:

變更資料流只能監控使用者建立的資料欄和資料表中的資料變更。不會監控索引、檢視畫面、其他變更串流或系統表格,例如資訊結構定義或統計資料表。變更串流不會監控產生的資料欄,除非該欄是主鍵的一部分。系統一律會追蹤主鍵資料欄。

此外,除了預設值的回填作業外,變更串流不會監控結構定義變更或任何因結構定義變更而直接導致的資料變更。舉例來說,監控整個資料庫的變更串流不會將資料表刪除視為資料變更,也不會記錄這項操作,即使這項操作會從資料庫中刪除該資料表的所有資料。

Spanner 如何寫入及儲存變更串流

每次 Spanner 偵測到變更串流監控的資料欄有資料變更時,就會將資料變更記錄寫入其內部儲存空間。資料變更寫入作業和資料變更記錄會在同一筆交易中寫入。Spanner 會將這兩個寫入作業放置在同一位置,以便由同一個伺服器處理,進而將寫入作業降至最低。然後,交易會複製到資料庫的備用資源,並產生儲存和複製費用。詳情請參閱 Spanner 定價

資料變更記錄的內容

每個由變更串流寫入的資料變更記錄都包含下列資料變更資訊:

  • 受影響資料表的名稱

  • 識別已變更資料列的主索引鍵的名稱、值和資料類型

  • 根據變更串流定義擷取的變更資料列資料欄名稱和資料類型。

  • 資料列的舊值。舊值和其追蹤的內容 (可為僅限修改的資料欄或整個追蹤的資料列) 是否可用,取決於使用者設定的值擷取類型

  • 資料列資料欄的新值。新值的供應情形和追蹤的內容取決於使用者設定的價值擷取類型

  • 修改類型 (插入、更新或刪除)

  • 修訂時間戳記

  • 交易 ID

  • 記錄序號

  • 資料變更記錄的值擷取類型。

如要深入瞭解資料變更記錄的結構,請參閱「資料變更記錄」。

資料保留

變更串流會保留資料變更記錄一段時間,時間長度介於 1 到 30 天之間。您可以使用 DDL 指定資料保留期限 (除了一開始建立變更串流時的預設值),或在日後隨時調整。請注意,如要縮短變更串流的資料保留上限,系統會立即將所有舊變更資料設為超過新上限,並永久禁止該變更串流的讀取器存取這些資料。

這個資料保留期會帶來取捨;保留期越長,就會對串流資料庫帶來越大的儲存需求。

值擷取類型

變更資料流的值擷取類型設定選項會控制其儲存已變更資料列值的方式。您可以使用 DDL 為變更資料流指定下列其中一種值擷取類型:

  • OLD_AND_NEW_VALUES:擷取資料列經修改的欄位舊值和新值。

  • NEW_VALUES:只擷取非關鍵欄的新值,不擷取舊值。

  • NEW_ROW:每當任何監控的資料欄變更時,擷取所有新值 (已修改和未修改的值)。不會擷取舊值。

  • NEW_ROW_AND_OLD_VALUES:擷取已修改和未修改資料欄的所有新值,以及已修改資料欄的舊值。

排除以存留時間為依據的刪除作業

在 Spanner 中,您可以使用存留時間 (TTL) 設定政策,定期從 Spanner 資料表刪除資料。根據預設,變更串流會納入所有以 TTL 為依據的刪除作業。您可以使用 exclude_ttl_deletes 將變更串流設為排除以 TTL 為依據的刪除作業。如果您將這個篩選器設為排除以 TTL 為依據的刪除作業,則變更串流中只會排除日後以 TTL 為依據的刪除作業。

這個篩選器的預設值為 false。如要排除以 TTL 為依據的刪除作業,請將篩選器設為 true。您可以在建立變更串流時新增篩選器,或是修改現有變更串流以納入篩選器

資料表修改類型

根據預設,變更串流會納入所有資料表修改作業,例如插入、更新和刪除。您可以使用下列可用的篩選器選項,從變更資料流的範圍中篩選一或多個這類表格修改:

  • exclude_insert:排除所有 INSERT 資料表修改
  • exclude_update:排除所有 UPDATE 資料表修改
  • exclude_delete:排除所有 DELETE 資料表修改

這些篩選器的預設值為 false。如要排除特定類型的表格修改,請將篩選器設為 true。您可以同時設定一或多個篩選器。

建立變更串流時,您可以為資料表修改類型新增篩選器,或為現有變更串流修改資料表修改類型的篩選器

交易層級記錄排除

根據預設,變更串流會監控資料庫中的所有寫入交易,因為 allow_txn_exclusion DDL 選項已設為 false。您可以將 allow_txn_exclusion 選項設為 true,讓變更資料流忽略指定寫入交易中的記錄。如果您未將這個選項設為 true,則系統會監控所有寫入交易,即使您在寫入交易中使用 exclude_txn_from_change_streams 參數也一樣。

您可以在建立變更串流時啟用這個選項,或是修改現有的變更串流

從變更串流中排除寫入交易

如要從變更資料流中排除寫入交易,您必須將 exclude_txn_from_change_streams 參數設為 true。這個參數是 TransactionOptionsBatchWriteRequest 方法的一部分。這個參數的預設值為 false。您可以使用 RPC API、REST API 或用戶端程式庫設定這個參數。詳情請參閱「指定要從變更串流中排除的寫入交易」。

您無法將此參數設為 true,以便進行唯讀交易。如果您這麼做,API 就會傳回無效引數錯誤。

對於監控交易修改的資料欄變更串流,當 exclude_txn_from_change_streams 設為 true 時,可能會發生以下兩種情況:

  • 如果 DDL 選項 allow_txn_exclusion 設為 true,則在這個交易中進行的更新不會記錄在變更串流中。
  • 如果您未設定 DDL 選項 allow_txn_exclusion,或是將其設為 false,則在這個交易中所做的更新會記錄在變更串流中。

如果您未設定 exclude_txn_from_change_streams 選項,或是將其設為 false,則任何監控交易修改資料欄的變更串流都會擷取該交易中所做的更新。

讀取變更串流

Spanner 提供多種方式來讀取變更串流的資料:

  • 透過 Dataflow 使用 Apache Beam SpannerIO 連接器。這是我們針對大多數變更串流應用程式建議採用的解決方案。Google 也提供常見用途的 Dataflow 範本。

  • 直接使用 Spanner API。這麼做可犧牲 Dataflow 管道的抽象化和功能,以換取最高速度和彈性。

  • 使用以 Debezium 為基礎的 Kafka 連接器,用於 Spanner 變更串流。這個連接器會將變更記錄直接串流至 Kafka 主題。

您可以使用導向讀取功能,為變更資料流讀取作業提供部分隔離功能。導向讀取可盡量減少對資料庫中交易工作負載的影響。您可以使用 Spanner API,將變更資料流讀取作業路由至多地區執行個體設定或自訂地區設定(含可選的唯讀區域) 中的特定備援類型或區域。詳情請參閱「導向讀取」。

使用 Dataflow

使用 Apache Beam SpannerIO 連接器建立 Dataflow 管道,從變更串流讀取資料。設定連接器時,如果您提供特定變更串流的詳細資料,連接器就會自動將新的資料變更記錄輸出至單一無界限的 PCollection 資料集,以便在 Dataflow 管道中透過後續轉換進一步處理。

Dataflow 會使用時間區間設定函式,將無限集合劃分為邏輯元件 (或時間區間)。因此,Dataflow 在讀取變更串流時,可提供近乎即時的串流。

Google 提供範本,可讓您針對常見的變更資料流程使用情境快速建構 Dataflow 管道,包括將資料流程的所有資料變更傳送至 BigQuery 資料集,或將這些變更資料流程複製至 Cloud Storage 值區

如要進一步瞭解變更串流和 Dataflow 如何搭配運作,請參閱「使用 Dataflow 建立變更串流連線」。

使用 API

除了使用 Dataflow 建構變更串流管道,您也可以編寫程式碼,使用 Spanner API 直接讀取變更串流的記錄。這可讓您以與 SpannerIO 連接器相同的方式讀取資料變更記錄,在讀取變更串流資料時提供盡可能低的延遲,而非提供 Dataflow 的彈性。

如需更多資訊,請參閱「查詢變更串流」。如要進一步瞭解如何查詢變更串流並解讀傳回的記錄,請參閱「變更串流區隔、記錄和查詢」一文。

使用 Kafka 連接器

Kafka 連接器會直接將變更串流記錄輸出至 Kafka 主題。它會抽離使用 Spanner API 查詢變更串流的詳細資料。

如要進一步瞭解變更串流和 Kafka 連接器的搭配運作方式,請參閱「使用 Kafka 連接器建立變更串流連線」。

限制

變更串流有幾項限制,包括資料庫可擁有的變更串流數量上限,以及可監控單一資料欄的串流數量上限。如需完整清單,請參閱「變更串流限制」。

權限

變更串流會使用以下項目:

  • 建立、更新或捨棄變更串流都需要 spanner.databases.updateDdl

  • 讀取變更串流的資料需要 spanner.databases.select

如果使用 SpannerIO 連接器,則讀取變更資料流資料的 Dataflow 工作擁有者需要額外的 IAM 權限,無論是應用程式資料庫或獨立的中繼資料資料庫都需要;請參閱「建立中繼資料資料庫」。

後續步驟