MySQL 的 MTS
MTS based on schema
涉及不同 schema 的 DML 操作,在 slave 端可以按 schema 粒度并行回放,弱点也很明显,如果实例中的 schema 较少,并行回放效果并不理想。其优化方式也比较简单 slave_parallel_workers 小于等于 master 的 schema 数量。
LOGICAL_CLOCK并行复制
参数 slave-parallel-type 来控制并行复制策略,配置为 LOGICAL_CLOCK。
在 binlog 中每个事务会有多出两个标签:
sequence_number:随每个事务递增的自增 ID,每次新的 binlog 会从 1 开始;
last_committed:当前事务所依赖的上次事务的 sequence_number,每次新的 binlog 会从 0 开始。
#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 并行执行。
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:
binlog_format=row 开启 transaction_write_set_extraction=XXHASH64 更新表必须有主键,如果更新事务包含外键,则退回 commit_order 方式 binlog_transaction_dependency_tracking = [COMMIT_ORDER | WRITESET | WRITESET_SESSION]
本文作者:饶茂林(上海新炬王翦团队)
本文来源:“IT那活儿”公众号
免责声明:
1、本站资源由自动抓取工具收集整理于网络。
2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。
3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。
4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。
5、如果您喜欢本资源,请您支持作者,购买正版内容。
6、资源失效,请下方留言,欢迎分享资源链接
文章评论