MySQL 运维知识点(十四)---- 主从复制
一、 概述
1. 什么是主从复制?
主从复制是指将一台 MySQL 数据库服务器(主库 Master)的数据,复制到一台或多台 MySQL 数据库服务器(从库 Slave)的过程。
2. 主从复制的用途
用途 | 说明 |
---|---|
数据备份 | 从库作为主库的热备份,是一种有效的备份方式 |
读写分离 | 主库负责写操作,从库负责读操作,提升系统并发处理能力 |
高可用基础 | 是构建高可用架构(如 MHA、MGR)的基础 |
数据分发 | 将数据复制到不同的地理位置,供本地访问 |
升级测试 | 在从库测试新版本 MySQL,不影响主库服务 |
3. 复制模式
-
异步复制:主库执行完事务后立即返回,不等待从库接收确认(默认模式)
-
半同步复制:主库等待至少一个从库接收并写入 relay log 后才返回成功
-
组复制:基于 Paxos 协议,实现多主复制(MySQL InnoDB Cluster)
二、 原理
1. 核心三线程架构
线程 | 位置 | 职责 |
---|---|---|
Binlog Dump Thread | 主库 | 读取主库的 binlog,发送给从库的 I/O Thread |
I/O Thread | 从库 | 连接主库,接收 binlog 数据,写入本地的 relay log |
SQL Thread | 从库 | 读取 relay log 中的事件,在从库上重放执行 |
2. 详细复制流程
主库 Master 从库 Slave
┌─────────────────┐ ┌─────────────────┐
│ │ │ │
│ 1.事务提交 │ │ │
│ 2.写入Binlog │ │ │
│ │ │ │
│ 3. Binlog Dump │ ←──────────→ │ 4. I/O Thread │
│ Thread │ binlog事件 | │
│ │ │ │
│ │ │ 5. 写入Relay Log│
│ │ │ │
│ │ │ 6. SQL Thread │
│ │ │ 读取Relay Log │
│ │ │ 并执行 │
└─────────────────┘ └─────────────────┘
步骤分解:
-
主库数据变更:主库上的事务提交后,会将数据变更记录到 Binary Log 中
-
从库请求数据:从库的 I/O Thread 向主库的 Binlog Dump Thread 发起请求
-
主库发送日志:主库的 Binlog Dump Thread 读取 binlog 事件发送给从库
-
从库接收日志:从库的 I/O Thread 接收 binlog 事件,写入本地的 Relay Log
-
从库重放日志:从库的 SQL Thread 读取 relay log 中的事件并重放执行
-
数据保持一致:从库数据与主库逐步保持一致
3. 重要文件说明
-
Binary Log:主库产生的包含所有数据变更的日志文件
-
Relay Log:从库接收主库 binlog 后写入的中转日志文件
-
master.info:从库保存的连接主库的配置信息
-
relay-log.info:从库记录的 relay log 应用位置信息
三、 搭建步骤
以下是基于传统异步复制的手动搭建流程。
1. 环境准备
-
至少两台 MySQL 服务器(主库、从库)
-
网络互通,防火墙开放 3306 端口
-
MySQL 版本建议一致或从库版本高于主库
2. 主库配置
① 修改主库配置文件 my.cnf
[mysqld]
# 服务器唯一ID
server-id = 1# 启用二进制日志,设置日志文件前缀
log-bin = mysql-bin# 需要复制的数据库(可选,不配置则复制所有库)
# binlog-do-db = mydb# 不需要复制的数据库(可选)
# binlog-ignore-db = mysql
# binlog-ignore-db = information_schema
# binlog-ignore-db = performance_schema# 设置binlog格式(推荐ROW)
binlog_format = ROW# 自动清理过期binlog(可选)
expire_logs_days = 7
② 重启主库 MySQL 服务
systemctl restart mysql
③ 创建复制专用用户
-- 在主库执行
CREATE USER 'repl'@'从库IP' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从库IP';
FLUSH PRIVILEGES;
④ 查看主库状态并记录位置点
-- 在主库执行,记录 File 和 Position
SHOW MASTER STATUS;
重要:记录返回结果中的 File
(mysql-bin.000001) 和 Position
(154),从库配置时需要。
3. 从库配置
① 修改从库配置文件 my.cnf
[mysqld]
# 服务器唯一ID,必须与主库不同
server-id = 2# 启用中继日志
relay-log = mysql-relay-bin# 可选的从库配置
# read_only = ON -- 设置从库为只读模式
# super_read_only = ON -- 超级用户也只读
② 重启从库 MySQL 服务
systemctl restart mysql
③ 配置主从复制连接
-- 在从库执行
CHANGE MASTER TO
MASTER_HOST = '主库IP',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'repl_password',
MASTER_PORT = 3306,
MASTER_LOG_FILE = 'mysql-bin.000001', -- 主库SHOW MASTER STATUS查到的File
MASTER_LOG_POS = 154, -- 主库SHOW MASTER STATUS查到的Position
MASTER_CONNECT_RETRY = 60;
④ 启动从库复制进程
-- 在从库执行
START SLAVE; -- 在MySQL 8.0+中推荐使用 START REPLICA;
⑤ 检查从库复制状态
-- 在从库执行
SHOW SLAVE STATUS\G -- 在MySQL 8.0+中推荐使用 SHOW REPLICA STATUS\G
4. 验证复制状态
检查以下关键字段:
-
Slave_IO_Running
: Yes (I/O Thread 运行状态) -
Slave_SQL_Running
: Yes (SQL Thread 运行状态) -
Seconds_Behind_Master
: 0 (复制延迟秒数,0表示无延迟) -
Last_IO_Error
: 空 (无I/O错误) -
Last_SQL_Error
: 空 (无SQL执行错误)
四、 常用管理命令
-- 在从库执行的管理命令
STOP SLAVE; -- 停止复制
START SLAVE; -- 启动复制
RESET SLAVE ALL; -- 重置复制配置(清除连接信息)-- 查看复制线程状态
SHOW PROCESSLIST;-- 跳过指定数量的错误(谨慎使用)
SET GLOBAL sql_slave_skip_counter = 1;
五、 常见问题与排查
-
IO Thread 连接失败
-
检查网络连通性
-
验证复制用户权限
-
确认主库防火墙设置
-
-
SQL Thread 执行错误
-
检查主从数据是否已存在不一致
-
确认是否在从库手动写入了数据
-
查看
Last_SQL_Error
字段获取具体错误信息
-
-
复制延迟
-
检查从库服务器负载
-
优化慢查询SQL
-
考虑使用并行复制
-