MySQL读写分离与主从同步详解
2024年1月1日
读写分离、主从同步
一、读写分离概念
- 主库:处理新增、修改、删除等事务性操作。
- 从库:处理 SELECT 查询操作
二、主从同步过程

- 写入 binlog: 主库修改数据后,写入 binlog 日志,提交事务,更新本地存储的数据。
- 同步 binlog:从库连接到主库后,主库会创建一个 dump 线程,把 binlog 同步到所有从库,每个从库把 binlog 写到暂存日志中。
- 回放 binlog:从库启动一个 sql 线程去回放 binlog,去读 relay log 中继日志然后回放 binlog 更新数据。
三、同步模式
mysql 默认的同步模式:异步模式
- 同步模式:主库提交事务的线程要等待所有从库的同步成功,才返回客户端结果。性能最差了。
- 异步模式:主库提交事务的线程不会等待 binlog 同步完成就返回客户端结果,性能最好,但是主库宕机,数据就会丢失。
- 半同步模式:比如一主二从的集群,只要成功同步到一个从库,就立即返回数据给客户端。即使主库宕机,仍有一个从库有最新数据。
四、主从复制的数据延迟怎么解决
使用缓存:在写入数据主库的同时,把数据写到 redis 缓存里面。这样其它线程(比同步从库的 dump 线程,因为写入缓存速度快,所以可以从缓存拿数据同步从库,不用从主库拿数据。)获取数据的时候会优先查询缓存,但是可能带来缓存一致性问题。
直接查询主库:杜宇数据延迟敏感的业务,可以强制读主库。但是前提是查询的数据量不大,不然会出现主库写请求锁行,影响读请求的执行,最终对主库造成较大的压力。
五、主从架构中,读写分离怎么实现
独立部署代理中间件 mycat 来实现。
六、主库掉了怎么办
由于 mysql 没有像 redis 集群的哨兵模式可以自动将从库升级为主库,所以 MySQL 主从复制没有实现发现主服务器宕机和处理故障迁移的功能,要实现真的主从故障转移的话,简单了解过,可以用开源的 MySQL 高可用套件 MHA。
MHA 可以在主数据库发生宕机时,可以剔除原有主机,选出新的主机,然后对外提供服务,保证业务的连续性。