变更数据流概览

变更数据流监视并流式输出 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 权限;请参阅创建元数据数据库

后续步骤