前言
在现代数据库架构中,MySQL 主从同步是实现高可用性和负载均衡的关键技术。本文将深入探讨主从同步的架构、延迟原因以及优化策略,并提供专业的监控建议。
MySQL 主从同步架构
主从复制流程:
-
从库生成两个线程,一个 I/O 线程,一个 SQL 线程;
-
I/O 线程去请求主库的 binlog,并将得到的 binlog 日志写到 relay log(中继日志) 文件中;
-
主库会生成一个 log dump 线程,用来给从库 I/O 线程传 binlog;
-
SQL 线程会读取 relay log 文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
主从延迟原因
- 主库写入是并发的,从库 relay log 回放是单线程的,但在 mysql 5.6 版本后提供了 MySQL 的并行复制策略,丁奇的 MySQL 实战45讲有详细介绍
- 主库有大事务执行,比如一个事务在主库执行10s,从库再回放10s,那么对于当前事务数据主从延迟就是20s
- 主库或从库 CPU、磁盘IO过高
- 主库 TPS 过大,从库来不及回放
- 从库有大量全表扫描查询导致的磁盘IO,笔者曾经就遇到过由于数仓晚上进行从库扫库而导致的20几秒主从延迟
- 网络问题
- 主从网络延时过高
- 主从带宽不够
- 服务器硬件性能不足,如CPU、内存或磁盘性能,会影响复制效率
- MySQL配置不合理:如
binlog
格式、复制方式(异步或半同步)等配置不当可能导致延迟 - 锁等待:从库上的大型查询语句可能会产生锁等待,影响复制进程
主从延迟优化方案
- 强制读主:一致性要求高的业务读取主库,其它业务读从库,这个方法在实际开发过程中使用的很多
- 先读从库,未命中再读主库:适合查询新增的数据,先查询从库,当数据不存在再查询主库,可能会导致会多一次查询从而导致查询时间变长。
- 分库分表:减少单个主库或从库由于压力过大而导致的延迟
- 优化网络:确保主从服务器之间有足够的网络带宽和低延迟的连接
- 并行复制:在MySQL 5.6及以上版本中,可以开启并行复制功能,允许从服务器并行执行复制的事务。
- 减少持久化频率:调整 sync_binlog 和 innodb_flush_log_at_trx_commit 参数,以减少每次事务提交时的磁盘同步操作。
- 优化查询:确保主服务器上的查询是高效的,减少不必要的复杂查询和大事务。
- 索引优化:确保从服务器上的索引是最优的,以加快查询速度。
- 使用SSD:相比传统硬盘,SSD有更快的读写速度,可以减少I/O瓶颈。
监控与维护
有效的监控是确保主从同步健康运行的关键。使用专业的监控工具,如 Percona Toolkit,可以帮助我们实时监控复制状态,及时发现并解决延迟问题。