MySQL主从复制底层网络通信过程

目录

    • 通信交互图
    • 详细通信流程
      • [1. CHANGE MASTER TO 阶段](#1. CHANGE MASTER TO 阶段)
      • [2. START SLAVE 阶段](#2. START SLAVE 阶段)
        • [阶段1: 建立TCP连接](#阶段1: 建立TCP连接)
        • [阶段2: MySQL协议握手](#阶段2: MySQL协议握手)
        • [阶段3: 身份验证](#阶段3: 身份验证)
        • [阶段4: 获取二进制日志信息](#阶段4: 获取二进制日志信息)
        • [阶段5: 二进制日志传输](#阶段5: 二进制日志传输)
      • [3. 数据流控制机制](#3. 数据流控制机制)
      • [4. 故障恢复通信](#4. 故障恢复通信)
      • [5. GTID复制模式下的差异](#5. GTID复制模式下的差异)
      • [6. 监控和诊断](#6. 监控和诊断)

以下是执行 CHANGE MASTER TOSTART SLAVE过程中底层网络通信的详细描述:

通信交互图

主库(Master) 从库(Slave) 主库(Master) 从库(Slave) 阶段1: CHANGE MASTER TO (配置阶段) 阶段2: START SLAVE (建立连接) 阶段3: 身份验证 阶段4: 获取主库状态 阶段5: 持续复制 loop [持续复制] 保存主库配置信息到系统表 1. TCP三次握手建立连接 连接建立完成 2. 发送COM_REGISTER_SLAVE命令 返回OK包 3. 发送用户名密码进行认证 认证结果 4. 发送SHOW MASTER STATUS请求 返回binlog文件/位置信息 5. 发送COM_BINLOG_DUMP请求 返回FORMAT_DESCRIPTION_EVENT 6. 推送二进制日志事件 确认接收 7. 发送心跳包(可选)

详细通信流程

1. CHANGE MASTER TO 阶段

  • 无网络通信 :该命令仅将配置信息保存到从库的mysql.slave_master_infomysql.slave_relay_log_info系统表中
  • 配置信息包括:
    • 主库IP地址和端口
    • 复制用户凭据
    • 二进制日志文件名和位置(或GTID)
    • 连接参数(超时、重试等)

2. START SLAVE 阶段

阶段1: 建立TCP连接
text 复制代码
从库 → 主库: SYN (seq=x)
主库 → 从库: SYN-ACK (seq=y, ack=x+1)
从库 → 主库: ACK (seq=x+1, ack=y+1)
  • 从库使用配置的主库IP和端口(默认3306)发起TCP连接
阶段2: MySQL协议握手
  1. 初始握手包交换

    • 主库发送初始握手包(Protocol::Handshake)
    • 包含协议版本、服务器版本、连接ID、随机种子等
  2. 从库注册

    • 从库发送COM_REGISTER_SLAVE命令
    • 包含从库服务器ID、主机名等信息
阶段3: 身份验证
  • 从库使用CHANGE MASTER TO中配置的用户名和密码进行认证
  • 发送COM_AUTHENTICATE命令
  • 主库验证复制用户权限(需REPLICATION SLAVE权限)
阶段4: 获取二进制日志信息
  1. 获取主库状态

    sql 复制代码
    -- 从库隐式执行(通过COM_QUERY)
    SHOW MASTER STATUS
    • 获取当前二进制日志文件名和位置
  2. 发送binlog dump请求

    • 从库发送COM_BINLOG_DUMP命令
    • 参数包括:
      • 二进制日志文件名
      • 开始位置(或GTID)
      • 服务器ID(用于主库识别从库)
阶段5: 二进制日志传输
  1. 初始事件传输

    • 主库发送FORMAT_DESCRIPTION_EVENT
    • 描述二进制日志格式版本
  2. 持续事件推送

    • 主库IO线程读取binlog事件
    • 通过已建立的连接推送到从库
    • 事件类型包括:
      • TABLE_MAP_EVENT
      • WRITE_ROWS_EVENT
      • UPDATE_ROWS_EVENT
      • DELETE_ROWS_EVENT
      • XID_EVENT(事务提交)
  3. 半同步复制(如果启用)

    text 复制代码
    从库 → 主库: 接收日志写入relay log
    从库 → 主库: 发送ACK确认
    主库 → 客户端: 提交事务完成(收到ACK后)
  4. 心跳机制(可选)

    • 主库定期发送HEARTBEAT_EVENT
    • 保持连接活跃,检测从库是否存活

3. 数据流控制机制

滑动窗口机制

主库binlog
主库发送缓冲区
TCP发送窗口
网络传输
从库接收缓冲区
从库IO线程
relay log
从库确认
主库调整窗口

关键网络参数
sql 复制代码
-- 影响复制的网络相关参数
CHANGE MASTER TO
  MASTER_CONNECT_RETRY = 60,      -- 重试间隔(秒)
  MASTER_RETRY_COUNT = 86400,     -- 重试次数
  MASTER_HEARTBEAT_PERIOD = 30,   -- 心跳间隔
  MASTER_LOG_BUFFER_SIZE = 16777216; -- 日志缓冲区大小

4. 故障恢复通信

连接中断重连
  1. IO线程检测到连接断开
  2. 等待MASTER_CONNECT_RETRY间隔
  3. 重新发起TCP连接
  4. 重新进行身份验证
  5. 从上次成功接收的位置继续请求binlog
二进制日志位置同步
  • 从库记录master_log_filemaster_log_pos
  • 重连时发送最后成功接收的位置
  • 主库从指定位置开始发送binlog事件

5. GTID复制模式下的差异

主库 从库 主库 从库 发送executed_gtid_set COM_BINLOG_DUMP_GTID 计算缺失事务 发送缺失的GTID事务 持续发送新事务

在GTID模式下:

  1. 从库发送已执行的GTID集合
  2. 主库计算需要发送的缺失事务
  3. 无需指定具体的binlog文件和位置

6. 监控和诊断

关键状态变量
sql 复制代码
SHOW SLAVE STATUS\G
-- 网络相关的重要字段:
-- Slave_IO_Running: IO线程状态
-- Slave_IO_State: 当前IO线程活动
-- Master_Log_File/Read_Master_Log_Pos: 读取位置
-- Seconds_Behind_Master: 复制延迟
网络问题诊断
  1. 连接失败:检查防火墙、网络路由、主库监听端口
  2. 认证失败:验证复制用户权限和密码
  3. 传输中断:检查网络稳定性、超时设置
  4. 延迟增大:检查网络带宽、主库写入压力

这个过程中,MySQL使用自定义的二进制协议进行高效的数据传输,确保了主从数据的一致性。

相关推荐
剩下了什么3 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
山峰哥4 小时前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉4 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变4 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
WangYaolove13145 小时前
基于python的在线水果销售系统(源码+文档)
python·mysql·django·毕业设计·源码
山岚的运维笔记6 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
roman_日积跬步-终至千里7 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科7 小时前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦7 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
霖霖总总7 小时前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法