TOP云提供高性价比云服务器租用,有中国内地/港澳台、海外等全球各地节点,TOP云国内云服务器只要有域名备案号就能直接用,无须重复备案;港澳台及海外云服务器不用备案,购买之后直接使用,省时省力省心。价格实惠,续费同价,2核2G5M仅需27元每月,8核8G50M仅需66元每月,更多配置套餐请进入下面网址了解:
TOP云总站云服务器:https://topyun.vip/server/buy.html
TOP云C站云服务器:https://c.topyun.vip/cart
在云服务器上配置 MySQL 主从复制(Master-Slave Replication)是一种常见的数据库高可用和负载均衡方案。通过主从复制,可以将主库(Master)上的数据变更同步到从库(Slave),从而实现数据备份、读写分离、故障切换等目的。
以下是基于 MySQL 5.7 / 8.0 的主从复制配置详细步骤,假设主从服务器均为 Linux 系统(如 CentOS、Ubuntu),并且你已经在云服务器上安装了 MySQL。
一、主从复制的基本原理
MySQL 主从复制是基于 二进制日志(Binary Log) 的复制机制:
主库(Master):
记录所有数据变更操作到二进制日志(binlog)。
提供读写服务。
从库(Slave):
从主库获取二进制日志,并在本地重放(relay log)这些日志中的操作,从而实现数据同步。
通常用于读操作或备份。
二、配置前的准备工作
1. 确保主从服务器网络互通
主从服务器之间需要能够通过内网或公网互相访问 MySQL 的默认端口(3306)。
如果是云服务器(如阿里云、腾讯云),需确保安全组规则放行 3306 端口。
2. 确保主从服务器时间同步
使用 ntp 或云服务商提供的时钟同步服务,确保主从服务器系统时间一致。
3. 确保 MySQL 版本兼容
主从服务器的 MySQL 版本建议一致或从库版本不低于主库版本。
三、主库(Master)配置
1. 修改主库的 MySQL 配置文件(通常是 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf)
[mysqld]
# 开启二进制日志
log-bin = mysql-bin
# 设置服务器唯一ID(主从服务器必须不同)
server-id = 1
# 可选:指定需要同步的数据库(如果不指定,则同步所有数据库)
# binlog-do-db = your_database_name
# 可选:排除不需要同步的数据库
# binlog-ignore-db = mysql
# binlog-ignore-db = information_schema
# binlog-ignore-db = performance_schema
# binlog-ignore-db = sys
# 设置二进制日志格式(推荐使用 ROW 模式)
binlog-format = ROW
# 可选:设置二进制日志过期时间(单位:天)
expire-logs-days = 7
注意:
server-id 是主从服务器的唯一标识,主库和从库必须设置为不同的值。
log-bin 指定二进制日志文件的前缀名,MySQL 会自动生成如 mysql-bin.000001 的日志文件。
2. 重启 MySQL 服务使配置生效
# CentOS / RHEL
systemctl restart mysqld
# Ubuntu / Debian
systemctl restart mysql
3. 登录 MySQL,创建用于主从复制的用户
-- 登录 MySQL
mysql -u root -p
-- 创建复制专用用户(如 repl_user)
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'your_password';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
注意:
'repl_user'@'%' 中的 % 表示允许从任何主机连接。如果从库有固定 IP,可以替换为 'repl_user'@'从库IP',以提高安全性。
4. 查看主库状态,记录二进制日志文件名和位置
SHOW MASTER STATUS;
输出示例:
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+
记录以下信息:
File:当前二进制日志文件名(如 mysql-bin.000001)。
Position:当前二进制日志位置(如 154)。
这些信息在配置从库时会用到。
四、从库(Slave)配置
1. 修改从库的 MySQL 配置文件
[mysqld]
# 设置服务器唯一ID(与主库不同)
server-id = 2
# 可选:设置为只读模式(防止从库被误写入)
read-only = 1
# 可选:指定需要同步的数据库(与主库对应)
# replicate-do-db = your_database_name
# 可选:排除不需要同步的数据库
# replicate-ignore-db = mysql
# replicate-ignore-db = information_schema
# replicate-ignore-db = performance_schema
# replicate-ignore-db = sys
# 设置二进制日志格式(与主库保持一致)
binlog-format = ROW
注意:
server-id 必须与主库不同,且在同一主从架构中唯一。
2. 重启 MySQL 服务使配置生效
# CentOS / RHEL
systemctl restart mysqld
# Ubuntu / Debian
systemctl restart mysql
3. 登录从库 MySQL,配置主从复制
-- 登录 MySQL
mysql -u root -p
-- 配置主从复制
CHANGE MASTER TO
MASTER_HOST='主库IP地址',
MASTER_USER='repl_user',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001', -- 替换为主库的 File 值
MASTER_LOG_POS=154; -- 替换为主库的 Position 值
注意:
MASTER_HOST:主库的 IP 地址(如果是内网环境,使用内网 IP;如果是公网环境,使用公网 IP)。
MASTER_USER 和 MASTER_PASSWORD:主库上创建的复制用户及其密码。
MASTER_LOG_FILE 和 MASTER_LOG_POS:主库的 SHOW MASTER STATUS 输出结果。
4. 启动从库复制线程
-- 启动复制
START SLAVE;
-- 查看从库状态
SHOW SLAVE STATUS\G
重点关注以下两个字段:
Slave_IO_Running:是否成功连接到主库并读取二进制日志。应为 Yes。
Slave_SQL_Running:是否成功重放二进制日志中的操作。应为 Yes。
如果这两个字段的值均为 Yes,说明主从复制已成功建立。
五、验证主从复制是否正常
1. 在主库上创建测试数据
-- 登录主库 MySQL
mysql -u root -p
-- 创建测试数据库
CREATE DATABASE test_db;
-- 使用测试数据库
USE test_db;
-- 创建测试表
CREATE TABLE test_table (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
-- 插入测试数据
INSERT INTO test_table (name) VALUES ('MySQL Replication Test');
2. 在从库上查看是否同步
-- 登录从库 MySQL
mysql -u root -p
-- 使用测试数据库
USE test_db;
-- 查询测试表
SELECT * FROM test_table;
如果从库中能够看到主库插入的数据,说明主从复制正常。
六、常见问题与排查
1. Slave_IO_Running 或 Slave_SQL_Running 为 No
可能原因:
主从网络不通。
主库的 server-id 或从库的 server-id 配置错误。
复制用户权限不足。
主从日志文件或位置不匹配。
解决方法:
检查网络连接。
确认 server-id 配置正确且唯一。
确认复制用户权限正确。
使用 SHOW SLAVE STATUS\G 查看具体错误信息,并根据提示调整配置。
2. 数据不一致
可能原因:
主从同步延迟。
主库上有非事务性操作(如直接操作 MyISAM 表)。
解决方法:
检查主从服务器负载,优化查询性能。
确保所有表都使用 InnoDB 存储引擎。