MySQL 的 MTS

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!! 

  
Mysql的并行复制技术演变,mysql并行复制enhanced multi-threaded slave, 5.6是基于schema并行,到5.7的group commit在这之前redo log和binlog串行刷盘很影响性能,group commit出现将事务分组,组内的binlog刷盘动作交给一个事务进行,实现组提交目的,通过redo log和binlog的组提交解决磁盘IO的性能。


MTS based on schema

涉及不同 schema 的 DML 操作,在 slave 端可以按 schema 粒度并行回放,弱点也很明显,如果实例中的 schema 较少,并行回放效果并不理想。其优化方式也比较简单 slave_parallel_workers 小于等于 master 的 schema 数量。

LOGICAL_CLOCK并行复制

参数 slave-parallel-type 来控制并行复制策略,配置为 LOGICAL_CLOCK。

原理:redo log组提交(group commit)策略,为同一组一起提交的事务维护一个commit_id,并写入binlog日志。日志传到备库后,coordinator会以轮询的方式将相同commit_id的事务分发到多个worker执行,待一组执行完成后,再取下一批。

在 binlog 中每个事务会有多出两个标签

  • sequence_number:随每个事务递增的自增 ID,每次新的 binlog 会从 1 开始;

  • last_committed:当前事务所依赖的上次事务的 sequence_number,每次新的 binlog 会从 0 开始。

last_committed 相同值的事务代表同时提交的,可以并行回放。
#180105 20:08:33 ... last_committed=7201 sequence_number=7203
#180105 20:08:33 ... last_committed=7203 sequence_number=7204
#180105 20:08:33 ... last_committed=7203 sequence_number=7205
#180105 20:08:33 ... last_committed=7203 sequence_number=7206
#180105 20:08:33 ... last_committed=7205 sequence_number=7207

  • 7203 事务依赖 7201;
  • 7204、7205、7206 事务依赖 7203,可以并行提交;
  • 7207 事务依赖 7205,由于 7205 依赖 7203,那么在 7205 执行完后,7207 可以和 7206 并行执行。
优化方式通过调整 master group commit size 和 slave 的并行 work 线程数,提升并行效率。
master group commit size 和并发压力,master group commit size主要跟下面两个参数相关:
  • binlog_group_commit_sync_delay

    表示 binlog 提交事务前等待多少微秒;

  • binlog_group_commit_sync_no_delay_count

    表示同步队列最大允许的事务数,当等待提交的线程达到多少时, 就不在等待,在 master 低并发的负载下,并行回放效果就不好了,如果想要提高并行度,需要增加 binlog_group_commit_sync_delay,积累较多的分组大小,副作用是拉低 master 吞吐量。

Write set

上述基于组提交的并行存在一些问题,组提交的理论依据是如果多个事务他们能在同一时间内提交,这个就间接说明了这个几个事务锁上是没有冲突的,也是就说他们各自持有不同的锁,互不影响;逻辑上可以把这几个事务看成一个组,在slave以“组”为单位分配给sql线程执行,这样多个sql线程就可以并行跑了。所以它要求库上要有一定的并发度,不然就有可能变成每个组里面只有一个事务,这样就有串行没什么区别了。

writeset就解决了上述的问题,如果两次修改的数据没有冲突,就会打包到一个组里面并行回放,WriteSet通过检测两个事务是否更新了相同的记录来判断事务能否并行回放的,因此需要在运行时保存已经提交的事务信息以记录历史事务更新了哪些行。记录历史事务的参数为binlog_transaction_dependency_history_size。该值越大可以记录更多的已经提交的事务信息,不过需要注意的是,这个值并非指事务大小,而是指追踪的事务更新信息的数量。

开启writeset:

  • binlog_format=row
  • 开启 transaction_write_set_extraction=XXHASH64
  • 更新表必须有主键,如果更新事务包含外键,则退回 commit_order 方式
  • binlog_transaction_dependency_tracking = [COMMIT_ORDER | WRITESET | WRITESET_SESSION]
slave 上开启 slave_parallel_workers。

本文作者:饶茂林(上海新炬王翦团队)

本文来源:“IT那活儿”公众号


免责声明:

1、本站资源由自动抓取工具收集整理于网络。

2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

5、如果您喜欢本资源,请您支持作者,购买正版内容。

6、资源失效,请下方留言,欢迎分享资源链接

文章评论

0条评论