在腾讯云服务器上搭建 MySQL 主从复制(Master-Slave Replication)可以实现数据的高可用、读写分离和备份。以下是详细的步骤:
一、环境准备
假设你有两台腾讯云 CVM 实例:
- 主服务器(Master):IP
10.0.0.10 - 从服务器(Slave):IP
10.0.0.11
操作系统:Ubuntu/CentOS(以 Ubuntu 20.04 为例)
MySQL 版本:建议使用相同版本(如 MySQL 8.0)
二、安装 MySQL
在 Master 和 Slave 上都安装 MySQL:
# 更新包管理器
sudo apt update
# 安装 MySQL 服务器
sudo apt install mysql-server -y
# 启动并设置开机自启
sudo systemctl start mysql
sudo systemctl enable mysql
注意:首次安装后建议运行
sudo mysql_secure_installation设置 root 密码和安全选项。
三、配置主服务器(Master)
1. 编辑 MySQL 配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
添加或修改以下内容:
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
expire_logs_days = 7
max_binlog_size = 100M
server-id:唯一标识,主为 1,从为 2。log-bin:启用二进制日志(必须)。binlog-format:推荐 ROW 模式,兼容性好。
2. 重启 MySQL
sudo systemctl restart mysql
3. 创建用于复制的用户
登录 MySQL:
mysql -u root -p
执行 SQL:
-- 创建复制用户(允许从 Slave 连接)
CREATE USER 'repl'@'10.0.0.11' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.11';
-- 刷新权限
FLUSH PRIVILEGES;
替换
'your_password'为强密码,并确保网络可通。
4. 锁定数据库并获取二进制日志位置
-- 锁定所有表,防止写入
FLUSH TABLES WITH READ LOCK;
-- 查看当前 binlog 状态
SHOW MASTER STATUS;
记录输出中的:
File: 如mysql-bin.000001Position: 如156
示例输出:
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 156 | | | | +------------------+----------+--------------+------------------+-------------------+
⚠️ 此时不要退出 MySQL,保持锁状态,直到从服务器配置完成。
四、配置从服务器(Slave)
1. 编辑 MySQL 配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
添加:
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
log-slave-updates = 1
read-only = 1
server-id必须与主不同。read-only = 1表示从库只读(防止误写)。
2. 重启 MySQL
sudo systemctl restart mysql
3. 登录 MySQL 并配置复制
mysql -u root -p
执行:
CHANGE MASTER TO
MASTER_HOST='10.0.0.10',
MASTER_USER='repl',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=156;
-- 启动复制
START SLAVE;
-- 查看复制状态
SHOW SLAVE STATUSG
注意:
MASTER_HOST是主服务器内网 IP(建议用内网通信)。MASTER_LOG_FILE和MASTER_LOG_POS填写主服务器SHOW MASTER STATUS的结果。
五、解锁主服务器
回到主服务器的 MySQL 终端,执行:
UNLOCK TABLES;
解锁后主服务器恢复写操作。
六、验证主从复制
1. 检查从服务器状态
在从服务器执行:
SHOW SLAVE STATUSG
确认以下两个字段为 Yes:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果有错误,检查错误信息(Last_Error)进行排查。
2. 测试数据同步
在主服务器创建数据库和表:
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE t1 (id INT);
INSERT INTO t1 VALUES (1);
在从服务器查询:
USE testdb;
SELECT * FROM t1;
如果能看到 (1),说明同步成功。
七、注意事项
-
网络互通:确保主从服务器在同一个 VPC 内,通过内网通信,开放 3306 端口(安全组设置)。
-
时间同步:建议开启 NTP 时间同步。
-
防火墙:关闭防火墙或放行 3306 端口。
-
初始数据一致性:如果主库已有数据,建议使用
mysqldump导出导入保证一致性:# 在主库导出 mysqldump -u root -p --all-databases --master-data=2 > backup.sql # 将 backup.sql 传到从库并导入 mysql -u root -p < backup.sql导入后
CHANGE MASTER TO可自动获取正确的 binlog 位置。
八、常见问题排查
-
Slave_IO_Running: No:网络不通、用户权限不足、防火墙拦截。 -
Slave_SQL_Running: No:数据冲突、SQL 执行错误,可尝试跳过错误(谨慎):SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;
✅ 完成以上步骤后,你的腾讯云 MySQL 主从复制就搭建成功了!
如需进一步实现读写分离,可结合中间件如 MyCat、ProxySQL 或应用层控制。
PHPWP博客