起源
Mysql的主从复制都是单线程的操作,主库对所有ddl和dml产生的日志写进binlog,由于binlog是顺序写,所有效率很高,slave的sql thread线程将主库的ddl、dml操作事件在slave重放。DDL和DML的操作是随机的,不是顺序,所有成本很高。另一方便,由于sql thread 是单线程的,当主库并发较高时,产生的DML数量超过slave的sql thread处理的速度,或者当slave中有大型query语句产生锁等待,那么延时就会产生了。
解决方案:
1、 业务的持久层的实现采用分库架构,mysql服务可平行扩展,分散压力。
2、 单个库读写分离,一主多从,主写从读,分散压力。这样从库压力比主库高,保护主库。
3、 服务的基础架构在业务和mysql之间加入redis等缓存,降低mysql压力。
4、 不同业务的mysql放在不同物理主机,分散压力。
5、 使用比从库更好的硬件设备作为slave,mysql压力IAO,延迟自然会变小。
6、 使用更加强劲的硬件设备。
Mysql5.7之后使用MTS并复制记录,永久解决复制延时问题。