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 负载
- ✓ 对数据模型没有影响
- ✓ 可以捕获删除
- ✓ 可以捕获旧记录状态和更多元数据
- ✗ 更多设置步骤
- ✗ 需要更高的系统权限
- ✗ 对于某些专有数据库来说可能很昂贵
参考:
- Five Advantages of Log-Based Change Data Capture 来自 Gunnar
莫林
- 不再孤岛:如何将您的数据库与 Apache 集成
Kafka 和 CDC 作者 Robin Moffatt
- 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?
是的,如果您需要构建新的副本,您需要获取源数据库的快照并将其导入副本。每一步都需要时间:
- 创建源的快照
- 将快照传输到副本所在的主机
- 将快照导入副本实例
多长时间取决于数据库的大小,但可以是数小时甚至 天。在等待时,用户不能使用副本数据库,至少如果他们希望他们的查询分析源数据的完整副本,则不能。他们必须等待导入完成。
我一直在尝试使用 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 byJDBC Source Connector
)?
基于查询的 CDC:
- ✓ 通常更容易设置
- ✓ 需要较少的权限
- ✗ 轮询数据库的影响
- ✗ 需要源架构中的特定列来跟踪更改
- ✗ 无法跟踪删除
- ✗ 无法在轮询间隔 之间跟踪多个事件
基于日志的 CDC:
- ✓ 捕获所有数据更改
- ✓ 事件延迟低,同时避免增加 CPU 负载
- ✓ 对数据模型没有影响
- ✓ 可以捕获删除
- ✓ 可以捕获旧记录状态和更多元数据
- ✗ 更多设置步骤
- ✗ 需要更高的系统权限
- ✗ 对于某些专有数据库来说可能很昂贵
参考:
- Five Advantages of Log-Based Change Data Capture 来自 Gunnar 莫林
- 不再孤岛:如何将您的数据库与 Apache 集成 Kafka 和 CDC 作者 Robin Moffatt
- 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?
是的,如果您需要构建新的副本,您需要获取源数据库的快照并将其导入副本。每一步都需要时间:
- 创建源的快照
- 将快照传输到副本所在的主机
- 将快照导入副本实例
多长时间取决于数据库的大小,但可以是数小时甚至 天。在等待时,用户不能使用副本数据库,至少如果他们希望他们的查询分析源数据的完整副本,则不能。他们必须等待导入完成。