美文网首页mysql
mysql主从复制延时问题

mysql主从复制延时问题

作者: 勇0o | 来源:发表于2018-08-23 16:09 被阅读61次

          不知道从哪一年搞过数据库主从复制的事情了,为了减轻数据库的瓶颈,采用数据库采用的服务架构是:

    主从复制架构图

          当然实际使用时候并没有采用如上一主多从的落地方案,根据实际情况,采用的是一主一从架构,项目实行采用的是动态数据源+AOP自动切换数据库查询,使得实际业务逻辑进行所有的写操作都是在主数据库上执行,读操作都是从数据库进行获取。

          来看一张mysql主从复制内部实现原理图:

    mysql主从复制内部原理图

          MySQL之间数据复制的基础是二进制日志文件(binary logfile)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。

        原理清楚了,思考一个问题?如果网络、sql执行性能瓶颈等原因造成的数据同步延时问题该如何解决。

    例如:当并发量过大的时候,一个tps在主库产生了大量的DDL语句,超过了slave中的一个sql写的范围,从库延时的问题就出来了。master主库可以并发执行DDL语句,而Slave_SQL_Running线程是单线程,却不可以并发执行,并且是读取binary log file安装顺序进行读取的。

    当然总结下来就是如下两个原因:

    首要原因:数据库在业务上读写压力太大,CPU计算负荷大,网卡负荷大,硬盘随机IO太高次要原因:读写binlog带来的性能影响,网络传输延迟。

          回到上面那个问题,造成的数据同步延时问题该如何解决?

    1.减缓数据库压力,延时问题自然解决

          在此架构上在加入memcache或者redis的cache层特殊业务查询时候优先从缓存中进行查询,降低从库数据库服务的压力。

    2.硬件设备精选

          a.使用比主库更好的机器用来做slave库 、b.采用配置高的服务器用来做数据库、c.主从保证在一个交换机下面,并且采用万兆环境

    3.主从复制性能调优

         优化之前先了解slave库中的一些知识点,在从服务器上执行show slave status;可以查看到很多同步的参数,我们需要特别注意的参数如下:

    slave库参数

    从库同步延迟情况出现的

          1、show slave status显示参数Seconds_Behind_Master不为0,这个数值可能会很大

          2、show slave status显示参数Relay_Master_Log_File和Master_Log_File显示bin-log的编号相差很大,说明bin-log在从库上没有及时同步,所以近期执行的bin-log和当前IO线程所读的bin-log相差很大

         3、MySQL的从库数据目录下存在大量mysql-relay-log日志,该日志同步完成之后就会被系统自动删除,存在大量日志,说明主从同步延迟很厉害

    通过如上指标可以发觉mysql延时问题比较严重。

    优化角度一:采用主从同步加速机制

    1、sync_binlog在slave端设置为0

    2、–logs-slave-updates 从服务器从主服务器接收到的更新不记入它的二进制日志。

    3、直接禁用slave端的binlog

    4、slave端,如果使用的存储引擎是innodb,innodb_flush_log_at_trx_commit =2

    优化角度二:从文件系统本身进行优化

          在master端修改linux、unix文件系统中文件的etime属性,由于每当读文件时OS都会将读取操作发生的实际回写到磁盘上,对于读操作频繁的数据库文件来说这是没必要的,只会增加磁盘系统的负担影响I/O性能。可以通过设置文件系统的mount属性,组织操作系统写atime信息。

    优化角度三:其他方面

          master库是写库,slave是从库,写库对安全性要求特别高,而读库却没有那样的要求。

    写库:比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置是需要的

    读库:sync_binlog设置为0或者关闭binlog,innodb_flushlog也可以设置为0来提高sql的执行效率

    相关文章

      网友评论

        本文标题:mysql主从复制延时问题

        本文链接:https://www.haomeiwen.com/subject/cysyiftx.html