一、MySQL 主从同步原理
是什么? 主从同步又叫主从复制,通过从一个 MySQL 主节点复制到一个或多个从节点,把数据实时同步给从节点。
为什么?
- 读写分离:主写,从读。主故障了,从还能正常读。
- 性能提升:读写分工,提高工作效率。
- 数据实时备份:一个库磁盘坏了,其他从库把数据恢复。
- 高可用:主节点不可用了,把从节点提升为主节点,快速恢复服务。
Binlog(二进制日志)是 MySQL 服务器层面生成的一种逻辑日志,它以二进制的形式,顺序记录了所有对 MySQL 数据库进行修改的操作(数据或结构变更)。
三种日志格式:
- Statement:记录原始 SQL 语句,会导致更新时间与原库不一致。例如:
update_time=now() - Row:记录每行数据的变化,保证了数据与原库一致,缺点是数据量较大。
- Mixed:Statement 和 Row 的混合模式,默认采用 Statement 模式,涉及日期、函数相关的时候采用 Row 模式,既减少了数据量,又保证了数据一致性。
二、主从同步的方式
2.1 全同步
全同步是 MySQL 复制模式中最严格的一种,主库提交事务时,必须等待所有从库都成功写入并执行该事务后,才向客户端返回成功。
- 优点:强一致性。
- 缺点:延迟较大。而且一个从库挂掉,整个数据库系统就瘫痪。
2.2 异步方式
默认的复制模式,主库提交事务时不等待从库确认,写完本地 binlog 后立即向客户端返回成功。
- 优点:
- 主库写入速度最快。
- 从库故障或网络中断,主库照常工作。
- 缺点:
- 数据可能不一致。
- 主机宕机,数据会丢失。
2.3 半同步
介于异步和全同步之间的折中方案。主库提交事务时,必须等待至少一个从库接收并写入 relay log 后,才向客户端返回成功。
- 优点:一致性比异步好。
- 缺点:
- 性能比异步差。
- 非强一致性:只保证数据到达从库,不保证执行完成。
- 主机宕机可能会出现数据不一致问题。
例:主节点写入从节点过程中挂了。从节点被提升为主节点,但数据并没有发过来。上一秒订单还在下一秒订单消失。
2.4 增强版同步
增强版半同步:先确保从库把数据存到磁盘,再提交主库事务;而传统半同步:先提交主库事务,再等从库确认。
优势:
- 真正的零数据丢失(事务提交在确认之后)
- 故障切换安全(从库总有最新数据)
- 性能损失极小(相比传统半同步)
代价:
- 比异步复制多一次网络往返
- 从库故障会短暂影响写入(超时降级)
2.5 组复制
组复制是让多个 MySQL 服务器像一个数据库一样工作的技术,所有节点数据实时同步,任何写入都需要得到多数节点同意。
Master 1 执行:A 账户 -100,B 账户 +100
↓ certify 阶段:问其他节点"可以这样改吗?"
↓ Master 检查: 余额够吗? 账户存在吗?
Master 检查:同一时间有别的人在改这些账户吗?
↓ 都回答"可以" → Consensus 层记录"已同意"
↓ 三节点同时:写 binlog 记录这个操作
↓ 三节点同时:实际修改 和 的余额
↓ Master 告诉客户端:转账成功


