MySQL主从数据库的同步延迟原理及解决方案

MySQL主从数据库同步延迟问题

 MySQL主从数据库的同步延迟原理及解决方案

MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以切换到从服务器。

相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢?

1。MySQL数据库主从同步延迟原理。

2。MySQL数据库主从同步延迟是怎么产生的。

3。MySQL数据库主从同步延迟解决方案。

,

答:谈到MySQL数据库主从同步延迟原理,得从MySQL的数据库主从复制原理说起,MySQL的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog, binlog是顺序写,所以效率很高,奴隶的Slave_IO_Running线程到主库取日志,效率很比较高,下一步,问题来了,奴隶的Slave_SQL_Running线程将主库的DDL和DML操作在奴隶实施.DML和DDL的IO操作是随即的,不是顺序的,成本高很多,还可能可奴隶上的其他查询产生锁争用,由于Slave_SQL_Running也是单线程的,所以一个DDL卡主了,需要执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延时。有朋友会问:“主库上那个相同的DDL也需要执行10分,为什么奴隶会延时?”,答案是主人可以并发,Slave_SQL_Running线程却不可以。

2。MySQL数据库主从同步延迟是怎么产生的。

答:当主库的TPS并发较高时,产生的DDL数量超过奴隶一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与奴隶的大型查询语句产生了锁等待。

3。MySQL数据库主从同步延迟解决方案

答:最简单的减少奴隶同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行。还有就是主库是写,对数据安全性较高,比如sync_binlog=1, innodb_flush_log_at_trx_commit=1之类的设置,而奴隶则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog, innodb_flushlog也可以设置为0来提高sql的执行效率。另外就是使用比主库更好的硬件设备作为奴隶。

mysql-5.6.3已经支持了多线程的主从复制。原理和丁奇的类似,丁奇的是以表做多线程,甲骨文使用的是以数据库(模式)为单位做多线程,不同的库可以使用不同的复制线程。

,

基于局域网的主/从机制在通常情况下已经可以满足& # 39;实时& # 39;备份的要求了。如果延迟比较大,就先确认以下几个因素:,
一般的做法是,使用多台奴隶来分摊读请求,再从这些奴隶中取一台专用的服务器,只作为备份用,不进行其他任何操作,就能相对最大限度地达到& # 39;实时& # 39;的要求了

slave_net_timeout单位为秒默认设置为3600秒

参数含义:当奴隶从主数据库读取日志数据失败后,等待多久重新建立连接并获取数据

master-connect-retry单位为秒默认设置为60秒

参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试。

通常配置以上2个参数可以减少网络问题导致的主从数据同步延迟

,

判断主从延时,通常有两个方法:

1只Seconds_Behind_Master, vs, 2。mk-heartbeat、下面具体说下两者在实现功能的差别。

可以通过监控显示奴隶状态\ G命令输出的Seconds_Behind_Master参数的值来判断,是否有发生主从延时。
其值有这么几种:
零-表示io_thread或是sql_thread有任何一个发生故障,也就是该线程的运行状态是不,而非是的。
0 -该值为零,是我们极为渴望看到的情况,表示主从复制良好,可以认为滞后不存在。
正值,表示主从已经出现延时,数字越大表示从库落后主库越多。
负值——几乎很少见,只是听一些资深的DBA说见过,其实,这是一个错误值,该参数是不支持负值的,也就是不应该出现。

方法2。mk-heartbeat, Maatkit万能工具包中的一个工具,被认为可以准确判断复制延时的方法。

mk-heartbeat的实现也是借助timestmp的比较实现的,它首先需要保证主从服务器必须要保持一致,通过与相同的一个国家结核控制规划服务器同步时钟。它需要在主库上创建一个心跳的表,里面至少有id与ts两个字段,id为server_id, ts就是当前的时间戳现在(),该结构也会被复制到从库上,表建好以后,会在主库上以后台进程的模式去执行一行更新操作的命令,定期去向表中的插入数据,这个周期默认为1秒,同时从库也会在后台执行一个监控命令,与主库保持一致的周期去比较,复制过来记录的ts值与主库上的同一条ts值,差值为0表示无延时,差值越大表示延时的秒数越多。我们都知道复制是异步的ts不肯完全一致,所以该工具允许半秒的差距,在这之内的差异都可忽略认为无延时。这个工具就是通过实打实的复制,巧妙的借用时间戳来检查延时,赞一个!

MySQL主从数据库的同步延迟原理及解决方案