【MySQL】开启并行复制
发布日期:2021-09-30 14:06:47 浏览次数:4 分类:技术文章

本文共 1686 字,大约阅读时间需要 5 分钟。

一、介绍

在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。

如果备库执行日志的速度持续低于主库生成日志的速度,那么主从延迟就有可能成了小时级别。而且对于一个压力持续比较高的主库来说,备库很可能永远都追不上主库。

1>MySQL 5.6版本的并行复制策略

官方 MySQL5.6 版本,支持了并行复制,只是支持的粒度是按库并行。这个策略的并行效果,取决于压力模型。如果在主库上有多个 DB,并且各个 DB 的压力均衡,使用这个策略的效果会很好。

优点:实现逻辑简单,binlog格式同时支持statement和row。

缺点:如果热点数据在同一个DB,则没有并行效果了。另外在企业级架构设计时,DBA会用多实例单库(共享存储,多个mysql实例)的模式来分解多个DB的并行压力。

2>MySQL 5.7版本的并行复制策略

在官方的 MySQL5.7 版本中,由参数 slave-parallel-type 来控制并行复制策略:

  1. 配置为 DATABASE,表示使用 MySQL 5.6 版本的按库并行策略;
  2. 配置为 LOGICAL_CLOCK,代表 MySQL 5.7 这个引入的新的并行策略。

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

MySQL 5.7.22 版本里,MySQL 增加了一个新的并行复制策略,基于 WRITESET 的并行复制。新增了一个参数 binlog-transaction-dependency-tracking,用来控制是否启用这个新策略,默认为commit_order,即上面介绍的这种。

二、开启并行复制

 

mysql> stop slave sql_thread;mysql> set global slave_parallel_type='LOGICAL_CLOCK';mysql> set global slave_parallel_workers=8;mysql> set global binlog_transaction_dependency_tracking=COMMIT_ORDER;mysql> start slave sql_thread;

注意

在MySQL 5.7.22中,默认binlog_transaction_dependency_tracking=commit_order,但是slave_parallel_type=database,此时我们以slave_parallel_type=database为准。

三、优化选项

1>设置并发线程数

slave_parallel_workers

建议把这个值设置为 8~16 之间最好(32 核物理机的情况),毕竟备库还有可能要提供读查询,不能把 CPU 都吃光了。

2>binlog组提交控制

binlog_group_commit_sync_delay 参数,表示延迟多少微秒后才调用 fsync;

binlog_group_commit_sync_no_delay_count 参数,表示累积多少次以后才调用 fsync。

这两个参数是用于故意拉长 binlog 从 write 到 fsync 的时间,以此减少 binlog 的写盘次数。在 MySQL 5.7 的并行复制策略里,它们可以用来制造更多的“同时处于 prepare 阶段的事务”。这样就增加了备库复制的并行度。

也就是说,这两个参数,既可以“故意”让主库提交得慢些,又可以让备库执行得快些。在 MySQL 5.7 处理备库延迟的时候,可以考虑调整这两个参数值,来达到提升备库复制并发度的目的。

 

 

 

转载于:https://my.oschina.net/u/3478888/blog/3004146

转载地址:https://blog.csdn.net/imliuqun123/article/details/113568813 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【Nginx】configure 报错checking for C compiler … not found
下一篇:【MySQL】一些配置上的优化技巧

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月14日 11时29分49秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【大话Mysql面试】-Mysql事务以及隔离级别 2019-04-26
【大话Mysql面试】-Mysql索引 2019-04-26
【大话Mysql面试】-Mysql锁 2019-04-26
【大话Mysql面试】-Mysql常见面试题目 2019-04-26
08 【多线程高并发】Java线程间通信的方式 2019-04-26
【数据结构与算法】什么是跳表?通俗易懂来理解跳表 2019-04-26
【数据结构与算法】什么是图?图是什么?快速带你回顾图有关的知识点 2019-04-26
【数据结构与算法】什么是串?什么是KMP算法?字符串匹配是什么? 2019-04-26
【数据结构与算法】什么是布隆过滤器?如何防止缓存穿透的问题? 2019-04-26
【Java锁体系】CopyOnWriteArrayList是什么?线程安全的arraylist是哪个? 2019-04-26
【面试题目】Java设计模式你有哪些了解?说几个常用的。 2019-04-26
【计算机操作系统】常说的死锁是什么?死锁产生的必要条件是什么?死锁的解决策略是什么? 2019-04-26
【计算机操作系统】进程管理详解?进程与线程区别是什么?进程调度的算法有哪些?进程通信有哪些? 2019-04-26
【计算机操作系统】虚拟内存是什么?分页系统地址映射?页面置换算法有哪些?分段地址映射又是什么? 2019-04-26
【计算机操作系统】设备管理?磁盘结构是怎么样的?磁盘调度算法有哪些? 2019-04-26
【多线程高并发】为什么要使用多线程?创建多少个线程合适呢? 2019-04-26
【多线程与高并发】 Java两个线程轮流打印1-100两个数?多线程轮流打印数字? 2019-04-26
【多线程与高并发】 Java两个线程轮流打印字符串? 2019-04-26
【Linux命令篇】Linux命令实践 2019-04-26
【Leetcode单调队列】Leetcode239 滑动窗口最大值 2019-04-26