面试题答案
一键面试基本复制原理
- 二进制日志记录
- 在主库上,无论事务型表(InnoDB)还是非事务型表(MyISAM)执行的写操作,都会记录到二进制日志(binlog)中。对于InnoDB表,其事务的提交采用两阶段提交(2PC),确保在将事务写入binlog前,InnoDB引擎已经完成了相关的日志写入(redo log和undo log),以保证事务的持久性和一致性。而MyISAM表的操作在执行时就直接记录到binlog,因为MyISAM本身不支持事务。
- 主从通信
- 主库将二进制日志事件通过网络发送给从库。从库有一个I/O线程负责接收主库发送的日志内容,并将其写入到中继日志(relay log)中。
- 从库应用日志
- 从库有一个SQL线程,负责读取中继日志中的事件并在从库上重放。对于InnoDB表相关的事件,从库的InnoDB引擎按照主库记录的事务顺序进行重放,利用redo log和undo log保证事务的一致性和完整性。对于MyISAM表的事件,从库直接按照binlog记录的操作顺序在MyISAM表上执行,因为MyISAM不依赖事务日志来保证数据一致性。
关键机制
- 两阶段提交(2PC)对事务型表的保障
- 两阶段提交确保了InnoDB表事务在主库和从库之间的一致性。在主库,事务的准备阶段,InnoDB引擎将redo log写入磁盘,标记事务为PREPARED状态。然后在提交阶段,将事务写入binlog,并通知InnoDB引擎提交事务,InnoDB引擎将事务标记为COMMITTED状态。从库在应用日志时,按照同样的事务逻辑进行操作,保证数据的一致性。
- 日志格式与同步
- 为了保证混合复制的准确性,MySQL使用了基于语句(Statement - based Replication, SBR)、基于行(Row - based Replication, RBR)以及混合模式(Mixed - based Replication, MBR)的日志格式。对于MyISAM表,由于其操作可能具有不确定性(如使用了函数等),通常在SBR模式下可能导致主从数据不一致,因此对于这类表可能更倾向于RBR模式记录日志。而InnoDB表在不同场景下可以根据需要选择合适的日志格式,在主从同步时,确保主库和从库的日志格式配置一致,以保障复制的准确性。
- 崩溃恢复机制
- InnoDB表通过redo log和undo log实现崩溃恢复,在从库应用日志过程中,如果发生崩溃,重启后可以利用redo log恢复未完成的事务,利用undo log回滚未提交的事务。MyISAM表虽然没有事务日志,但它在每次写操作后会将数据直接持久化到磁盘,在崩溃恢复时,可能需要通过一些额外的操作(如检查文件系统的一致性等)来确保数据的完整性。同时,主从复制机制本身也提供了一定程度的容错能力,从库可以在崩溃恢复后继续从上次中断的位置读取中继日志并应用,保证数据最终与主库一致。