设置异步 MySQL 复制:分步指南

通过这本权威的分步指南,掌握异步 MySQL 复制的设置。了解如何通过调整 `my.cnf` 设置、建立安全的复制用户账户,以及使用 `mysqldump` 执行关键的初始数据快照来正确配置主服务器和从服务器。本文提供了实用的命令和必要的故障排除技巧,以确保高效的数据同步并最大限度地减少复制延迟,从而实现可扩展的数据库架构。

40 浏览量

设置异步 MySQL 复制:分步指南

MySQL 复制是实现高可用性、可伸缩性和强大备份策略的基本功能。异步复制是最常见的类型,它确保写入主服务器(Master)的数据最终会被复制到一个或多个辅助服务器(Slave),而 Master 不需要等待 Slave 确认事务。

本综合指南提供了一个详细的分步教程,用于配置标准的 Master-Slave 异步复制设置。我们将介绍必要的服务器配置调整、用户设置以及初始化数据同步的关键步骤。


先决条件和概述

在开始配置之前,请确保您已具备以下条件:

  1. 两台正在运行的 MySQL 服务器(Server A:Master,Server B:Slave)。
  2. 两台服务器之间的网络连通性(通常需要开放 TCP 端口 3306)。
  3. 对两个 MySQL 实例具有 Root 或管理员权限,以便配置并修改 my.cnfmy.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_RunningSlave_SQL_Running 显示为 No,请检查 Last_IO_ErrorLast_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