主从同步

  • master主库,有数据更新,将此次更新的事件类型写入到主库的binlog文件中
  • 主库会创建log dump 线程通知slave有数据更新
  • slave从库,向master节点的 log dump线程请求一份指定binlog文件位置的副本,并将请求回来的binlog存到本地的Relay log 中继日志中
  • slave 再开启一个SQL 线程读取Relay log事件,并在本地执行redo操作。将发生在主库的事件在本地重新执行一遍,从而保证主从数据同步

图片

主从延迟

指一个写入SQL操作在主库执行完后,将数据完整同步到从库会有一个时间差,称之为主从延迟。

  • 主库生成一条写入SQL的binlog,里面会有一个时间字段,记录写入的时间戳 t1
  • binlog 同步到从库后,一旦开始执行,取当前时间 t2
  • t2-t1,就是延迟时间

注意:不同服务器要保持时钟一致。

主从延迟排查方法

通过 show slave status 命令输出的Seconds_Behind_Master参数的值来判断

  • 为零:表示主从复制良好
  • 正值:表示主从已经出现延时,数字越大,表示从库延迟越严重

主从延迟的解决方案

  • 看业务的接受程度。如果不能接受延迟,那么建议强制走主库查询
  • 可以考虑引入缓存,更新主库后同步写入缓存,保证缓存的及时性
  • 提升从库的机器配置,提高从库binlog的同步效率
  • 缩短主、从库的网络距离,减少binlog的网络传输时间
  • 一主多从,每个从库都启一个线程从主库同步 binlog,导致主库压力过大,可以采用canal 增量订阅&消费组件,缓解主库压力。
  • 因为数据库必须要等到事务完成之后才会写入binlog,所以减少大事务的执行,尽量控制数量,分批执行。
  • 5.6版本之前,从库是单线程复制,当遇到执行慢的sql时,就会阻塞后面的同步。5.7 版本后支持多线程复制,可以在从服务上设置slave_parallel_workers为一个大于0的数,然后把slave_parallel_type参数设置为LOGICAL_CLOCK
  • 为从库增加浮动IP,并通过脚本检测从库的延迟,延迟大于指定阈值时,将浮动IP切换至Master库,追平后再切换回从库。