mysql主从延迟解决方案
复制
mysql支持2种复制方式,基于语句和基于行。语句复制在3.23版本就存在,行复制在5.1版本中才出现。
都是通过主库记录二进制日志,从库重放日志来实现异步数据复制。
复制原理
- 主库把数据更改记录到二进制日志(binlog)
- 备库将主库的日志复制到自己的中继日志
- 备库继续读取中继日志中的事件,并将其重放到备库数据上
具体细节
- 列表项目
复制延迟
即主从同步延迟,既然是复制,肯定存在延迟,最好是在设计应用能够容忍复制延迟。
延迟原因:
- 备库单线程复制设计,导致效率低下。因为备库的单线程和cpu只会有效地使用1个CPU和磁盘。
- 锁阻塞。备库的查询可能会阻塞复制线程。因为是单线程,阻塞时做不了其他事情,只能等待。
产生延迟的方式两种:
- 突然延迟,然后再跟上
- 稳定的延迟增大
前者通常由于一条查询时间很长的sql导致,后者跟备库容量有关
最好的分析办法是查看慢查询日志,用pt-query-digest工具来分析。如果开启log_slow_slave_statements选项,慢查询日志还记录复制线程执行的语句,这样就能找到复制时哪些语句执行慢了。
复制延迟解决方案
- 除了用更好的硬盘和CPU(固态硬盘),复制没有太多的优化空间。
- 不要重复执行写操作较高的部分,优化查询,是保持备库同步最好的办法。