MySQL 主从复制配置教程
MySQL 主从复制(Replication)是实现数据库读写分离和高可用的基础架构方案。通过将主库的数据实时同步到一台或多台从库,可以显著分担查询压力、提供数据冗余备份。本文将在搬瓦工 VPS 上详细演示如何配置 MySQL 主从复制,包括传统 binlog 模式和 GTID 模式两种方式。如果你还没有安装 MySQL,可以先参考 Docker 安装教程 使用容器方式快速部署。
一、环境准备
本教程假设你拥有两台搬瓦工 VPS,分别作为主库(Master)和从库(Slave)。当然你也可以在同一台 VPS 上用不同端口模拟,但生产环境建议物理隔离。
- 主库服务器:IP 为 192.168.1.10,MySQL 端口 3306。
- 从库服务器:IP 为 192.168.1.20,MySQL 端口 3306。
- 操作系统:Ubuntu 22.04(推荐),也适用于 Debian 11+ 和 CentOS 7+。
- MySQL 版本:8.0+(两台服务器版本需一致或从库版本更高)。
首先确保两台服务器上都已安装 MySQL 8.0:
apt update
apt install mysql-server -y
systemctl start mysql
systemctl enable mysql
二、配置主库(Master)
2.1 修改主库配置文件
编辑 MySQL 配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf,添加以下内容:
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
sync-binlog = 1
innodb-flush-log-at-trx-commit = 1
bind-address = 0.0.0.0
expire-logs-days = 7
max-binlog-size = 100M
参数说明:server-id 必须唯一,主库一般设为 1;binlog-format 推荐使用 ROW 模式,数据一致性最好;sync-binlog = 1 表示每次事务提交都刷盘,确保 binlog 不丢失。
2.2 重启主库并创建复制账号
systemctl restart mysql
登录 MySQL 创建用于复制的专用账号:
mysql -u root -p
CREATE USER 'repl_user'@'192.168.1.20' IDENTIFIED WITH mysql_native_password BY 'StrongPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.20';
FLUSH PRIVILEGES;
2.3 获取主库状态
记录当前 binlog 文件名和位置,从库配置时需要用到:
SHOW MASTER STATUS\G
输出中 File 和 Position 两个值务必记录,例如 mysql-bin.000001 和 154。
三、配置从库(Slave)
3.1 修改从库配置文件
编辑从库的 /etc/mysql/mysql.conf.d/mysqld.cnf:
[mysqld]
server-id = 2
relay-log = relay-bin
read-only = 1
log-bin = mysql-bin
binlog-format = ROW
server-id 必须和主库不同;read-only = 1 防止误写从库;开启 log-bin 是为了将来从库也可以作为其他从库的主库(级联复制)。
3.2 重启从库并配置复制
systemctl restart mysql
登录从库 MySQL,执行复制配置命令:
mysql -u root -p
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl_user',
MASTER_PASSWORD='StrongPassword123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
3.3 检查复制状态
SHOW SLAVE STATUS\G
关键检查以下两个字段,都为 Yes 表示复制正常:
Slave_IO_Running: Yes— IO 线程正常,正在接收主库 binlog。Slave_SQL_Running: Yes— SQL 线程正常,正在回放中继日志。
四、GTID 复制模式
GTID(Global Transaction Identifiers)是 MySQL 5.6 引入的全局事务标识符,可以简化主从切换和故障恢复。推荐在新部署中使用 GTID 模式。
4.1 主库开启 GTID
在主库配置文件中添加:
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
4.2 从库开启 GTID
[mysqld]
server-id = 2
relay-log = relay-bin
read-only = 1
gtid-mode = ON
enforce-gtid-consistency = ON
4.3 使用 GTID 建立复制
GTID 模式下不需要指定 binlog 文件和位置,配置更简洁:
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl_user',
MASTER_PASSWORD='StrongPassword123!',
MASTER_AUTO_POSITION=1;
START SLAVE;
五、半同步复制(可选增强)
默认的异步复制存在数据丢失风险——主库提交事务后不等从库确认。半同步复制要求主库至少等待一个从库确认收到 binlog 后才返回提交成功。
5.1 安装半同步插件
在主库上:
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 = 5000;
在从库上:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
STOP SLAVE; START SLAVE;
5.2 验证半同步状态
SHOW STATUS LIKE 'Rpl_semi_sync%';
检查 Rpl_semi_sync_master_status 为 ON 即可。超时后会自动降级为异步复制,不影响服务可用性。
六、数据初始化同步
如果主库已有大量数据,需要先将数据导出到从库,再建立复制关系。
# 在主库上导出数据
mysqldump -u root -p --all-databases --single-transaction --master-data=2 --routines --triggers > full_backup.sql
# 将备份传输到从库
scp full_backup.sql root@192.168.1.20:/tmp/
# 在从库上导入数据
mysql -u root -p < /tmp/full_backup.sql
使用 --master-data=2 参数会在备份文件中记录 binlog 位置信息,方便从库配置复制起点。
七、监控与故障排查
7.1 监控复制延迟
SHOW SLAVE STATUS\G
关注 Seconds_Behind_Master 字段,该值表示从库落后主库的秒数。如果持续增大,说明从库回放速度跟不上主库写入速度,需要优化从库性能或升级配置。
7.2 常见错误处理
如果从库 SQL 线程因为重复键或缺失记录而停止,可以跳过错误(仅限紧急情况):
# 跳过一个错误事务
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
在 GTID 模式下,跳过错误的方法不同:
SET GTID_NEXT='错误事务的GTID';
BEGIN; COMMIT;
SET GTID_NEXT='AUTOMATIC';
START SLAVE;
7.3 防火墙配置
确保主库的 3306 端口对从库开放:
ufw allow from 192.168.1.20 to any port 3306
八、最佳实践
- 版本一致:主从服务器的 MySQL 版本应保持一致,从库版本不低于主库。
- 网络质量:搬瓦工多台 VPS 建议选择同一数据中心,减少网络延迟。
- 定期验证:使用
pt-table-checksum工具定期校验主从数据一致性。 - 监控告警:对
Seconds_Behind_Master和 IO/SQL 线程状态设置监控报警。 - 备份策略:主从复制不能替代备份,仍需定期进行逻辑备份或物理备份。可参考 Percona XtraBackup 热备份教程。
总结
MySQL 主从复制是构建高可用数据库架构的第一步。通过本文的配置,你的搬瓦工 VPS 已经具备了读写分离和数据冗余的能力。如果需要更高级的高可用方案,可以继续学习 MySQL 组复制 配置。选购搬瓦工 VPS 请参考 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 进入官网购买。