《Linux下MySQL主从配置》
一、引言
在分布式系统与高可用架构中,MySQL主从复制(Master-Slave Replication)是核心组件之一。通过主库(Master)记录所有数据变更(如INSERT、UPDATE、DELETE),并将变更以二进制日志(Binary Log)形式同步至从库(Slave),实现数据冗余、读写分离和故障转移。Linux作为MySQL最常用的操作系统环境,其主从配置的稳定性直接影响数据库集群的可靠性。本文将详细阐述Linux环境下MySQL主从复制的完整流程,涵盖环境准备、主库配置、从库配置、验证测试及常见问题处理。
二、环境准备
1. 硬件与软件要求
主从服务器需满足以下条件:
- 操作系统:CentOS 7/8或Ubuntu 20.04+(推荐使用LTS版本)
- MySQL版本:5.7或8.0(需主从版本一致或从库版本高于主库)
- 网络连通性:主从服务器间需开放3306端口(默认MySQL端口)
- 磁盘空间:主库需预留足够空间存储二进制日志(binlog)
2. 安装MySQL
以CentOS 8为例,使用YUM仓库安装:
# 添加MySQL官方YUM仓库
sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el8-3.noarch.rpm
# 安装MySQL服务器
sudo yum install mysql-community-server -y
# 启动服务并设置开机自启
sudo systemctl enable --now mysqld
安装完成后,通过mysql_secure_installation
脚本设置root密码并移除匿名用户。
三、主库配置
1. 修改主库配置文件
编辑主库的/etc/my.cnf
(或/etc/mysql/mysql.conf.d/mysqld.cnf
),添加以下配置:
[mysqld]
server-id = 1 # 主库ID,必须唯一
log_bin = mysql-bin # 启用二进制日志
binlog_format = ROW # 推荐使用ROW格式(支持所有SQL类型)
binlog_do_db = test_db # 可选:指定要复制的数据库(不指定则复制所有)
expire_logs_days = 7 # 二进制日志保留天数
sync_binlog = 1 # 每次事务提交后同步到磁盘
重启主库使配置生效:
sudo systemctl restart mysqld
2. 创建复制专用用户
登录MySQL后执行:
CREATE USER 'repl'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
此用户用于从库连接主库并获取二进制日志。
3. 获取主库二进制日志位置
执行以下命令查看当前二进制日志文件名及位置:
SHOW MASTER STATUS;
输出示例:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 154 | test_db | |
+------------------+----------+--------------+------------------+
记录File
和Position
值,后续从库配置需使用。
四、从库配置
1. 修改从库配置文件
编辑从库的/etc/my.cnf
,添加以下配置:
[mysqld]
server-id = 2 # 从库ID,必须唯一且不同于主库
relay_log = mysql-relay-bin # 中继日志文件名
log_slave_updates = ON # 允许从库作为其他从库的主库
read_only = ON # 从库设为只读(可选,防止误写)
重启从库服务:
sudo systemctl restart mysqld
2. 配置主从复制关系
登录从库MySQL后执行:
CHANGE MASTER TO
MASTER_HOST='主库IP地址',
MASTER_USER='repl',
MASTER_PASSWORD='StrongPassword123!',
MASTER_LOG_FILE='mysql-bin.000003', # 替换为主库SHOW MASTER STATUS输出的File值
MASTER_LOG_POS=154; # 替换为主库SHOW MASTER STATUS输出的Position值
启动复制进程:
START SLAVE;
3. 验证复制状态
执行以下命令查看从库状态:
SHOW SLAVE STATUS\G
关键字段说明:
- Slave_IO_Running: Yes
:I/O线程(从主库读取日志)是否运行
- Slave_SQL_Running: Yes
:SQL线程(执行日志中的SQL)是否运行
- Seconds_Behind_Master: 0
:从库落后主库的秒数(0表示完全同步)
五、主从复制原理深度解析
1. 二进制日志(Binlog)
主库将所有数据变更记录到二进制日志中,支持三种格式:
- STATEMENT:记录SQL语句(可能因函数差异导致主从不一致)
- ROW:记录行变更(推荐,兼容性最好)
- MIXED:自动选择STATEMENT或ROW格式
2. 复制线程模型
从库启动两个线程:
- I/O线程:连接主库并请求二进制日志,写入中继日志(Relay Log)
- SQL线程:读取中继日志并重放其中的SQL
3. 半同步复制(可选)
默认异步复制可能丢失数据。启用半同步复制可确保至少一个从库收到日志后才返回成功:
主库安装插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
从库安装插件:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
六、常见问题与解决方案
1. 复制中断(Error Code: 1236)
原因:主库二进制日志被清除或从库位置无效。
解决方案:
- 在主库执行SHOW BINARY LOGS;
确认日志是否存在
- 从库重新配置CHANGE MASTER TO
并指定新的日志位置
2. 主键冲突(Error Code: 1062)
原因:从库手动插入数据导致与主库冲突。
解决方案:
- 确保从库为只读模式(read_only=ON
)
- 跳过特定错误(不推荐长期使用):
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
3. 性能瓶颈
现象:从库延迟(Seconds_Behind_Master
持续增大)。
优化方案:
- 启用并行复制(MySQL 5.7+):
STOP SLAVE;
SET GLOBAL slave_parallel_workers = 4; # 根据CPU核心数调整
START SLAVE;
- 优化从库硬件(SSD、增加内存)
- 避免在主库执行大事务
七、高级配置场景
1. 多源复制(MySQL 5.7+)
从库可同时从多个主库复制数据:
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='主库1',
SOURCE_USER='repl',
SOURCE_PASSWORD='pass',
SOURCE_LOG_FILE='binlog.000001',
SOURCE_LOG_POS=120
FOR CHANNEL 'channel1';
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='主库2',
SOURCE_USER='repl',
SOURCE_PASSWORD='pass',
SOURCE_LOG_FILE='binlog.000002',
SOURCE_LOG_POS=200
FOR CHANNEL 'channel2';
START SLAVE FOR CHANNEL 'channel1';
START SLAVE FOR CHANNEL 'channel2';
2. GTID复制(全局事务标识符)
使用GTID替代文件名+位置,简化故障恢复:
主库配置:
[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON
从库配置:
CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_USER='repl',
MASTER_PASSWORD='pass',
MASTER_AUTO_POSITION=1;
八、监控与维护
1. 监控指标
- 复制延迟:SHOW SLAVE STATUS
中的Seconds_Behind_Master
- 二进制日志增长速率:SHOW BINARY LOGS;
- 错误日志:/var/log/mysqld.log
2. 定期维护任务
- 每周清理过期二进制日志:
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
- 每月检查主从数据一致性(使用pt-table-checksum工具)
九、总结
Linux下MySQL主从配置的核心步骤包括:环境准备、主库配置(启用binlog、创建复制用户)、从库配置(设置server-id、启动复制)、验证与监控。通过合理配置二进制日志格式、复制线程数和半同步机制,可显著提升复制的可靠性与性能。实际应用中需结合监控工具(如Prometheus+Grafana)实现自动化告警,确保主从集群长期稳定运行。
关键词:Linux、MySQL主从复制、二进制日志、GTID、半同步复制、复制延迟、数据一致性
简介:本文详细介绍了Linux环境下MySQL主从复制的完整流程,包括环境准备、主从库配置、复制原理、常见问题处理及高级场景(如多源复制、GTID复制)。通过配置示例和监控方案,帮助DBA快速搭建高可用的MySQL主从架构。