面试题答案
一键面试MariaDB 的 START SLAVE 命令执行流程 - 主库与从库网络交互细节
- 建立连接:
- 从库执行
START SLAVE
命令后,从库的 I/O 线程根据配置的主库信息(如主库地址、端口、用户名、密码等)尝试与主库建立 TCP 连接。 - 主库接收到连接请求后,验证从库提供的用户名和密码等身份信息。若验证通过,主从库之间建立起可靠的 TCP 连接,为后续数据传输奠定基础。
- 从库执行
- 数据传输:
- 获取二进制日志位置:连接建立后,从库 I/O 线程向主库发送请求,获取主库二进制日志(binlog)的当前位置(文件名和偏移量)。主库根据从库记录的复制位置信息(保存在
master.info
文件中,记录上次复制停止时主库 binlog 的位置),将相应的 binlog 位置信息返回给从库。 - 传输 binlog 事件:从库 I/O 线程开始从主库指定的 binlog 位置读取 binlog 事件,并将这些事件写入从库的中继日志(relay log)。主库则持续将新产生的 binlog 事件发送给从库,只要主库有新的事务提交,对应的 binlog 事件就会按顺序传输给从库。
- 获取二进制日志位置:连接建立后,从库 I/O 线程向主库发送请求,获取主库二进制日志(binlog)的当前位置(文件名和偏移量)。主库根据从库记录的复制位置信息(保存在
网络故障处理
- 故障检测:
- TCP 层面检测:由于主从库之间基于 TCP 连接进行通信,TCP 协议自身有一定的故障检测机制。例如,若网络中断,TCP 会在一段时间内尝试重传数据。如果重传失败次数达到一定阈值,TCP 连接会被判定为断开。从库的 I/O 线程会感知到 TCP 连接断开,从而检测到网络故障。
- 心跳检测:MariaDB 主从复制机制中,从库 I/O 线程还会定期向主库发送心跳包(通常配置为每隔一定时间发送一次)。主库接收到心跳包后会回复响应。若从库在一定时间内未收到主库的心跳响应,也会判定网络出现故障。
- 故障定位:
- 从库日志分析:从库在检测到网络故障后,首先会查看自身的错误日志。日志中会记录网络连接断开的相关信息,如断开的时间、尝试重连的次数等。通过分析这些信息,可以初步确定故障发生在从库与主库通信的过程中。
- 网络工具辅助:可以使用网络工具如
ping
、traceroute
等在从库和主库所在服务器上进行测试。ping
命令可以检测网络是否连通,traceroute
命令可以跟踪数据包从从库到主库经过的路由节点,从而定位网络故障可能发生的具体节点(如路由器、交换机等)。
- 恢复机制:
- 自动重连:从库检测到网络故障后,I/O 线程会根据配置的参数自动尝试重新连接主库。通常在一定时间间隔(可配置)后进行重连尝试。如果重连成功,从库会根据
master.info
文件中记录的位置信息,向主库请求从上次中断的位置继续传输 binlog 事件。 - 手动干预:若自动重连多次失败,可能需要手动干预。管理员可以检查网络配置、防火墙设置等,确保网络环境正常。修复网络问题后,手动重启从库的复制进程(如再次执行
START SLAVE
命令),从库会重新建立与主库的连接,并继续复制。
- 自动重连:从库检测到网络故障后,I/O 线程会根据配置的参数自动尝试重新连接主库。通常在一定时间间隔(可配置)后进行重连尝试。如果重连成功,从库会根据
- 保证复制连续性和数据完整性:
- 中继日志的作用:在网络故障期间,从库虽然无法从主库获取新的 binlog 事件,但中继日志保存了之前已经接收但尚未应用的 binlog 事件。当网络恢复并重连成功后,从库的 SQL 线程会继续从上次中断的位置应用中继日志中的事件,保证数据的连续性。
- 基于 GTID(全局事务标识符)的复制:如果采用 GTID 模式,每个事务在主库上都会分配一个唯一的 GTID。从库通过记录已经应用的 GTID 集合,在网络恢复后,主库只会向从库发送从库尚未应用的 GTID 对应的 binlog 事件,从而保证数据的完整性,避免重复或遗漏事务。同时,GTID 模式也使得主从库之间的同步更加健壮,即使在网络故障等复杂情况下,也能准确恢复复制。