MySQL 5.7下主从复制延迟解决方案

在MySQL下主从复制的延迟问题一直是在业界内比较大的困扰,主从的延迟会因为受到网络磁盘等等相关的因素影响,但其中最主要的影响是就是在master太过繁忙的写入导致slave无法有效的从relay_log中读取到最新的相关记录,这样对于数据实时性很高的业务来说slave的数据并不是最新的有一定的延时,此时使用主从的读写分离就有点显的鸡肋了,不能做到slave上能查到最新的实时数据,大多在slave上都是做一些对实时数据要求并不是很高的一些数据查询。

而到了MySQL的5.6版本开始引入多线程的主从复制的机制,众所周知MySQL的工作方式是单进程多线程的方式,那么线程的多寡则会极大的影响到MySQL的效率,而在早期MySQL的主从都是由单线程进行的,使得主从复制除了相关的客观因素外还受到自身的影响。但是在MySQL 5.6下多线程主从复制并不是做的相当完善的,因为在MySQL 5.6中主从复制的多线程是一个线程处理一个主从复制,而在绝大多数的生产环境中大多都是在一个数据库中做大量的操作的,那么这样MySQL的多线程主从复制就又和以前的版本一样都是单线程的主从复制,没有太大的实际意义。为此在MySQL的5.7版本中对多线程主从复制来进一步的改善,在MySQL 5.7中是按照逻辑时钟(类似CPU的处理机制)来处理多线程,甚至在半同步复制semisync中还是使用Performance Schema表来监控复制线程,所以在MySQL 5.7中主从复制直接因为MySQL自身导致的延时被极大的降低了,配置也很简单,如下在salve中配置:

mysql> show global variables like ‘slave_parallel_workers‘;#默认是0,即单线程
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| slave_parallel_workers | 0     |
+------------------------+-------+
1 row in set (0.01 sec)
mysql> set global slave_parallel_workers = 4;#根据实际情况决定开启多少个线程用于主从复制
1 row in set (0.01 sec)
mysql> show global variables like ‘%slave_parallel_type%‘;#默认是多线程机制是一个线程处理一个库
+---------------------+----------+
| Variable_name       | Value    |
+---------------------+----------+
| slave_parallel_type | DATABASE |
+---------------------+----------+
1 row in set (0.01 sec)
mysql> stop slave;#修改多线程机制工作类型需要停止slave
Query OK, 0 rows affected (0.21 sec)
mysql> set global slave_parallel_type=‘logical_clock‘;
1 row in set (0.01 sec)
mysql> start slave;    
Query OK, 0 rows affected (0.08 sec)

此时再根据实际情况决定开启多少个线程用于主从复制,此时在看下slave上的线程列表:

mysql> show full processlist;
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| Id | User        | Host      | db   | Command | Time | State                                                  | Info                  |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| 16 | root        | localhost | NULL | Query   |    0 | starting                                               | show full processlist |
| 29 | system user |           | NULL | Connect |    3 | Waiting for master to send event                       | NULL                  |
| 30 | system user |           | NULL | Connect |    3 | Slave has read all relay log; waiting for more updates | NULL                  |
| 31 | system user |           | NULL | Connect |    3 | Waiting for an event from Coordinator                  | NULL                  |
| 32 | system user |           | NULL | Connect |    3 | Waiting for an event from Coordinator                  | NULL                  |
| 33 | system user |           | NULL | Connect |    3 | Waiting for an event from Coordinator                  | NULL                  |
| 34 | system user |           | NULL | Connect |    3 | Waiting for an event from Coordinator                  | NULL                  |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
7 rows in set (0.00 sec)

这样就成功的开启MySQL的5.7版本多线程主从复制,在配置好后在slave的datadir目录下会有根据slave_parallel_workers设置的线程数个数相同的线程文件:

最后再把配置好的变量参数写入my.cnf,使得下一次重启生效:

slave_parallel_workers = 4
slave_parallel_type= logical_clock
时间: 2024-12-24 13:36:42

MySQL 5.7下主从复制延迟解决方案的相关文章

MySql从服务器延迟解决方案

在从服务器上执行show slave status;可以查看到很多同步的参数,我们需要特别注意的参数如下:Master_Log_File:                      SLAVE中的I/O线程当前正在读取的主服务器二进制日志文件的名称Read_Master_Log_Pos:        在当前的主服务器二进制日志中,SLAVE中的I/O线程已经读取的位置Relay_Log_File:                        SQL线程当前正在读取和执行的中继日志文件的名称R

怎样解决MySQL数据库主从复制延迟的问题

像Facebook.开心001.人人网.优酷.豆瓣.淘宝等高流量.高并发的网站,单点数据库很难支撑得住,WEB2.0类型的网站中使用MySQL的居多,要么用MySQL自带的MySQL NDB Cluster(MySQL5.0及以上版本支持MySQL NDB Cluster功能),或者用MySQL自带的分区功能(MySQL5.1及以上版本支持分区功能),我所知道的使用这两种方案的很少,一般使用主从复制,再加上MySQL Proxy实现负载均衡.读写分离等功能,在使用主从复制的基础上,再使用垂直切分

MySQL Replication 主从复制全方位解决方案

原文:MySQL Replication 主从复制全方位解决方案 1.1 主从复制基础概念 在了解主从复制之前必须要了解的就是数据库的二进制日志(binlog),主从复制架构大多基于二进制日志进行,二进制日志相关信息参考:http://www.cnblogs.com/clsn/p/8087678.html#_label6 1.1.1 二进制日志管理说明 二进制日志在哪?如何设置位置和命名? 在my.cnf文件中使用 log-bin = 指定:命名规则为 mysql-bin.000000 (后为6

怎样解决MySQL数据库主从复制延迟的问题?

1.网络超时 2.慢查询 3.流量 问题一:主库的从库太多,导致复制延迟从库数据以3-5个为宜,要复制的从节点数量过多,会导致复制延迟问题二:从库硬件比主库差,导致复制延迟查看Master和Slave的系统配置,可能会因为机器配置不当,包括磁盘I/O.CPU.内存等各方面因素造成复制的延迟.一般发生在高并发大数据量写入场景中问题三:慢SQL语句过多假如一条SQL语句执行时间是20秒,那么从执行完毕到从库上能查到数据至少需要20秒,这样就延迟20秒了.一般要把SQL语句的优化作为常规工作不断地进行

MySQL数据库运维之主从复制延迟问题排查

上篇文章介绍了单机环境下的MySQL主从异步复制和主从半同步复制的搭建过程.搭建过程很简单,但是在实际使用过程中,更多的是解决问题,本篇文章将介绍一下MySQL主从复制中常见的问题以及如何定位问题和如何解决问题. 一.从库复制延迟问题 1.可能的原因如下(1)主从服务器处于不同的网络之中,由于网络延迟导致:(2)主从服务器的硬件配置不同,从服务器的硬件配置(包括内存,CPU,网卡等)远低于主服务器:(3)主库上有大量的写入操作,导致从库无法实时重放主库上的binlog:(4)主库上存在着大事务操

Navicat MySQL连接Linux下MySQL的问题解决方案

Error1: 2003:Can't connect to MySQL server on 'localhost' 解决方法:关闭Linux的防火墙功能. Linux代码   #chkconfig iptables off #reboot Error2: 1130 - Host'ClientIP' is not allowed to connect to this MySQL server 解决方法:使用root用户登陆Linux,更改容许登陆的IP地址范围. Mysql代码   mysql>g

linux下mysql基于mycat做主从复制和读写分离之基础篇

Linux下mysql基于mycat实现主从复制和读写分离1.基础设施 两台虚拟机:172.20.79.232(主) 172.20.79.233(从) 1.1软件设施 mysql5.6.39 , mycat1.6-RELEASE jdk1.7及其以上版本2.实现步骤一(mycat实现读写分离) 1.首先在两台服务器安装mysql 1.下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rp

mysql 主从复制延迟及解决

qps 每秒处理的查询数tps 每秒处理的事务数IOPS,每秒磁盘进行的I/O操作次数 一 延迟的原因 主库并发量大,而从库复制是单线程,从库过多,主从系统配置不当,cpu,内存等,慢sql过大多,大的事物,网络延迟,跨公网的主从复制很容易导致主从复制延迟 二解决方法 1.适当数量的从库,3-5个,从库配置更好的硬件,网络配置等 2.将大事物拆分成多个小事物进行提交,表加主键,否在会全表扫描 3.mysql 5.7.19 + 版本支持并行复制 # slave 从表配置 slave-paralle

MySQL 主从复制延迟问题

导致主从复制延迟的原因: (1) 主库的从库太多,导致复制延迟(2) 从库硬件比主库差,导致复制延迟(3) 慢 SQL 语句过多,导致复制延迟(4) 主从复制的设计问题,导致复制延迟(5) 主从库之间的网络延迟,导致复制延迟(6) 主库读写压力大,导致复制延迟