面试题答案
一键面试MySQL 主从复制的原理
- 主库日志记录:主库在执行任何数据修改(INSERT、UPDATE、DELETE 等)操作时,会将这些改变记录到二进制日志(Binary Log,也叫 binlog)中。
- 从库 I/O 线程:从库启动一个 I/O 线程,该线程连接到主库,请求主库发送二进制日志的内容。从库通过在主库上创建一个基于长连接的 replication 专用账号来进行连接。
- 主库发送日志:主库接收到从库 I/O 线程的请求后,根据从库提供的二进制日志文件名(log_file)和位置(log_pos),从指定位置开始发送二进制日志给从库。
- 从库中继日志:从库 I/O 线程接收到主库发送的二进制日志,将其写入到本地的中继日志(Relay Log)中。
- 从库 SQL 线程:从库还启动一个 SQL 线程,它负责读取中继日志中的内容,并按照日志中记录的顺序在从库上重新执行一遍,从而使从库的数据与主库保持一致。
避免主库单点失效及主从切换方法
- 避免主库单点失效
- 双活或多活架构:采用双主或多主架构,多个主库之间可以同时进行写操作,并相互同步数据。这样即使一个主库发生故障,其他主库仍能继续提供服务。但这种架构需要处理好数据冲突问题,比如通过设置不同的自增 ID 范围等方式。
- 引入高可用中间件:如 MHA(Master High Availability)、Orchestrator 等。这些中间件可以监控主库的运行状态,当检测到主库故障时,自动进行主从切换。
- 从库切换为主库继续提供服务
- 手动切换:DBA 登录到从库,执行
STOP SLAVE
停止复制,然后执行RESET MASTER
命令将从库切换为主库。之后需要更新其他从库,让它们指向新的主库。首先获取新主库的二进制日志文件名和位置,然后在其他从库上执行CHANGE MASTER TO
命令,指定新主库的连接信息、日志文件名和位置,最后执行START SLAVE
开启复制。 - 使用高可用中间件自动切换:以 MHA 为例,MHA 由管理节点(Manager Node)和多个数据节点组成。管理节点会定期检测主库和从库的心跳,当主库故障时,MHA 管理节点会自动选择一个从库,执行相关命令将其提升为主库,并通知其他从库指向新的主库。具体流程如下:
- 故障检测:MHA 管理节点通过心跳检测机制发现主库故障。
- 选主:根据一定的算法(如优先选择复制延迟最小的从库),从可用的从库中选择一个作为新的主库。
- 切换:MHA 管理节点在选中的从库上执行切换命令,如
STOP SLAVE
、RESET MASTER
等,将其变为新主库。 - 重定向:MHA 管理节点通知其他从库,通过执行
CHANGE MASTER TO
命令,让它们重新指向新的主库,并启动复制。
- 手动切换:DBA 登录到从库,执行