在现代分布式系统中,MySQL主从复制架构是一种常见的高可用性和高扩展性解决方案。它通过将数据从主服务器复制到一个或多个从服务器来确保数据的冗余和一致性,同时提升读取性能。本文将详细讲解如何从零开始搭建MySQL主从复制架构,包括环境准备、配置步骤、故障排查以及优化建议。
在所有服务器上安装MySQL,并确保其正常运行。以下是基于Ubuntu系统的安装命令:
sudo apt update
sudo apt install mysql-server
启动MySQL服务并设置开机自启:
sudo systemctl start mysql
sudo systemctl enable mysql
确保允许MySQL端口(默认3306)的流量:
sudo ufw allow 3306/tcp
sudo ufw reload
编辑/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
登录MySQL,创建一个用于复制的用户并授予权限:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
执行以下命令记录二进制日志文件名和位置:
SHOW MASTER STATUS;
输出示例:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 1234 | test_db | |
+------------------+----------+--------------+------------------+
记录下File
和Position
值,稍后在从服务器上使用。
编辑/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服务。
登录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;
执行以下命令启动复制进程:
START SLAVE;
检查复制状态:
SHOW SLAVE STATUS\G
重点关注以下字段:
Slave_IO_Running
和 Slave_SQL_Running
是否均为 Yes
。Last_Error
是否为空。登录主服务器的MySQL,选择需要同步的数据库并插入一条记录:
USE test_db;
CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO test_table VALUES (1, 'test');
登录从服务器的MySQL,验证数据是否同步:
USE test_db;
SELECT * FROM test_table;
如果数据一致,则说明主从复制成功。
slave_parallel_workers
)。STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO ...
START SLAVE;
RESET MASTER;
RESET SLAVE ALL;