设置异步 MySQL 复制:分步指南
MySQL 复制是实现高可用性、可伸缩性和强大备份策略的基本功能。异步复制是最常见的类型,它确保写入主服务器(Master)的数据最终会被复制到一个或多个辅助服务器(Slave),而 Master 不需要等待 Slave 确认事务。
本综合指南提供了一个详细的分步教程,用于配置标准的 Master-Slave 异步复制设置。我们将介绍必要的服务器配置调整、用户设置以及初始化数据同步的关键步骤。
先决条件和概述
在开始配置之前,请确保您已具备以下条件:
- 两台正在运行的 MySQL 服务器(Server A:Master,Server B:Slave)。
- 两台服务器之间的网络连通性(通常需要开放 TCP 端口 3306)。
- 对两个 MySQL 实例具有 Root 或管理员权限,以便配置并修改
my.cnf或my.ini配置文件。
在本指南中,我们假设 Master 服务器 IP 是 192.168.1.100,Slave 服务器 IP 是 192.168.1.101。
阶段 1:配置 Master 服务器
必须配置 Master 服务器,使其在二进制日志文件中记录所有数据修改事件,供 Slave 读取。
步骤 1:编辑 Master 配置文件(my.cnf)
找到 MySQL 配置文件(通常是 /etc/mysql/my.cnf 或 /etc/my.cnf),并在 [mysqld] 部分添加或修改以下指令。
[mysqld]
# 1. 该服务器的唯一 ID(必须大于 0)
server-id=1
# 2. 启用二进制日志
log-bin=mysql-bin
# 3. 要复制的数据库列表(可选,但推荐)
# binlog-do-db=mydatabase
# 4. 可选:确保连接使用 TCP/IP,便于测试
# bind-address=0.0.0.0
注意:
server-id在参与复制拓扑的所有服务器中必须是唯一的。
步骤 2:重启 MySQL 并验证二进制日志记录
保存配置文件后,请在 Master 服务器上重启 MySQL 服务。
# Debian/Ubuntu
sudo systemctl restart mysql
# RHEL/CentOS
sudo systemctl restart mysqld
登录到 MySQL 命令行界面并验证二进制日志记录是否已激活:
SHOW VARIABLES LIKE 'log_bin';
-- 值应为 ON
步骤 3:创建复制用户
复制需要 Master 服务器上一个专用的用户账户,该用户具有特定权限,供 Slave 连接并检索二进制日志。请确保该用户可以从 Slave 的 IP 地址(192.168.1.101)远程连接。
CREATE USER 'repl_user'@'192.168.1.101' IDENTIFIED BY 'secure_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.101';
FLUSH PRIVILEGES;
步骤 4:记录当前的 Master 状态
在继续之前,我们必须确定二进制日志中 Slave 应开始读取的确切位置(文件和位置)。此步骤对于同步是关键的。
FLUSH TABLES WITH READ LOCK; -- 暂时停止写入
SHOW MASTER STATUS;
-- 重要:记下这两个值:
-- File: mysql-bin.000001
-- Position: 1234
-- 如果您正在进行初始快照(步骤 6),请勿在此刻解锁表
阶段 2:配置 Slave 服务器
步骤 5:编辑 Slave 配置文件(my.cnf)
为 Slave 服务器配置一个唯一的 ID 和可选设置。
[mysqld]
# 该服务器的唯一 ID(必须与 Master 不同)
server-id=2
# 可选:推荐用于安全起见
read_only=1
# 可选:启用中继日志
relay_log=mysql-relay-bin
保存更改后,重启 Slave 服务器上的 MySQL 服务。
步骤 6:初始数据传输(快照)
如果 Slave 服务器是空的,您必须使用 Master 当前的数据结构和内容填充它。此初始快照必须在锁定 Master 表时(从步骤 4开始)获取。
从 Master 服务器运行 mysqldump 命令。我们使用 --master-data=2 标志自动将必要的 CHANGE MASTER TO 语句包含在转储文件中,从而简化步骤 7。
# 在 Master 服务器控制台/Shell 中运行
mysqldump -u root -p --all-databases --master-data=2 --single-transaction > master_dump.sql
# 现在,返回 Master MySQL CLI 并释放锁
UNLOCK TABLES;
将 master_dump.sql 传输到 Slave 服务器并导入:
# 在 Slave 服务器控制台/Shell 中运行
mysql -u root -p < master_dump.sql
最佳实践: 高度推荐使用
master-data=2,因为它可以在转储开始时自动捕获正确的二进制日志位置。
阶段 3:启动复制
步骤 7:定义 Master 连接
在Slave服务器的 MySQL 命令行中,执行 CHANGE MASTER TO 命令,替换步骤 4 中记录的值和步骤 3 中创建的用户。
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl_user',
MASTER_PASSWORD='secure_password',
MASTER_LOG_FILE='mysql-bin.000001', -- 步骤 4 记录的文件
MASTER_LOG_POS=1234; -- 步骤 4 记录的位置
步骤 8:启动复制和验证
定义连接参数后,启动 Slave 的复制线程。
START SLAVE;
使用 SHOW SLAVE STATUS\G 命令验证复制线程是否正在运行且通信正常:
SHOW SLAVE STATUS\G
检查输出中的以下关键字段:
| 字段 | 预期值 | 描述 |
|---|---|---|
Slave_IO_Running |
Yes |
Slave 成功连接到 Master。 |
Slave_SQL_Running |
Yes |
Slave 正在将其事务应用于其数据库。 |
Seconds_Behind_Master |
0 或较小数字 |
表示复制延迟。应快速降至 0。 |
如果 Slave_IO_Running 或 Slave_SQL_Running 显示为 No,请检查 Last_IO_Error 或 Last_SQL_Error 字段以获取故障排除线索(例如,防火墙问题、凭据不正确、重复键)。
故障排除和维护提示
处理复制错误
如果 Slave 遇到错误(例如,尝试插入重复的主键),Slave_SQL_Running 线程将停止。您通常可以使用以下方法绕过次要的、非关键错误:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
警告: 请谨慎使用
SQL_SLAVE_SKIP_COUNTER。跳过事务可能导致 Master 和 Slave 之间的数据分歧(不一致)。
检查一致性
尽管异步复制很高效,但它不能保证即时一致性。对于高风险环境,请使用 Percona Toolkit 的 pt-table-checksum 等工具定期检查 Master 和 Slave 之间的数据漂移情况。
管理二进制日志
二进制日志会随时间消耗磁盘空间。在 Master 上配置日志过期,以防止磁盘空间过度使用:
[mysqld]
# 删除早于 7 天(604800 秒)的二进制日志
expire_logs_days=7