MySQL 主从复制是企业级数据库架构的基石。作为冉冉博客的 MySQL 教程系列,今天详细讲解主从复制的原理与实战配置。
一、主从复制原理
MySQL 主从复制基于 binlog 日志实现:
- Master:记录所有数据变更到 binlog
- Slave:通过 IO 线程连接 Master,读取 binlog
- Relay Log:Slave 本地存放中转日志
- SQL 线程:读取 relay log,执行 SQL
┌─────────┐ binlog ┌─────────┐ relay log ┌─────────┐
│ Master │ ────────────→ │ Slave │ ←────────────── │ SQL │
│ │ IO Thread │ │ │ Thread │
└─────────┘ └─────────┘ └─────────┘
二、配置主节点
# /etc/mysql/my.cnf
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
sync_binlog = 1
expire_logs_days = 7
# 只复制指定数据库(可选)
binlog_do_db = myapp
# 创建复制账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
三、配置从节点
# /etc/mysql/my.cnf
[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
super_read_only = 1 # 5.7.26+ 使用这个
# 复制过滤(可选)
replicate_do_db = myapp
四、建立复制连接
-- 查看 Master 状态
SHOW MASTER STATUS;
-- File: mysql-bin.000001
-- Position: 154
-- 在 Slave 上执行
CHANGE MASTER TO
MASTER_HOST = '192.168.1.100',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'repl_password',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 154;
-- 启动复制
START SLAVE;
-- 查看复制状态
SHOW SLAVE STATUSG
-- 关键指标:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
五、半同步复制配置
确保数据至少复制到一个从节点才返回成功:
-- Master 安装插件
INSTALL PLUGIN rpl_semi_sync_master SONAME ' semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 3000; -- 3秒超时
-- Slave 安装插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME ' semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
-- 确认状态
SHOW GLOBAL STATUS LIKE 'rpl_semi%';
六、GTID 复制模式
全局事务 ID,复制更可靠:
-- Master 配置
gtid_mode = ON
enforce_gtid_consistency = ON
-- Slave 配置
gtid_mode = ON
enforce_gtid_consistency = ON
slave_parallel_workers = 4 # 并行复制
slave_parallel_type = LOGICAL_CLOCK
-- 使用 GTID 复制
CHANGE MASTER TO
MASTER_AUTO_POSITION = 1;
七、常见问题排查
-- 1. 复制跳过错误
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
-- 2. 连接失败检查
TELNET master_ip 3306
SHOW VARIABLES LIKE '%timeout%';
-- 3. 数据不一致修复
pt-table-checksum h=master,u=checksum,p=pass
pt-table-sync --sync-to-master h=slave,u=root
八、监控与维护
-- 复制延迟监控
SHOW SLAVE STATUSG
SHOW PROCESSLIST;
-- Prometheus 监控
SELECT
variable_name,
variable_value
FROM information_schema.global_status
WHERE variable_name LIKE 'slave%';
主从复制是数据库高可用的基础。掌握这些配置与排查技巧,能让你的数据库架构更加稳定可靠。更多 MySQL 实战教程,欢迎持续关注冉冉博客。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END














暂无评论内容