暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL主备并行复制方案的演进与优化

44

MySQL主备复制的并行复制实现方法

在 MySQL 中,主备复制(Replication)的并行复制(Parallel Replication)是指备库(Slave)可以并行应用主库(Master)的二进制日志(Binary Log)中的事务,从而提高复制的效率。以下是实现并行复制的几种方法:

  • MySQL 5.6 基于库级别的并行复制方案
  • MySQL 5.7 基于逻辑时钟(组提交)的并行复制方案
  • MySQL 8.0 基于 WRITESET 的并行复制方案

导致主从延迟的一个常见原因是,对于 binlog 中的事务,从库上只有一个 SQL 线程进行重放,而这些事务在主库中是并发写入的。

主从延迟带来的问题,主要体现在以下两个方面:

  • 1、对于读写分离的业务,主从延迟意味着业务会读到旧数据。
  • 2、主从延迟过大,会影响数据库的高可用切换。这一点尤其需要注意。
    如果等待从库应用完差异的 binlog 才做切换,无疑会影响数据库服务的可用性。如果不等待,直接切换,则意味着没应用完的这部分 binlog 的数据会丢失。

基于库级别的并行复制(Database-Based Parallel Replication)

MySQL 5.6 引入了库级别的并行复制(schema-based parallel replication),即主库上同时修改不同数据库的事务可以在从库上并行应用。这种方式的局限在于,只能并行执行不同数据库的事务,如果多个事务作用于同一个库,它们仍然是串行执行。

  • 原理:将不同数据库的事务分配到不同的工作线程中并行执行。
  • 配置
    • 在 MySQL 5.6 及以上版本中,可以通过设置 slave_parallel_workers 参数启用并行复制。
    • 设置 slave_parallel_typeDATABASE
  • 示例
    SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'DATABASE';
    复制
  • 适用场景:适用于多个数据库之间没有事务依赖的情况。

基于逻辑时钟的并行复制(Logical Clock-Based Parallel Replication)

MySQL 5.7 增强了并行复制,增加了组提交(group commit)功能。事务在主库提交时,如果有多个事务同时准备提交,它们会被作为一个组提交。在从库上,这些事务组也可以并行应用,提升复制性能。MySQL 5.7版本中的slave-parallel-type参数可以控制并行复制策略的选择,如DATABASE(按数据库分发)、LOGICAL_CLOCK(同时处于prepare状态的事务可以同时执行)等。

  • 原理:通过逻辑时钟(Logical Clock)判断事务之间的依赖关系,将没有依赖关系的事务并行执行。
  • 配置
    • 在 MySQL 5.7 及以上版本中,设置 slave_parallel_typeLOGICAL_CLOCK
    • 设置 slave_parallel_workers 参数指定并行工作线程数。
  • 示例
    SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
    复制
  • 适用场景:适用于单数据库或多数据库中有事务依赖的情况。

基于 WRITESET 的并行复制(WRITESET-Based Parallel Replication)

MySQL 8.0 增加了新的并行复制策略,通过binlog-transaction-dependency-tracking来控制。例如

  • COMMIT_ORDER 表示按照同时处于prepare状态来判断是否并行的策略;
  • WRITESET 表示事务更新的每一行,计算其hash,组成writeset集合,如果两个事务的writeset集合没有交集,则可以并行;
  • WRITESET_SESSION 表示在主库同一线程先后执行的两个事务,在备库执行的时候,要保证相同的先后顺序。

  • 原理:通过分析事务的写集(WRITESET)判断事务之间的冲突,将没有冲突的事务并行执行。
  • 配置
    • 在 MySQL 8.0 及以上版本中,设置 slave_parallel_typeLOGICAL_CLOCK
    • 启用 binlog_transaction_dependency_tracking 参数,并设置为 WRITESET
    • 设置 slave_parallel_workers 参数指定并行工作线程数。
  • 示例
    SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK'; SET GLOBAL binlog_transaction_dependency_tracking = 'WRITESET';
    复制
  • 适用场景:适用于高并发写入场景,能够更精细地判断事务依赖关系。

配置步骤

  1. 停止复制
    STOP SLAVE;
    复制
  2. 设置并行复制参数
    • 对于基于数据库的并行复制:
      SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'DATABASE';
      复制
    • 对于基于逻辑时钟的并行复制:
      SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
      复制
    • 对于基于 WRITESET 的并行复制:
      SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK'; SET GLOBAL binlog_transaction_dependency_tracking = 'WRITESET';
      复制
  3. 启动复制
    START SLAVE;
    复制

监控并行复制

  • 使用以下命令查看并行复制的工作状态:
    SHOW SLAVE STATUS\G;
    复制
  • 查看并行工作线程的状态:
    SELECT * FROM performance_schema.replication_applier_status_by_worker;
    复制

总结

  • 基于库级别的并行复制:适用于多数据库场景。
  • 基于逻辑时钟(组提交)的并行复制:适用于单数据库或多数据库中有事务依赖的场景。
  • 基于 WRITESET 的并行复制:适用于高并发写入场景,能够更精细地判断事务依赖关系。

根据实际业务需求选择合适的并行复制方式,并合理配置 slave_parallel_workersslave_parallel_type 参数,可以有效提高 MySQL 主备复制的性能。

MySQL 并行复制方案演进历史及原理分析

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论