MySQL主从同步延迟的原因及解决办法

一、主从数据库的区别
从数据库(Slave)是主数据库的备份,当主数据库(Master)变化时从数据库要更新,这些数据库软件可以设计更新周期 。这是提高信息安全的手段 。主从数据库服务器不在一个地理位置上,当发生意外时数据库可以保存 。
(1) 主从分工
其中Master负责写操作的负载,也就是说一切写的操作都在Master上进行,而读的操作则分摊到Slave上进行 。这样一来的可以大大提高读取的效率 。在一般的互联网应用中,经过一些数据调查得出结论,读/写的比例大概在 10:1左右,也就是说大量的数据操作是集中在读的操作,这也就是为什么我们会有多个Slave的原因 。但是为什么要分离读和写呢?熟悉DB的研发人员都知道,写操作涉及到锁的问题,不管是行锁还是表锁还是块锁,都是比较降低系统执行效率的事情 。我们这样的分离是把写操作集中在一个节点上,而读操作其其他的N个节点上进行,从另一个方面有效的提高了读的效率,保证了系统的高可用性 。
(2) 基本过程
1)、MySQL的主从同步就是当master(主库)发生数据变化的时候,会实时同步到slave(从库) 。
2)、主从复制可以水平扩展数据库的负载能力,容错,高可用,数据备份 。
3)、不管是delete、update、insert,还是创建函数、存储过程,都是在master上,当master有操作的时候,slave会快速的接受到这些操作,从而做同步 。
(3) 用途和条件
1)、mysql主从复制用途
●实时灾备,用于故障切换
●读写分离,提供查询服务
●备份,避免影响业务
2)、主从部署必要条件:
●主库开启binlog日志(设置log-bin参数)
●主从server-id不同
●从库服务器能连通主库
二、主从同步的粒度、原理和形式:
(1)、 三种主要实现粒度
详细的主从同步主要有三种形式:statement、row、mixed
 1)、statement: 会将对数据库操作的sql语句写道binlog中
 2)、row: 会将每一条数据的变化写道binlog中 。
3)、mixed: statement与row的混合 。Mysql决定何时写statement格式的binlog, 何时写row格式的binlog 。
(2)、主要的实现原理、具体操作、示意图
1)、在master机器上的操作:
当master上的数据发生变化时,该事件变化会按照顺序写入bin-log中 。当slave链接到master的时候,master机器会为slave开启binlog dump线程 。当master的binlog发生变化的时候,bin-log dump线程会通知slave,并将相应的binlog内容发送给slave 。
2)、在slave机器上操作:
当主从同步开启的时候,slave上会创建两个线程:IO线程 。该线程连接到master机器,master机器上的binlog dump 线程会将binlog的内容发送给该IO线程 。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log;sql线程 。该线程读取到I/O线程写入的ralay log 。并且根据relay log 。并且根据relay log 的内容对slave数据库做相应的操作 。
3)、MySQL主从复制原理图如下:
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
(2)、主从形式
mysql主从复制 灵活
● 一主一从
● 主主复制
● 一主多从---扩展系统读取的性能,因为读是在从库读取的;
● 多主一从---5.7开始支持
● 联级复制---
三、主从同步的延迟等问题、原因及解决方案:
(1)、mysql数据库从库同步的延迟问题
1)相关参数:
首先在服务器上执行show slave satus;可以看到很多同步的参数:
Master_Log_File: SLAVE中的I/O线程当前正在读取的主服务器二进制日志文件的名称
Read_Master_Log_Pos: 在当前的主服务器二进制日志中,SLAVE中的I/O线程已经读取的位置
Relay_Log_File: SQL线程当前正在读取和执行的中继日志文件的名称
Relay_Log_Pos: 在当前的中继日志中,SQL线程已读取和执行的位置
Relay_Master_Log_File: 由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称
Slave_IO_Running: I/O线程是否被启动并成功地连接到主服务器上
Slave_SQL_Running: SQL线程是否被启动
Seconds_Behind_Master: 从属服务器SQL线程和从属服务器I/O线程之间的时间差距,单位以秒计 。
从库同步延迟情况出现的● show slave status显示参数Seconds_Behind_Master不为0,这个数值可能会很大


推荐阅读