从零开始搭建MySQL主从复制架构

2025-06发布6次浏览

在现代分布式系统中,MySQL主从复制架构是一种常见的高可用性和高扩展性解决方案。它通过将数据从主服务器复制到一个或多个从服务器来确保数据的冗余和一致性,同时提升读取性能。本文将详细讲解如何从零开始搭建MySQL主从复制架构,包括环境准备、配置步骤、故障排查以及优化建议。


一、环境准备

1. 硬件与软件需求

  • 操作系统:Linux(推荐使用CentOS或Ubuntu)。
  • MySQL版本:5.7及以上(支持GTID更方便管理)。
  • 服务器数量:至少两台(一台主服务器Master,一台从服务器Slave)。
  • 网络配置:确保主从服务器之间能够互相通信。

2. 安装MySQL

在所有服务器上安装MySQL,并确保其正常运行。以下是基于Ubuntu系统的安装命令:

sudo apt update
sudo apt install mysql-server

启动MySQL服务并设置开机自启:

sudo systemctl start mysql
sudo systemctl enable mysql

3. 配置防火墙

确保允许MySQL端口(默认3306)的流量:

sudo ufw allow 3306/tcp
sudo ufw reload

二、配置主服务器(Master)

1. 修改MySQL配置文件

编辑/etc/mysql/my.cnf/etc/my.cnf,添加以下内容:

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=test_db  # 需要同步的数据库名
binlog-format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
  • server-id:每台MySQL服务器必须唯一。
  • log-bin:启用二进制日志。
  • binlog-do-db:指定需要同步的数据库。
  • binlog-format:推荐使用ROW格式以确保数据一致性。
  • gtid_mode:启用全局事务标识符(Global Transaction ID),简化复制管理。

保存后重启MySQL服务:

sudo systemctl restart mysql

2. 创建复制用户

登录MySQL,创建一个用于复制的用户并授予权限:

CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;

3. 获取主服务器状态

执行以下命令记录二进制日志文件名和位置:

SHOW MASTER STATUS;

输出示例:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 1234     | test_db      |                  |
+------------------+----------+--------------+------------------+

记录下FilePosition值,稍后在从服务器上使用。


三、配置从服务器(Slave)

1. 修改MySQL配置文件

编辑/etc/mysql/my.cnf,添加以下内容:

[mysqld]
server-id=2
relay-log=mysql-relay-bin
log-slave-updates=ON
read-only=ON
gtid_mode=ON
enforce_gtid_consistency=ON

保存后重启MySQL服务。

2. 配置主从关系

登录MySQL,执行以下命令连接到主服务器:

CHANGE MASTER TO
MASTER_HOST='master_ip',  -- 主服务器IP地址
MASTER_USER='repl_user',   -- 复制用户
MASTER_PASSWORD='password', -- 复制用户密码
MASTER_LOG_FILE='mysql-bin.000001', -- 主服务器的二进制日志文件名
MASTER_LOG_POS=1234;       -- 主服务器的二进制日志位置

如果启用了GTID,可以简化为:

CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl_user',
MASTER_PASSWORD='password',
MASTER_AUTO_POSITION=1;

3. 启动从服务器复制

执行以下命令启动复制进程:

START SLAVE;

检查复制状态:

SHOW SLAVE STATUS\G

重点关注以下字段:

  • Slave_IO_RunningSlave_SQL_Running 是否均为 Yes
  • Last_Error 是否为空。

四、测试主从复制

1. 在主服务器上插入数据

登录主服务器的MySQL,选择需要同步的数据库并插入一条记录:

USE test_db;
CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO test_table VALUES (1, 'test');

2. 检查从服务器数据

登录从服务器的MySQL,验证数据是否同步:

USE test_db;
SELECT * FROM test_table;

如果数据一致,则说明主从复制成功。


五、常见问题及解决方法

1. 复制延迟

  • 原因:从服务器处理速度跟不上主服务器写入速度。
  • 解决方案:优化SQL语句、增加硬件资源或使用多线程复制(slave_parallel_workers)。

2. 主从数据不一致

  • 原因:网络中断或配置错误。
  • 解决方案:停止从服务器复制,重新同步数据:
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO ...
START SLAVE;

3. GTID冲突

  • 原因:主从服务器上的事务ID重复。
  • 解决方案:清理从服务器的GTID信息:
RESET MASTER;
RESET SLAVE ALL;

六、优化建议

  1. 备份策略:定期备份主从服务器的数据,防止数据丢失。
  2. 监控工具:使用Percona Toolkit或Prometheus等工具监控复制状态。
  3. 负载均衡:结合代理工具(如HAProxy或MaxScale)分担读取压力。