Mysql主从复制原理

为什么要主从复制?

  1. 有一句sql语句当锁表的时候不能读,这会影响运行中的业务。使用主从复制,让主库负责写,从库负责读,这样即使出现锁表,也可以通过从库读。
  2. 做数据的热备。
  3. 架构的扩展。可以降低磁盘IO访问的频率,提高单个机器的IO性能。

什么是mysql的主从复制?
指数据可以从一个mysql数据库服务器主节点复制到一个或多个从节点。mysql默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有或者特定的数据库,或者特定的表。

mysql复制原理
在这里插入图片描述

  1. master服务器将数据的改变记录到二进制binlog日志中
  2. slave服务器会定期对binlog进行检测是否发生改变。如果发生改变,则开启一个IO Thread拉取master的binlog中的内容到relay log中,sql线程负责从relay log中读出内容,并更新到slave的数据库中。保证slave和mater数据一致。
  3. mysql复制至少需要2个mysql的服务
  4. mysql的复制确保版本:master<=slave服务器
  5. master和slave两节点时间需要同步

mysql主从形式

  1. 一主一从 一台master,一台slave
    在这里插入图片描述
  2. 主主复制 互为备份
    在这里插入图片描述
  3. 一主多从 一般用于读写分离。主写,从读,分担读取压力
    在这里插入图片描述
  4. 多主一从 用来做数据备份,应用较少
    在这里插入图片描述
  5. 联级复制 浪费时间;依赖太强,应用较少
    在这里插入图片描述

mysql主从同步延迟分析
在mysql5.7以前
由于mysql的主从复制是单线程操作,主库对所有DDL和DML产生的日志写入binlog,由于binlog是顺序写,效率很高,slave的sql线程将DDL和DML操作事件重新生成,而DML和DDL的IO操作是随机的,效率低。另一方面,由于sql thread也是单线程的,当主库并发较高时,产生的DML和DDL数量超过slave的SQL Thread所能处理的速度,或者当slave中有大型query语句产生了锁等待,那么延迟就会产生了
解决方案

  1. 业务的持久化层的实现采用分库架构,mysql服务可以平行扩展,分散压力
  2. 单个库读写分离,一主多从,主写读从,分散压力。让从库压力高于主库压力,保护主库
  3. 服务的基础架构在业务和mysql之间加入memcache或者redis的cache层,降低mysql的读压力
  4. 不同业务的mysql物理上放在不同机器,分散压力
  5. 使用比主库更好的硬件设备作为slave,mysql压力小,延迟自然小
  6. 使用更加强劲的硬件设备

在mysql5.7以后
使用MTS并行复制技术,永久解决复制延迟问题。
MTS(enhanced multi-threaded slave),增强型多线程从机
master服务器上是怎么并行执行的,那么slave上就怎样进行并行回放