变更数据流概览

Bigtable 通过其变更数据流功能提供变更数据捕获 (CDC)。变更数据流会捕获更改发生时 Bigtable 表的数据更改,以便您将其流式传输以进行处理或分析。

本文档简要介绍了 Bigtable 变更数据流。在阅读本文档之前,您应该先熟悉 Bigtable 概览

变更数据流对于 CDC 用例很有用,包括:

  • 在发生指定更改时触发下游应用逻辑
  • 与数据分析流水线集成
  • 支持审核和归档需求

什么是变更数据流

变更数据流会跟踪用户或应用(通常使用某个 Cloud Bigtable 客户端库)在表级层做出的更改。垃圾回收更改也会被捕获。

应用于启用了变更数据流的表的所有更改都会存储为数据更改记录。数据更改记录包括通过以下方式应用的数据更改:

  • 使用 Cloud Bigtable API 方法 MutateRowMutateRowsCheckAndMutateRowReadModifyWriteRow 发送的写入、删除和更新
  • 因垃圾回收而执行的删除操作
  • 使用 Admin API 的 DropRowRange 方法删除的行

如需详细了解可发送到 Bigtable 表的更改类型,请参阅读取写入删除垃圾回收概览

变更数据流不会跟踪架构更改(例如添加或修改列族)或复制拓扑(例如添加或移除集群)。

每个行键和每个集群的数据变更记录都按提交时间戳顺序排列。但是,对于不同行键或聚类的数据更改记录,无法保证排序。

您可以在表上启用变更数据流,并指定 1 到 7 天的保留期限。

数据更改记录中包含哪些内容

每个数据更改记录都包含在单个 RPC 调用中以原子方式应用的行的所有更改。

如果某个值被覆盖,新写入的值会记录在数据更改记录中。数据更改记录不包含旧值

在将更改应用于第一个收到该更改的集群的同时,数据更改记录会收到其时间戳(称为提交时间戳)。举例来说,假设一个实例有两个集群。如果您向集群 A 上的表 1 发送写入请求,则系统会在集群 A 收到写入时分配数据更改记录提交时间戳,并且集群 B 上关于此写入的数据更改记录具有相同的提交时间戳。

每个数据更改记录都包含以下内容:

  • 条目 - 对行所作的更改,包括以下一项或多项:
    • 写入
      • 列族
      • 列限定符
      • 时间戳
    • 删除单元
      • 列族
      • 列限定符
      • 时间戳范围
    • 删除列族
      • 列族
      • 从行中删除 - 从行中删除数据将转换为该行包含数据的每个列族的列族中的删除列表。
  • 行键 - 已更改的行的标识符
  • 更改类型 - 用户发起的更改或垃圾回收
  • 接收更改的集群的 ID
  • 提交时间戳 - 将更改提交到表的服务器端时间
  • 断路器 - 该值可让读取流的应用使用 Bigtable 的内置冲突解决政策
  • 令牌 - 供使用方应用在数据流中断时将其恢复
  • 估算的低水印 - 自记录分区在所有集群中完成复制以来的预计时间。如需了解详情,请参阅分区水印

如需详细了解数据更改记录中的字段,请参阅 DataChange 的 API 参考文档。

变更数据流存储空间

表及其变更数据流共享相同的集群级层资源,包括节点和存储空间。因此,变更数据流数据存储区是表存储空间的一部分。在使用复制的实例中,变更数据流的数据副本存储在包含的表启用了变更数据流的实例的每个集群中。

变更数据流数据使用的存储空间不计入存储空间总用量(最大百分比)。因此,您无需添加节点来处理增加的变更数据流所消耗的存储空间(不过,您可能需要添加节点以获得额外的计算能力)。但是,您需要为变更数据流数据使用的存储空间付费。如需了解详情,请参阅费用注意事项

读取变更数据流

如需读取(流式传输)变更数据流,您必须使用为单集群路由配置的应用配置文件;如果使用 Dataflow 进行流式传输,必须启用单行事务。

如需详细了解路由政策,请参阅路由选项

如需详细了解单行事务,请参阅单行事务

变更数据流方法由 Cloud Bigtable API (Data API) 提供。 我们建议您使用以下选项之一,而不是在不使用客户端库或连接器的情况下调用 API:

  • Dataflow 模板
  • Bigtable Beam 连接器
  • Java 客户端库

所有选项都可以让您避免由于拆分和合并而需要跟踪和处理分区更改

如需了解详情,请参阅 ReadChangeStream

Dataflow 模板

您可以使用 Google 提供的以下 Dataflow 模板之一:

Bigtable Beam 连接器

您可以使用 Bigtable Beam 连接器构建流水线:

如果您不想构建自己的流水线,则可以以 Bigtable 教程或快速入门中的代码示例作为基础构建您的代码:

Java 客户端库

分区

为了保持与高写入或更改速率匹配的高读取吞吐量,Bigtable 将变更数据流划分为多个分区,这些分区可用于并行读取变更数据流。每个变更数据流分区都与一个片相关联。这些片是表的子部分,可根据需要进行重新分布,以帮助平衡表的请求工作负载。如需了解详情,请参阅负载均衡

在 Java 客户端库中,您可以查询每个分区的更改,并提供管理拆分和合并导致的分区更改所需的信息

水印

水印是一个时间戳,用于估计分区最近与所有集群的复制同步的时间。分区的水印会在复制过程中不断更新,并及时前进。

每个 ChangeStreamMutation(数据更改记录)都包含一个 estimatedLowWatermark 字段,该字段是与数据更改记录关联的分区的水印。此 estimatedLowWatermark 为估算值,并不能保证没有任何数据到达数据流。

复制表的水印

如果复制未完全与分区同步,则 estimatedLowWatermark(低水印)不会前进。如果任何分区的水印没有前进,则数据流级的低水印(所有分区级预估低水印的最小值)会停止前进。已停止前进的水印被视为停滞。发生这种情况时,如果您在流水线中流式传输变更数据流,则流水线会停滞。

很多因素都可能导致一个或多个分区级水印停滞一段时间,包括:

  • 集群过载,其流量导致复制落后于一个或多个分区
  • 网络延迟
  • 集群不可用

Bigtable Beam 连接器通过将所有数据的输出时间戳设置为零来解决此问题。如需了解详情,请参阅在没有事件时间的情况下对数据进行分组

监控

为帮助您了解在实例包含的表启用了变更数据流时启用变更数据流会如何影响该实例的 CPU 和存储空间利用率,我们提供了两个特定于变更数据流的指标。您可以在 Bigtable Monitoring 页面或使用 Cloud Monitoring 工具套件查看指标。

如需详细了解这些指标,请参阅 Monitoring

费用注意事项

在表上启用变更数据流会增加节点和存储空间的费用。特别是,您可能需要支付更多存储费用

节点

您通常需要向集群添加节点(如果使用自动扩缩,则需要增加节点数上限)来处理启用和处理数据更改记录产生的额外流量。

即使在开始处理变更数据流之前,启用该变更数据流也可能会使 CPU 使用率提高大约 10%。处理变更数据流(例如使用 Dataflow 流水线对其进行读取)可将 CPU 利用率提高大约 20% 到 30%,具体取决于变更活动的级别以及流数据的读取方式。

存储

您需要按照标准 Bigtable 存储费率支付存储表的数据更改记录的费用。存储为跟踪变更数据流元数据而创建的表时也需要付费。您指定的保留期限会直接影响存储费用。

一般来说,一天的数据更改记录(仅反映当天发生的变更)占用的存储空间大约是当天写入的数据在磁盘上占用的存储空间的 1.5 倍。

网络数据传输

如果您跨区域读取变更数据流,可能会产生相应的流量费用。如需查看网络数据传输费率的完整列表,请参阅 Bigtable 价格的“网络”部分。

处理费用

根据您读取数据更改记录的方式,Bigtable 以外的其他服务也会产生额外费用。例如,如果您使用 Dataflow,则需要为处理的字节数以及处理作业的工作器机器付费。如需了解详情,请参阅 Dataflow 价格

舍弃行范围

如果可能,请避免从启用了变更数据流的表中舍弃行范围。如果您必须这样做,请注意 Bigtable 可能需要很长时间才能完成此操作,并且在此操作过程中,CPU 使用率会增加。

后续步骤