目录
-
- 通信交互图
- 详细通信流程
-
- [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 TO和 START 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_info和mysql.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协议握手
-
初始握手包交换:
- 主库发送初始握手包(Protocol::Handshake)
- 包含协议版本、服务器版本、连接ID、随机种子等
-
从库注册:
- 从库发送
COM_REGISTER_SLAVE命令 - 包含从库服务器ID、主机名等信息
- 从库发送
阶段3: 身份验证
- 从库使用
CHANGE MASTER TO中配置的用户名和密码进行认证 - 发送
COM_AUTHENTICATE命令 - 主库验证复制用户权限(需REPLICATION SLAVE权限)
阶段4: 获取二进制日志信息
-
获取主库状态:
sql-- 从库隐式执行(通过COM_QUERY) SHOW MASTER STATUS- 获取当前二进制日志文件名和位置
-
发送binlog dump请求:
- 从库发送
COM_BINLOG_DUMP命令 - 参数包括:
- 二进制日志文件名
- 开始位置(或GTID)
- 服务器ID(用于主库识别从库)
- 从库发送
阶段5: 二进制日志传输
-
初始事件传输:
- 主库发送
FORMAT_DESCRIPTION_EVENT - 描述二进制日志格式版本
- 主库发送
-
持续事件推送:
- 主库IO线程读取binlog事件
- 通过已建立的连接推送到从库
- 事件类型包括:
TABLE_MAP_EVENTWRITE_ROWS_EVENTUPDATE_ROWS_EVENTDELETE_ROWS_EVENTXID_EVENT(事务提交)
-
半同步复制(如果启用):
text从库 → 主库: 接收日志写入relay log 从库 → 主库: 发送ACK确认 主库 → 客户端: 提交事务完成(收到ACK后) -
心跳机制(可选):
- 主库定期发送
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. 故障恢复通信
连接中断重连
- IO线程检测到连接断开
- 等待
MASTER_CONNECT_RETRY间隔 - 重新发起TCP连接
- 重新进行身份验证
- 从上次成功接收的位置继续请求binlog
二进制日志位置同步
- 从库记录
master_log_file和master_log_pos - 重连时发送最后成功接收的位置
- 主库从指定位置开始发送binlog事件
5. GTID复制模式下的差异
主库 从库 主库 从库 发送executed_gtid_set COM_BINLOG_DUMP_GTID 计算缺失事务 发送缺失的GTID事务 持续发送新事务
在GTID模式下:
- 从库发送已执行的GTID集合
- 主库计算需要发送的缺失事务
- 无需指定具体的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: 复制延迟
网络问题诊断
- 连接失败:检查防火墙、网络路由、主库监听端口
- 认证失败:验证复制用户权限和密码
- 传输中断:检查网络稳定性、超时设置
- 延迟增大:检查网络带宽、主库写入压力
这个过程中,MySQL使用自定义的二进制协议进行高效的数据传输,确保了主从数据的一致性。