MySQL主从复制与读写分离
主从同步
- 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库,追平后再切换回从库。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Michael's Blog!
评论





