MySQL主从复制深度解析:原理、架构与实战部署指南

一、主从复制核心原理

复制流程解析

MySQL主从复制本质是通过**二进制日志(binlog)**实现数据同步的异步复制机制:

  1. 写操作记录:主库执行写操作时,将变更记录到binlog

  2. 日志传输:主库的binlog dump线程将日志发送给从库

  3. 中继存储:从库I/O线程接收日志并写入relay log

  4. 数据重放:从库SQL线程解析relay log并执行SQL

核心组件解析

组件 作用 关键配置参数
Binlog 主库记录所有数据变更 log-bin=mysql-bin
Relay Log 从库暂存主库传输的日志 relay-log=relay-bin
I/O Thread 从库获取主库binlog的线程 自动管理
SQL Thread 从库执行relay log的线程 自动管理
Binlog Dump 主库向从库发送binlog的线程 每个从库对应一个线程

二、主流复制架构方案

1. 一主一从架构

适用场景:读写分离、备份容灾

特点:

  • 简单易部署

  • Slave承担读负载

  • Master故障需手动切换

2. 一主多从架构

适用场景:读密集型应用

优势:

  • 线性扩展读能力

  • 多副本数据安全

  • 负载均衡读请求

3. 多级复制架构

适用场景:大规模集群、跨机房部署

特点:

  • 降低主库网络压力

  • 支持异地容灾

  • 数据延迟增加

4. 双主复制架构

适用场景:高可用要求高的系统

优势:

  • 故障自动切换

  • 维护不影响服务

  • 无单点故障

三、主从搭建实战部署

环境准备(192.168.66.143/144)

复制代码
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 禁用SELinux
setenforce 0

# 时间同步
ntpdate ntp.aliyun.com

主库配置(192.168.66.143)

1. 修改my.cnf

复制代码
[mysqld]
server-id = 1
log-bin = /var/log/mysql/mysql-bin
binlog_format = ROW
expire_logs_days = 7

2. 创建复制账号

复制代码
CREATE USER 'repl'@'192.168.66.%' IDENTIFIED BY 'SecurePass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.66.%';
FLUSH PRIVILEGES;

3. 查看binlog状态

复制代码
SHOW MASTER STATUS;
复制代码
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      785 |              |                  |
+------------------+----------+--------------+------------------+

从库配置(192.168.66.144)

1. 修改my.cnf

复制代码
[mysqld]
server-id = 2
relay-log = /var/lib/mysql/relay-bin
read_only = 1

2. 配置主从连接

复制代码
CHANGE MASTER TO
  MASTER_HOST='192.168.66.143',
  MASTER_USER='repl',
  MASTER_PASSWORD='SecurePass123!',
  MASTER_LOG_FILE='mysql-bin.000003',
  MASTER_LOG_POS=785;

3. 启动复制

复制代码
START SLAVE;

4. 检查复制状态

复制代码
SHOW SLAVE STATUS\G

关键指标检查:

  • Slave_IO_Running: Yes

  • Slave_SQL_Running: Yes

  • Seconds_Behind_Master: 0

四、生产环境优化建议

1. 参数调优

复制代码
# 主库
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

# 从库
slave_parallel_workers = 4
slave_preserve_commit_order = 1

2. 监控指标

复制代码
# 实时监控延迟
mysql -e "SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master"

# 监控线程状态
watch -n 1 'mysql -e "SHOW PROCESSLIST" | grep -i "system user"'

3. 高可用方案

组件:

  • Keepalived:VIP漂移

  • MHA:自动故障转移

  • ProxySQL:读写分离

五、常见故障排查指南

问题1:复制中断(1062错误)

现象:

复制代码
Last_Error: Could not execute Write_rows event on table db.users; 
Duplicate entry '1001' for key 'PRIMARY', Error_code: 1062;

解决方案:

复制代码
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;

问题2:主从不一致

修复步骤:

复制代码
# 1. 主库导出数据
mysqldump --single-transaction --master-data=2 -A > full.sql

# 2. 从库重置复制
STOP SLAVE;
RESET SLAVE ALL;

# 3. 导入数据
mysql < full.sql

# 4. 重新配置复制
CHANGE MASTER TO ...;
START SLAVE;

问题3:认证插件错误

错误信息:

复制代码
Authentication plugin 'caching_sha2_password' reported error

解决方案:

复制代码
-- 主库执行
ALTER USER 'repl'@'192.168.66.%' 
IDENTIFIED WITH mysql_native_password BY 'SecurePass123!';

六、主从复制限制与应对

限制类型 影响 解决方案
异步复制 数据丢失风险 半同步复制
单线程应用 大事务延迟 并行复制(MTS)
DDL锁表 主库锁定影响写入 pt-online-schema-change
MyISAM引擎 崩溃后数据不一致 全量InnoDB迁移
过滤规则复杂 配置错误导致数据缺失 全库复制+应用层过滤
相关推荐
Decay__4 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
代码山河7 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
微订校园外卖平台8 小时前
校园外卖平台选模板还是定制:架构、数据流与验收清单
大数据·架构·外卖系统·本地生活·微订
小徐不徐说9 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
论文复现现场9 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi9 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
Decay__10 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
心梦缘-雪雁11 小时前
SQL Server 查询数据存在哪个表里
数据库
lusklusklusk12 小时前
Python 巡检脚本:进程运行状态、数据库写入时效检查及邮件通知与告警
数据库·python·oracle
GeW13 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库