zoukankan      html  css  js  c++  java
  • mysql主从延迟原理

    一、mysql主从同步原理

      主库针对读写操作,顺序binlog,从库单线程去主库读“写操作的binlog”,从库取到binlog在本地原样执行(随机写),来保证主从数据逻辑上一致。

      mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog,binlog是顺序写,所以效率很高,slave的Slave_IO_Running线程到主库取日志,效率比较高,下一步问题来了,slave的slave_sql_running线程将主库的DDL和DML操作在slave实施。DML,DDL的IO操作是随机的,不能顺序的,成本高很多,还又跨年slave上的其他查询产生lock,由于slave_sql_running也是单线程的,所以一个DDL卡住了,需要执行一段时间,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延迟。

      由于master可以并发,Slave_sql_running线程却不可以,所以主库执行DDL需求一段时间,在slave执行相同的DDL时,就产生了延迟。

    二、主从同步延迟产生原因

      当主库的TPS并发较高时,产生的DDL数量超过Slave一个sql线程所能承受的范围,那么延迟就产生了,当然还有跨年与slave的大型query语句产生了锁等待

      首要原因:数据库在业务上读写压力太大,CPU计算负荷大,网卡负荷大,硬盘随机IO太高

      次要原因:读写binlog带来的性能影响,网络传输延迟

    三、主从同步延迟解决方案

      架构方面:

      1.业务的持久化层的实现采用分库架构,mysql服务可平行扩展分散压力

      2.单个库读写分离,一主多从,主写从读,分散压力

      3.服务的基础架构在业务和mysql之间加放cache层

      4.不同业务的mysql放在不同的机器

      5.使用比主库更好的硬件设备作slave

      反正就是mysql压力变小,延迟自然会变小

      硬件方面:采用好的服务器

      mysql主从同步加速:

      1.sync_binlog在slave端设置为0

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

      3.直接禁用slave端的binlog

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

      

      

  • 相关阅读:
    Java对象的生命周期与作用域的讨论(转)
    [置顶] Oracle学习路线与方法
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
  • 原文地址:https://www.cnblogs.com/susanhonly/p/11987300.html
Copyright © 2011-2022 走看看