回答
MySQL 主从复制的核心是主库 Master 写数据的同时记录 binlog 日志,而从库 Slave 同步 Master 记录的日志并执行重放,将变更同步至从库。
- 主库 Master 在数据变更时(insert、update、delete 等)记录 binlog 日志。
- 从库 Slave 定时探测主库 Master 的 binlog。
- 主库 Master 为每个从库 IO thread 启动一个 dump thread,当主库发生变更时向从库发送 binlog。
- 从库 Slave 将收到 binlog 保存至本地的中继日志 relay log。
- 再者,从库 Slave 启动 SQL thread 从中继日志 relay log 读取变更数据并在本地重放中继日志
- 主从复制结束后,IO thread 和 SQL thread 进入睡眠状态,等待下一次唤醒。
主从复制是 MySQL 解决单点故障、提高系统并发性能和可靠性的重要手段。与此同时,主从复制也会带来数据一致性和复制延迟等挑战。
主从复制的模式
1、异步复制
异步复制是 MySQL 主从复制的默认模式。当发生数据变更时(insert、update、delete 等操作),主库 Master 不等待从库 Slave 回应已接收并应用这些变更就提交。意味着当主库在从库接收数据之前发生故障,那么从库可能会丢失最近变更数据。
2、半同步复制
半同步复制是对异步复制的一种改进。主库 Master 执行数据变更操作后,等待至少一个从库 Slave 接收并记录对应变更到中继日志后才继续执行后续操作。相较于异步复制,半同步复制减少数据丢失风险,并且只需要从库确认接收数据(不需要等待数据变更被应用)保持了较好的性能。
3、同步复制
同步复制指主库 Master 等待至少一个从库服务器 Slave 不仅接收变更日志 binlog,而且将变更应用到从库才继续执行后续操作。很明显,同步策略对性能影响很大。