变更数据流概览

变更数据流监视并流式输出 Spanner 数据库的数据更改(插入、更新和删除),位于 实时更新。

本页面简要介绍了 Spanner 变更 流:用途和工作原理。要了解如何创建 管理数据库中的变更数据流,并将其与其他 服务,请点击后续步骤中的链接。

变更数据流的用途

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

  • 将 Spanner 数据更改复制到数据仓库,例如 BigQuery,用于分析。

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

  • Cloud Storage 中存储数据更改以确保合规性 或归档目的。

变更数据流配置

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

您可以配置变更数据流,以监控 也可以将其范围限定为特定的表和列。答 数据库可以有多个变更数据流,以及特定表或 列可以有多个视频流在内, 限制

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

颁发可创建变更流的 DDL 会启动长时间运行的 操作。当 新的变更流会立即开始观察相关表 以及分配给它的列。

隐式监控表和列

监视整个表的变更流会隐式监视所有 该表中的列,即使该表定义已更新。对于 例如,当您向该表中添加新列时,变更数据流 系统会自动开始监控这些新列, 对该变更数据流的配置进行修改。同样, 变更数据流会自动停止监控 。

整个数据库变更数据流的工作原理相同。他们暗中观看 每个表的每一列,自动监控任何表或 在变更数据流创建后添加,并且停止监控的列 删除任何表或列。

显式监控表和列

如果您将变更数据流配置为仅监控 而您稍后向该表格中添加列时,变更数据流将 除非您重新配置该更改 来实现这一点。

数据库的架构将变更数据流视为任何来源的从属对象 明确监控的列或表。在删除任何 必须手动将其从配置中移除 任何变更数据流的明确监控

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

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

变更数据流只能观察用户创建的变更中的数据更改 列和表。而不会查看索引、视图、其他变更数据流, 或系统表,例如信息架构表或统计信息表。更改 数据流不会监控生成的列,除非 主键。始终跟踪主键列。

此外,变更数据流不监控架构变更或任何数据 架构更改直接导致的更改。例如,将 流式观察整个数据库不会将丢弃表视为 数据更改,即使此操作会移除该表的所有数据 从数据库中提取数据

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

每次 Spanner 检测到列中的数据更改时 更改流监控时,它会将数据变更记录写入其 内部存储空间。它会与这些数据同步 更改。Spanner 共置 执行这两项写入操作,以便由同一服务器处理, 最大限度地减少写入处理。

数据变更记录的内容

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

  • 受影响表的名称

  • 用于标识 已更改行

  • 被更改的行中的列的名称和数据类型 更改数据流定义

  • 行列的旧值。旧值的可用性 及其跟踪的内容,可能只能是修改后的列,也可能是经过修改的列 整个跟踪的行,取决于用户配置的值捕获类型

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

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

  • 提交时间戳

  • 交易 ID

  • 记录序列号

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

如需深入了解数据变更记录的结构,请参阅数据变更记录

数据保留

变更数据流会将其数据变更记录保留一段时间 。您可以使用 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。您可以设置一个或多个 过滤器。

您可以为表格修改类型添加过滤条件 创建变更数据流时 修改表修改类型的过滤条件 更改流

读取变更数据流

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 作业需要额外的 针对应用数据库或单独 元数据数据库;请参阅创建元数据数据库

后续步骤