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

输出中 FilePosition 两个值务必记录,例如 mysql-bin.000001154

三、配置从库(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 进入官网购买。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。