MySQL 主从同步延迟的缘由及解决办法

      mysql 用主从同步的方法进行读写分离,减轻主服务器的压力的作法如今在业内作的很是广泛。 主从同步基本上能作到实时同步。我从别的网站借用了主从同步的原理图。mysql

 



在配置好了, 主从同步之后, 主服务器会把更新语句写入binlog,   从服务器的IO 线程(这里要注意, 5.6.3 以前的IO线程仅有一个,5.6.3以后的有多线程去读了,速度天然也就加快了)回去读取主服务器的binlog 而且写到从服务器的Relay log 里面,而后从服务器的 的SQL thread 会一个一个执行 relay log 里面的sql , 进行数据恢复。sql


relay 就是 传递, relay race 就是接力赛的意思安全


1. 主从同步的延迟的缘由服务器

        咱们知道, 一个服务器开放N个连接给客户端来链接的, 这样有会有大并发的更新操做, 可是从服务器的里面读取binlog 的线程仅有一个, 当某个SQL在从服务器上执行的时间稍长 或者因为某个SQL要进行锁表就会致使,主服务器的SQL大量积压,未被同步到从服务器里。这就致使了主从不一致, 也就是主从延迟。多线程


2. 主从同步延迟的解决办法并发

     实际上主从同步延迟根本没有什么一招制敌的办法, 由于全部的SQL必须都要在从服务器里面执行一遍,可是主服务器若是不断的有更新操做源源不断的写入, 那么一旦有延迟产生, 那么延迟加剧的可能性就会原来越大。 固然咱们能够作一些缓解的措施。网站

    a. 咱们知道由于主服务器要负责更新操做, 他对安全性的要求比从服务器高, 全部有些设置能够修改,好比sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不须要这么高的数据安全,彻底能够讲sync_binlog设置为0或者关闭binlog,innodb_flushlog, innodb_flush_log_at_trx_commit 也 能够设置为0来提升sql的执行效率 这个能很大程度上提升效率。另外就是使用比主库更好的硬件设备做为slave。spa

    b. 就是把,一台从服务器当度做为备份使用, 而不提供查询, 那边他的负载下来了, 执行relay log 里面的SQL效率天然就高了。线程

    c. 增长从服务器喽,这个目的仍是分散读的压力, 从而下降服务器负载。blog


3. 判断主从延迟的方法

    MySQL提供了从服务器状态命令,能够经过 show slave status 进行查看,  好比能够看看Seconds_Behind_Master参数的值来判断,是否有发生主从延时。
其值有这么几种:
NULL - 表示io_thread或是sql_thread有任何一个发生故障,也就是该线程的Running状态是No,而非Yes.
0 - 该值为零,是咱们极为渴望看到的状况,表示主从复制状态正常

其它的方法我也没试过, 暂时不作评论