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 小时前
【课程5.7】代码编写:违建处置指标计算(违建发现率、整改率SQL实现)
数据库·oracle·智慧城市·一网统管平台
松涛和鸣3 小时前
55、ARM与IMX6ULL入门
c语言·arm开发·数据库·单片机·sqlite·html
这儿有一堆花3 小时前
Linux 内网环境构建与配置深度解析
linux·数据库·php
Codeking__3 小时前
Redis——事务
数据库·redis·缓存
Codeking__3 小时前
Redis——认识持久化、RDB、AOF
数据库·redis·缓存
Funky_oaNiu3 小时前
Oracle在没有dba权限和表空间对不上和不能用数据泵的情况下迁移
数据库·oracle·dba
阳光九叶草LXGZXJ3 小时前
达梦数据库-报错-06-[-502]OUT OF TEMPORARY DATABASE SPACE(临时表空间不足)
linux·运维·数据库·sql·学习
+VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue校园跑腿系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
黎陌MLing3 小时前
PVE安装Ubuntu操作系统详细过程
linux·数据库·ubuntu
yangyang_z3 小时前
MySQL数据库——基础篇之通用语法及其分类
数据库·mysql·oracle