变更数据流概览

变更数据流会近乎实时监控 Spanner 数据库的数据更改(插入、更新和删除)并将其流式传输出去。

本页面简要介绍了 Spanner 更改流:其用途和工作原理。如需了解如何在数据库中创建和管理变更数据流,以及如何将其与其他服务相关联,请点击后续措施中的链接。

变更数据流的用途

变更数据流提供了一种灵活且可伸缩的方式,可将数据更改流式传输到其他服务。常见用例包括:

  • 将 Spanner 数据更改复制到数据仓库(例如 BigQuery)以进行分析。

  • 根据发送到消息队列(例如 Pub/Sub)的数据更改触发应用逻辑。

  • 出于合规性或归档目的,将数据更改存储在 Cloud Storage 中。

变更数据流配置

Spanner 会将变更数据流视为架构对象,就像表和索引一样。因此,您可以使用 DDL 语句创建、修改和删除变更流,并且可以查看数据库的变更流,就像查看其他 DDL 管理的架构对象一样。

您可以将更改流配置为监控整个数据库中的数据更改,也可以将其范围限制为特定表和列。一个数据库可以有多个变更数据流,并且特定表或列可以有多个流监控它(在一定范围内)。

您还可以配置更改流,以指定数据保留期限值捕获类型过滤基于 TTL 的删除操作表修改过滤条件

发出用于创建更改流的 DDL 会启动长时间运行的操作。完成后,新的更改流会立即开始监控分配给它的表和列。

隐式监控表和列

监控整个表的更改流会隐式监控该表中的所有列,即使该表定义发生更新也是如此。例如,当您向该表添加新列时,更改流会自动开始监控这些新列,而无需对更改流的配置进行任何修改。同样,如果从该表中删除了任何列,更改流会自动停止监控这些列。

整个数据库变更数据流的工作原理也是如此。它们会隐式监控每个表中的每个列,自动监控在创建变更数据流后添加的任何表或列,并停止监控任何已删除的表或列。

显式监控表和列

如果您将更改数据流配置为仅监控表中的特定列,而您稍后又向该表添加了列,除非您重新配置该更改数据流,否则该更改数据流不会开始监控这些列。

数据库的架构会将变更数据流视为它们明确监控的任何列或表的依赖对象。在删除任何此类列或表之前,您必须先从明确监控它的任何更改流的配置中手动将其移除。

变更数据流监控的数据更改类型

变更数据流监控的数据更改包括对其监控的表和列进行的所有插入、更新和删除。这些更改可能来自以下来源:

更改流只能监控用户创建的列和表中的数据更改。它们不会监控索引、视图、其他变更数据流或系统表(例如信息架构或统计表)。除非生成的列是主键的一部分,否则更改流不会监控生成的列。系统始终会跟踪主键列。

此外,除了默认值的回填之外,变更数据流不会监控架构更改或直接由架构更改导致的任何数据更改。例如,监控整个数据库的变更数据流不会将表删除视为数据更改并进行记录,即使此操作会从数据库中删除该表的所有数据也是如此。

Spanner 如何写入和存储变更数据流

每当 Spanner 检测到变更数据流监控的列中发生数据更改时,都会将数据更改记录写入其内部存储空间。数据更改写入和数据更改记录是在同一事务中写入的。Spanner 会将这两次写入放置在一起,以便由同一服务器处理,从而最大限度地减少写入处理。然后,系统会将该事务复制到数据库的副本,从而产生存储和复制费用。如需了解详情,请参阅 Spanner 价格

数据更改记录的内容

变更数据流写入的每条数据更改记录都包含与数据更改相关的以下信息:

  • 受影响表的名称

  • 用于标识已更改行的主键的名称、值和数据类型

  • 系统根据更改数据流定义捕获的已更改行的列的名称和数据类型。

  • 相应行的列的旧值。旧值的可用性及其跟踪的内容(可以是仅修改后的列,也可以是整个跟踪行)取决于用户配置的值捕获类型

  • 行列的新值。新值的可用性及其跟踪的内容取决于用户配置的值捕获类型

  • 修改类型(插入、更新或删除)

  • 提交时间戳

  • 交易 ID

  • 记录序列号

  • 数据更改记录的值捕获类型。

如需详细了解数据更改记录的结构,请参阅数据更改记录

数据保留

变更流会将其数据更改记录保留一到七天。您可以在首次创建变更数据流时使用 DDL 指定数据保留期限(默认期限为 1 天),也可以在日后随时调整该期限。请注意,缩短变更数据流的数据保留期限上限后,所有历史变更数据都会立即过期,并且永远无法供该变更数据流的读取器使用。

此数据保留期限存在权衡;保留期限越长,对数据流数据库的存储需求就越大。

值捕获类型

更改数据流的值捕获类型配置选项用于控制其存储更改行值的方式。您可以使用 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。您可以同时设置一个或多个过滤条件。

您可以在创建更改流时为表更改类型添加过滤条件,也可以为现有更改流修改表更改类型的过滤条件

读取变更数据流

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 连接器一样读取数据更改记录,从而舍弃它提供的抽象,以便在读取更改数据流数据时尽可能缩短延迟时间。

如需了解详情,请参阅查询变更数据流。如需详细了解如何查询变更数据流并解读返回的记录,请参阅更改数据流分区、记录和查询

使用 Kafka 连接器

Kafka 连接器会将更改流记录直接输出到 Kafka 主题。它提取了使用 Spanner API 查询变更数据流的详细信息。

如需详细了解变更数据流和 Kafka 连接器如何协同工作,请参阅使用 Kafka 连接器构建变更数据流连接

限制

变更数据流存在多项限制,包括数据库可以拥有的变更数据流的数量上限,以及可以监控单个列的流的数量上限。如需查看完整列表,请参阅更改流限制

权限

更改流使用以下内容:

  • 创建、更新或删除变更数据流需要 spanner.databases.updateDdl

  • 读取变更数据流的数据需要 spanner.databases.select

如果使用 SpannerIO 连接器,则读取变更数据流数据的 Dataflow 作业的所有者需要在应用数据库或单独的元数据数据库上拥有额外的 IAM 权限;请参阅创建元数据数据库

后续步骤