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

MySQL多线程复制

原创 谭磊Terry 恩墨学院 2022-05-20
256

LOGICAL_CLOCK 多线程复制

原理

  • 拥有相同 last_committed 值的事务可以进行并行回放
  • last_committed 值是主库事务在进入 prepare 阶段时获取的已提交事务的最大 sequence_number 值,这个值称为此事务的 commit-parent,被记录在二进制日志中,当从库回放时,如果两个事务有同一个 commit-parent,它们可以并行执行
  • 这种方法大幅提高了从库复制的效率,允许并行回放的粒度细化到事务级别,甚至可以说细化到行级别(每个事务只修改一行数据)。但是,可以并行回放的事务必须具备相同的last_committed值,即使两个事务的数据完全不相关,如果last_committed值不相同,也不能并行重放,而有多少事务具有相同的 last_committed 值,则由主库瞬时并发请求的数量而定(binlog_group_commit_sync_no_delay_count = 0 时一般建议为10)

系统变量配置

  • 主库
slave_parallel_type = LOGICAL_CLOCK
  • 从库
slave_perserver_commit_order = 1
slave_parallel_workers = 8|16
slave_parallel_type = LOGICAL_CLOCK

 

WRITESET 多线程复制

原理

  • WRITESET 多线程复制 是在大于等于 MySQL 5.7.22 版本,对于 LOGICAL_CLOCK 多线程复制的优化。优化之后,只要不同事务的修改记录不重叠,就可以在从库中并行回放,通过计算每行记录的哈希值(hash)来确定是否为相同的记录,该哈希值就是 WRITESET 的值。
  • WRITESET 多线程复制 对 LOGICAL_CLOCK 多线程复制的优化,是在事务写二进制日志时对 last_committed 值的计算做了大量优化。在采用默认的 COMMIT_ORDER 依赖模式的多线程复制,主库在生成二进制日志时,只有同一时间提交的事务生成的 last_committed 值才相同,但实际上不同时间提交的事务也有不存在锁冲突的可能,要实现在主库中生成二进制日志时,在不同时间提交的且不存在锁冲突的事务生成相同的 last_committed
  • 通过唯一索引或者主键来区分不同的记录,然后和行记录的库表属性以及数据属性一起计算哈希值,计算出来的 WRITESET 值存放在一张哈希表中。如果后面新事务的行记录计算出的哈希值在哈希表中无匹配记录,那么此新事务不会产生新的 last_committed 值,就相当于新事务和之前的事务被归并到同一个 Binlog Group,即新旧事务的 last_committed 值相同。具体计算公式如下:
WRITESET = hash(index_name,db_name,db_name_length,table_name,table_name_length,value,value_length)
  • 根据系统变量 binlog_transaction_dependency_tracking 的设置,采用不同的依赖模式生成 last_committed 值。
  • 使用 WRITESET 多线程复制时,如果主库中具有高并发的事务且这些事务具备“短、平、快”特性,则 WRITESET 多线程复制中的 WRITESET、WRITESET_SESSION 依赖模式与默认的 COMMIT_ORDER 相比,对从库的多线程复制效率并没有太大提高,如果主库中有高并发的事务且这些事务中大事务居多,则使用 COMMIT_ORDER 依赖模式时,二进制日志中的 last_committed 值的重复率可能不够高,导致从库多线程复制的效率大大降低。在这种情况下,使用 WRITESET 多线程复制中的 WRITESET、WRITESET_SESSION 依赖模式能够大大提高主库二进制日志中 last_committed 值的重复率,大幅提高从库的多线程复制效率。即便如此,也不建议在MySQL写入大事务,过大的事务在从库的协调器线程做事务分发时极易称为瓶颈,进而使多线程复制的效率能以提高,而且大事务还会带来诸多负面影响。

不可用情景

  • DDL语句
  • 会话当前生效的哈希算法
  • 事务更新了被外键关联的字段。

系统变量配置

  • 主库
slave_parallel_type = LOGICAL_CLOCK
transaction_write_set_extraction = XXHASH64
# WRITESET和WRITESET_SESSION两个值任意设置一个即可,WRITESET_SESSION依赖模式与 WRITESET 依赖模式相比,前者表示在厚着基础上,保证同一个会话内事务不可并行
binlog_transaction_dependency_tracking = WRITESET|WRITESET_SESSION
binlog_transaction_dependency_history_size = 25000
  • 从库
slave_perserver_commit_order = 1
slave_parallel_workers = 8|16
slave_parallel_type = LOGICAL_CLOCK
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论