MYSQL 数据流中 Binary Log 的可用性:优缺点是什么?

Usability of Binary Log in data streaming in MYSQL: What are the drawbacks and advantages?

我一直在尝试使用 Kafka 连接从 MySQL 中读取数据,使用 MySQL 数据库源连接器和 bin 日志的 debezium 连接器。我试图了解什么是提取更改数据的更好方法。 Bin 日志有写入日志等的开销,而从数据库读取有查询数据库的开销。与这两种方法相关的其他主要优点和缺点是什么?什么是捕获变更数据的更好方法?同样从 MySQL 8 开始,默认启用 bin 日志。这是否意味着它可能是更好的做事方式?

这道题可以概括为:

What are the pros and cons of a log-based CDC (represented by Debezium Connector) versus a polling-based CDC (represented by JDBC Source Connector)?

基于查询的 CDC:

  • ✓ 通常更容易设置
  • ✓ 需要较少的权限
  • ✗ 轮询数据库的影响
  • ✗ 需要源架构中的特定列来跟踪更改
  • ✗ 无法跟踪删除
  • ✗ 无法在轮询间隔
  • 之间跟踪多个事件

基于日志的 CDC:

  • ✓ 捕获所有数据更改
  • ✓ 事件延迟低,同时避免增加 CPU 负载
  • ✓ 对数据模型没有影响
  • ✓ 可以捕获删除
  • ✓ 可以捕获旧记录状态和更多元数据
  • ✗ 更多设置步骤
  • ✗ 需要更高的系统权限
  • ✗ 对于某些专有数据库来说可能很昂贵

参考:

  1. Five Advantages of Log-Based Change Data Capture 来自 Gunnar 莫林
  2. 不再孤岛:如何将您的数据库与 Apache 集成 Kafka 和 CDC 作者 Robin Moffatt
  3. Whosebug:

@Iskuskov Alexander 给出的列表很棒。我还要补充几点:

  • 基于日志的 CDC 也需要写入日志(您在问题中提到了这一点)。这不仅对性能有开销,而且对存储也有开销 space.

  • 基于日志的 CDC 需要连续的日志流。如果 CDC 遗漏了一个日志,那么副本就无法保持同步,整个副本必须被一个由数据库的新快照初始化的新副本替换。

  • 如果您的 CDC 定期离线,这意味着您需要保留日志直到 CDC 运行,这很难预测会持续多长时间。这导致需要更多存储空间 space.

也就是说,基于查询的 CDC 有其自身的缺点。在我的公司,我们使用过基于查询的 CDC,但我们发现它很不方便,我们正在努力将其替换为基于 Debezium 日志的解决方案。由于其他答案中的许多原因,还有:

  • 基于查询的 CDC 很难使模式更改与副本保持同步,因此如果源数据库中发生模式更改,可能需要删除副本并用新的副本替换快照。

  • 副本经常处于“重建”状态数小时,此时需要从快照重新初始化,用户不喜欢这种停机时间。快照传输也会增加网络带宽要求。

两种解决方案都不比另一种“更好”。两者各有利弊。作为工程师,您的工作是 select 选择最适合您项目要求的选项。换句话说,选择缺点最不符合您需求的那个。

我们无法为您做出选择,因为您比我们更了解您的项目。


回复您的评论:

启用二进制日志对读查询没有开销,但对写查询有很大的开销。 MySQL 8.0 中的开销变得更大,由 Percona 首席技术官 Vadim Tkachenko 测量并在此处报告:https://www.percona.com/blog/2018/05/04/how-binary-logs-affect-mysql-8-0-performance/

他得出结论,MySQL 5.7 的二进制日志开销约为 13%,MySQL 8.0 的开销高达 30%。

Can you also explain "The replica is frequently in a "rebuilding" state for hours, when it needs to be reinitialized from a snapshot"? Do you mean building a replication database?

是的,如果您需要构建新的副本,您需要获取源数据库的快照并将其导入副本。每一步都需要时间:

  1. 创建源的快照
  2. 将快照传输到副本所在的主机
  3. 将快照导入副本实例

多长时间取决于数据库的大小,但可以是数小时甚至 。在等待时,用户不能使用副本数据库,至少如果他们希望他们的查询分析源数据的完整副本,则不能。他们必须等待导入完成。