NingG +

MySQL 技术内幕:主从同步和主从延时

1. 背景

用户画像功能上线后,线上 MySQL 监控显示

主从延迟现象严重:平均 6s 左右,需要剖析一下原因,找到改进的措施。

当前 blog 要解决的问题:

2. MySQL 主从复制

2.1. 作用

原点之问:MySQL 主从集群的作用,要解决什么问题?

场景:

MySQL 集群方式,能够分散单个节点的访问压力

MySQL 集群,常见方式:主从集群

MySQL 主从集群的作用:

MySQL 主从集群,分散访问压力,提升整个系统的可用性,降低大访问量引发的故障率。

常见的主从架构:

具体,参考下图:

2.2. 实现细节

MySQL 在主从同步时,其底层实现细节又是什么?为此后分析主从延迟原因以及优化方案,做好理论准备。

总结来说,MySQL 的主从复制:异步单线程

特别说明:MySQL 5.6.3 开始支持「多线程主从复制」,一个数据库一个线程多个数据库多个线程

完整的 Master & Slave 之间主从复制过程:

主从延时时间:Master 执行成功,到 Slave 执行成功,时间差。

上述过程:

通过上面分析,MySQL 主从复制是典型的生产者-消费者模型:整体耗时,分为几类

2.3. 客观认识:主从架构

Master 数据写入后, Slave 一定要及时写入数据,这个本质是:主从架构下的强一致性。

Master 与 Slave 之间的延迟,是客观存在的。

一般对主从架构定位

2.3.1. 同步复制

如果要满足主从架构的强一致性,采取「同步复制」的 2PC 策略即可:

主流数据库均支持这种完全的同步模式,MySQL的Semi-sync功能(从MySQL 5.6开始官方支持),就是基于这种原理。

同步复制」对数据库的写性能影响很大,适用场景:

银行等严格要求强一致性的应用,对于写入延迟一般没什么要求(延迟几个小时都可以接受,数据不出错就行)。

2.3.2. 异步复制

异步复制:Master 数据写入成功后,Slave 上异步进行数据写入,只要保证数据最终一致性即可。

3. 主从延迟

3.1. 如何监控

监控主从延迟的方法有多种:

  1. Slave 使用本机当前时间,跟 Master 上 binlog 的时间戳比较
  2. pt-heartbeatmt-heartbeat

本质:同一条 SQL,Master执行结束的时间 vs. Slave执行结束的时间。

3.2. 主从延迟的影响

Slave 延迟的影响:

简单来说,恶化主从延迟,将丧失 MySQL 集群带来的优势

  1. 读写分离失效:读写分离,降低单机压力,提升系统瓶颈上限,如果延迟恶化,则失效。
  2. 主备容灾失效:主备切换,提升系统可用性,如果延迟恶化(1h以上),则失效。

3.3. 产生原因

常见的主从延迟原因:

3.4. 如何解决

整体上 2 个策略,齐头并进:

减弱主从延迟,采取措施:

  1. 细化事务:将大事务拆为小事务,不必要的地方移除事务
    1. 提升 SQL 执行速度:优化索引
    2. 减少批量操作:批量 DML 的耗时较多,减少不必要的批量 DML
  2. 降低多线程大事务并发的概率:优化业务逻辑

4. 参考资料

Top