从 MySQL 数据库流式传输数据

本部分包含有关以下内容的信息:

  • Datastream 如何处理从来源 MySQL 数据库中拉取的数据的行为
  • Datastream 支持的 MySQL 数据库版本
  • 将 MySQL 数据库用作来源的已知限制
  • 如何设置来源 MySQL 数据库以便将数据从该数据库流式传输到目标位置的概述

行为

本部分介绍了使用 Datastream 复制数据时 MySQL 源的行为。从 MySQL 数据库提取数据时,您可以使用基于 binlog 的复制或基于全局事务标识符 (GTID) 的复制。您可以在创建流时选择 CDC 方法。

基于二进制日志的复制

Datastream 可以使用二进制日志文件来记录 MySQL 数据库中的数据更改。然后,系统会将这些日志文件中包含的信息复制到目标位置,以重现源上所做的更改。

Datastream 中基于 binlog 的复制的主要特征包括:

  • 可以选择给定 MySQL 来源中的所有数据库或特定数据库,以及数据库或特定表中的所有表。
  • 复制所有历史数据。
  • 复制所有数据操纵语言 (DML) 变更,例如从指定数据库和表插入、更新和删除。
  • 仅复制已提交的更改。

基于全局事务标识符 (GTID) 的复制

Datastream 还支持基于全局标识符 (GTID) 的复制。

全局事务标识符 (GTID) 是一个唯一标识符,用于创建并关联到 MySQL 源上提交的每项事务。此标识符不仅对于其来源是唯一的,而且对于给定复制拓扑中的所有服务器也是唯一的,这与基于二进制日志的复制不同,在基于二进制日志的复制中,数据库集群中的每个节点都维护自己的二进制日志文件,并使用自己的编号。如果发生故障或计划内停机,维护单独的二进制日志文件和编号可能会成为问题,因为二进制日志连续性中断,基于二进制日志的复制会失败。

基于 GTID 的复制支持故障切换和自托管式数据库集群,并且无论数据库集群发生什么变化,都能继续正常运行。

Datastream 中基于 GTID 的复制的主要特征包括:

  • 可以选择给定 MySQL 来源中的所有数据库或特定数据库,以及数据库或特定表中的所有表。
  • 复制所有历史数据。
  • 复制所有数据操纵语言 (DML) 变更,例如从指定数据库和表插入、更新和删除。
  • 仅复制已提交的更改。
  • 无缝支持故障转移。

从基于二进制日志的复制切换到基于 GTID 的复制

如果您想更新数据流并从基于 binlog 的复制切换到基于 GTID 的复制,而无需执行回填,请执行以下步骤:

  1. 确保满足基于 GTID 的复制的所有要求。如需了解详情,请参阅配置源 MySQL 数据库
  2. (可选)创建并运行基于 GTID 的测试数据流。如需了解详情,请参阅创建数据流
  3. 创建基于 GTID 的数据流。先不要开始。
  4. 停止应用流量流向源数据库。
  5. 暂停现有的基于 binlog 的数据流。如需了解详情,请参阅暂停直播
  6. 等待几分钟,确保 Datastream 已赶上数据库。您可以在直播的直播详情页面上,通过监控标签页中的指标来查看此信息。数据新鲜度吞吐量的值需要为 0
  7. 启动基于 GTID 的数据流。如需了解详情,请参阅开始直播
  8. 恢复向源数据库发送的流量。

如果执行回填没有问题,您可以在 BigQuery 中截断表,删除旧数据流,然后启动新的回填数据流。如需详细了解如何管理回填,请参阅管理数据流对象的回填

版本

Datastream 支持以下版本的 MySQL 数据库:

  • MySQL 5.6
  • MySQL 5.7
  • MySQL 8.0
  • MySQL 8.4(仅支持基于 GTID 的复制)

Datastream 支持以下类型的 MySQL 数据库:

最佳做法

本部分介绍了有关如何配置 MySQL 源以供 Datastream 使用的建议最佳实践。

使用 GTID 实现高可用性设置

如果您的生产 MySQL 源使用副本或任何其他高可用性配置,请使用基于 GTID 的复制。

在数据库故障切换期间,基于 binlog 文件和位置的复制可能会中断,因为当主数据库发生故障时,新的主数据库具有不同的 binlog 历史记录。在这种情况下,Datastream 会丢失其位置,并且无法恢复。

GTID 会为整个复制拓扑(主数据库和副本数据库)中的每项事务分配一个唯一 ID。故障切换后,Datastream 可以从新主数据库上记录的最后一个 GTID 恢复,而无需知道二进制日志文件或位置。

建议:对于任何具有副本或高可用性配置的生产 MySQL 源,必须使用 GTID CDC 方法才能实现弹性可靠的数据复制。

合理调整只读副本的大小

如果您将 Datastream 配置为从只读副本进行复制,则可能会遇到双重延迟,即 MySQL 复制延迟(从主数据库到副本)和 Datastream 复制延迟(从副本到目标)的组合。为了节省费用,只读副本的资源(CPU、RAM、IOPS)通常比主数据库少,这可能会导致只读副本在写入量较高的时段落后于主数据库。

建议:将读取副本用作 Datastream 的来源时,请为其预配与主数据库相当的资源,以便副本能够跟上主数据库的写入吞吐量。

提高 binlog CDC 方法的吞吐量

如果您使用的是基于 binlog 的复制,并且由于源写入量大,导致生成的 binlog 文件速度快于单个任务的处理速度,从而导致延迟时间过长,请通过调整 maxConcurrentCdcTasks 参数来提高吞吐量。此参数用于控制一个流并行运行的 CDC 任务数。增加此参数的值可让 Datastream 同时处理更多 binlog 文件。

建议:如需确定合适的数据新鲜度值,请在高峰时段监控 MySQL 服务器的 binlog 生成速率。为此,您可以观察 MySQL 数据目录中创建和轮换新二进制日志文件的速率,也可以使用 MySQL 监控工具跟踪二进制日志的增长情况。例如,如果您的来源在高峰时段每分钟生成 10 个 binlog 文件,那么将 maxConcurrentCdcTasks 设置为 10-15 之类的值可让 Datastream 并行处理这些文件,从而防止积压。

您可以将 maxConcurrentCdcTasks 增加到支持的最大值 50,前提是源数据库的负载保持在可控范围内。如需了解详情,请参阅流并发控制

正确调整 max_allowed_packet 参数的大小

MySQL 中的默认 max_allowed_packet 设置(例如 16MB-64MB)可能过小。如果包含大型 BLOBJSONTEXT 类型字段的单行或单个大型事务超出此大小,MySQL 会终止 Datastream 连接,导致数据流因 Packet for query is too largeGot a packet bigger than 'max_allowed_packet' bytes 等错误而失败。

建议:将 MySQL 服务器上的 max_allowed_packet 参数设置为其最大允许值 1G。这样可确保服务器能够处理 Datastream 需要从 binlog 中读取的任何大型行或事务。

已知限制

将 MySQL 数据库用作来源的已知限制包括:

  • 数据流限 10,000 个表。
  • 主键定义为 INVISIBLE 的表无法回填。
  • 如果表中的行数超过 5 亿,则无法回填,除非满足以下条件:
    1. 该表具有唯一索引。
    2. 索引的任何列都不可为 null。
    3. 索引不是降序
    4. 索引的所有列都包含在流中。
  • Datastream 在处理事件时定期从来源提取最新的架构。如果架构发生变化,Datastream 会检测到架构变化并触发架构提取。不过,在架构提取之间,某些事件可能会被错误处理或被舍弃,从而导致数据差异。
  • 并非所有对源架构的更改都可以自动检测到,在这种情况下可能会发生数据损坏。以下架构更改可能会导致数据损坏或无法处理下游事件:
    • 删除列
    • 在表中间添加列
    • 更改列的数据类型
    • 对列重新排序
    • 删除表(如果同一表被重新创建并添加了新的数据,则与此相关)
    • 截断表
  • Datastream 不支持复制视图。
  • Datastream 不支持空间数据类型的列。这些列中的值将替换为 NULL 值。
  • Datastream 不支持数据类型为 DATETIMEDATETIMESTAMP 的列中的零值 (0000-00-00 00:00:00)。零值将替换为 NULL 值。
  • Datastream 不支持复制 JSON 列中包含以下值的行:DECIMALNEWDECIMALTIMETIME2DATETIMEDATETIME2DATETIMESTAMPTIMESTAMP2。包含此类值的事件会被舍弃。
  • Datastream 不支持二进制日志事务压缩
  • Datastream 不支持来源 MySQL 连接配置文件中的 SSL 证书链。仅支持单个 x509 PEM 编码证书。
  • Datastream 不支持级联删除。此类事件不会写入二进制日志,因此不会传播到目标位置。
  • Datastream 不支持 DROP PARTITION 操作。此类操作仅为元数据操作,不会进行复制。其他活动不受影响,并且直播成功运行。
  • 复制 FEDERATED 表时,您可能会遇到连接问题。如果发生这种情况,请从源数据库配置中移除所有 FEDERATED 表,并增加 connect_timeoutnet_read_timeoutmax_allowed_packet 参数的值,以缓解回填期间的超时问题。
  • Cloud SQL 企业 Plus 版实例必须使用基于 GTID 的复制,因为它们需要进行近乎零停机时间的维护。基于二进制日志的复制会在故障切换时中断,因此我们建议在高可用性用例中使用基于 GTID 的复制。
  • 对于 MySQL 8.0 及更高版本,binlog_row_value_options 变量必须设置为空值。对于大多数版本,此值为默认值,但对于某些版本(例如 Oracle Cloud Infrastructure (OCI) 上的 MySQL 来源),您必须明确设置此值。如需了解详情,请参阅配置自行管理的 MySQL 数据库

基于 GTID 的复制的其他限制

  • 仅在使用 Datastream API 时,才能恢复使用基于 GTID 的复制的数据流。
  • 不支持使用 CREATE TABLE ... SELECT 语句从其他表创建表。
  • Datastream 不支持带标记的 GTID。
  • 如需了解适用于基于 GTID 的复制的 MySQL 限制,请参阅 MySQL 文档

后续步骤