一、主备架构简介
- Master(主库):负责处理所有写操作(INSERT/UPDATE/DELETE),并记录二进制日志(binlog)。
- Slave(备库):从主库拉取 binlog,重放 SQL,保持数据同步。
- 用途:
- 数据备份
- 读写分离(读请求走备库)
- 高可用基础
二、环境准备
节点 | ip地址 | 角色 |
---|---|---|
Node1 | 192.168.1.10 | Master |
Node2 | 192.168.1.11 | Slave |
确保两台机器网络互通,时间同步(可使用 ntp 或阿里云 NTP)。
三、配置主库(Master)
1. 修改配置文件 my.cnf
Ubuntu 路径:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
CentOS 路径:sudo nano /etc/my.cnf
在 [mysqld]
段添加以下内容:
[mysqld]
# 唯一服务器ID
server-id = 1# 开启二进制日志(核心)
log-bin = mysql-bin# 数据库名称(可选,多个用逗号分隔)
# binlog-do-db = mydb# 不同步的数据库(可选)
# binlog-ignore-db = mysql
# binlog-ignore-db = information_schema# 可选:设置 binlog 格式(推荐 ROW)
binlog-format = ROW# 可选:设置过期时间
expire-logs-days = 7
bind-address = 0.0.0.0
2. 重启 MySQL
sudo systemctl restart mysql
3. 创建用于复制的账号
登录 MySQL:mysql -u root -p
-- 创建复制用户(允许从 Slave 连接)
CREATE USER 'repl'@'192.168.1.11' IDENTIFIED BY 'repl_password';-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.11';-- 刷新权限
FLUSH PRIVILEGES;
4. 查看主库状态(记录位置)
SHOW MASTER STATUS;
输出示例:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
记下 File 和 Position,稍后在 Slave 上使用。
四、配置备库(Slave)
1. 修改配置文件 my.cnf
同样编辑 Slave 的 MySQL 配置文件,在 [mysqld] 中添加:
[mysqld]
# 唯一服务器ID(不能和 Master 相同)
server-id = 2# 开启中继日志
relay-log = mysql-relay-bin# 可选:只读模式(防止误写)
read_only = 1# 如果是多级复制,开启
# log-slave-updates = 1
2. 重启 MySQL
sudo systemctl restart mysql
3. 配置主从关系
进入Slave MySQL:
-- 停止可能存在的旧复制
STOP SLAVE;-- 配置主库信息
CHANGE MASTER TOMASTER_HOST='192.168.1.10',MASTER_USER='repl',MASTER_PASSWORD='repl_password',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;-- 启动复制
START SLAVE;
MASTER_LOG_FILE 和 MASTER_LOG_POS 是在 Master 上 SHOW MASTER STATUS 得到的值
五、验证主从同步
1. 查看 Slave 状态
SHOW SLAVE STATUS\G
关键字段说明:
- Slave_IO_Running: Yes → 成功拉取 binlog
- Slave_SQL_Running: Yes → 成功执行 SQL
- Seconds_Behind_Master:延迟时间(0 表示同步完成)
如果两个都是 Yes,说明主从同步正常。
六、测试数据同步
在 Master 上执行:
CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;
CREATE TABLE t1 (id INT, name VARCHAR(20));
INSERT INTO t1 VALUES (1, 'zhangsan');
在 Slave 上执行:
SHOW DATABASES LIKE 'testdb';
USE testdb;
SELECT * FROM t1;
如果能看到数据,说明同步成功
七、主备切换(手动故障转移)
当 Master 宕机时,可手动将 Slave 提升为新 Master:
1. 在原 Slave 上执行:
-- 1. 停止复制
STOP SLAVE;-- 2. 查看当前状态(可选)
SHOW SLAVE STATUS\G
-- 确保已停止,且数据已同步完-- 3. 清除复制信息(非常重要)
RESET SLAVE ALL;-- 4. 设置为可写(取消只读)
SET GLOBAL read_only = OFF;-- 5. (可选)创建新复制用户,供未来 Slave 使用
CREATE USER 'repl'@'%' IDENTIFIED BY 'YourReplPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
2.将原 Master 变为 Slave
-- 1. 重置自身状态
RESET MASTER; -- 清除旧的 binlog(谨慎使用)
RESET SLAVE ALL;-- 2. 配置连接到新 Master
CHANGE MASTER TOMASTER_HOST='192.168.50.134',MASTER_USER='repl',MASTER_PASSWORD='YourReplPassword123!',MASTER_AUTO_POSITION=1;-- 3. 启动复制
START SLAVE;-- 4. 查看状态
SHOW SLAVE STATUS\G
确保 Slave_IO_Running: Yes, Slave_SQL_Running: Yes