MySQL 主从复制是指将一个 MySQL 数据库(主库)上的数据同步到一个或多个 MySQL 数据库(从库)上的机制。复制可以用于负载均衡、备份、容灾等场景。MySQL 5.7 在主从复制配置上有一些改进,支持更灵活的配置和功能。本文将详细介绍 MySQL 5.7 主从复制的安装和工作原理,并分别介绍 一主二从 和 二主二从 的配置方法。
一、MySQL 主从复制工作原理
MySQL 主从复制的基本原理是:
主库(Master):
- 主库是数据源,所有的写操作(INSERT、UPDATE、DELETE等)都发生在主库上。主库将数据更改记录到二进制日志(binlog)中。
- MySQL 通过二进制日志记录所有的更改操作,并将这些日志信息传递给从库。
从库(Slave):
- 从库会读取主库的二进制日志,执行日志中记录的操作,从而使得从库的数据与主库保持同步。
- 从库通过 I/O 线程 从主库获取 binlog 事件,通过 SQL 线程 执行这些事件,更新本地数据。
主从复制的基本流程:
- 主库记录所有更改操作到 binlog 文件。
- 从库通过 I/O 线程连接到主库,读取 binlog 中的内容(包括 SQL 语句或事件)。
- 从库通过 SQL 线程将这些 binlog 事件应用到自己的数据表中。
二、MySQL 5.7 主从复制的安装和配置
1. 安装 MySQL 5.7
假设你要配置 MySQL 复制的机器已经安装了 MySQL 5.7,假定安装了 3 台机器:
- 主库:192.168.1.1
- 从库 1:192.168.1.2
- 从库 2:192.168.1.3
2. 配置主库(Master)
2.1. 配置主库的 my.cnf
首先,编辑主库的 my.cnf
配置文件(一般位于 /etc/my.cnf
或 /etc/mysql/my.cnf
):
[mysqld]
# 启用二进制日志
log-bin = mysql-bin
# 设置唯一的服务器 ID(每个节点必须唯一)
server-id = 1
# 设置日志格式,ROW格式最为常用
binlog_format = row
# 开启同步复制(可以确保一致性)
sync_binlog = 1
# 开启GTID模式(可以使用基于GTID的复制)
gtid_mode = ON
enforce-gtid-consistency = ON
# 配置复制使用的数据库(可选,指定只同步部分数据库)
# binlog-do-db = mydb
2.2. 重启 MySQL 服务
修改完成后,重启 MySQL 服务使配置生效:
sudo systemctl restart mysql
2.3. 创建复制账号
登录主库创建一个专门用于复制的账号:
mysql -u root -p
-- 创建复制账号
CREATE USER 'replica'@'%' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;
-- 获取当前主库的二进制日志文件名和位置
SHOW MASTER STATUS;
输出类似如下:
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 107 | | | |
+-------------------+----------+--------------+------------------+-------------------+
记录下 File
(如 mysql-bin.000001
)和 Position
(如 107
)的值,这是配置从库时需要用到的信息。
3. 配置从库(Slave)
3.1. 配置从库的 my.cnf
同样,编辑从库的 my.cnf
配置文件(一般位于 /etc/my.cnf
或 /etc/mysql/my.cnf
):
[mysqld]
# 设置唯一的服务器 ID
server-id = 2 # 从库1配置为2,从库2配置为3
# 设置读取主库的二进制日志
relay-log = mysql-relay-bin
log-bin = mysql-bin
gtid_mode = ON
enforce-gtid-consistency = ON
3.2. 配置从库连接主库
在从库上执行以下命令,指定主库的连接信息:
mysql -u root -p
-- 配置从库连接到主库
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='192.168.1.1', -- 主库 IP 地址
MASTER_USER='replica', -- 复制账号
MASTER_PASSWORD='replica_password', -- 复制账号密码
MASTER_LOG_FILE='mysql-bin.000001', -- 主库的 binlog 文件
MASTER_LOG_POS=107, -- 主库的 binlog 位置
MASTER_AUTO_POSITION = 1; -- 开启 GTID 模式
-- 启动从库复制进程
START SLAVE;
-- 查看从库状态
SHOW SLAVE STATUS\G;
3.3. 检查复制状态
运行以下命令检查从库的复制状态,确认是否正常同步:
SHOW SLAVE STATUS\G
如果 Slave_IO_Running
和 Slave_SQL_Running
都是 Yes
,则表示复制成功。
三、配置一主二从(1 Master, 2 Slaves)
在一主二从的配置中,主库可以有多个从库。主库会把数据同步到从库1和从库2,复制过程相同,只是每个从库都需要配置并连接到主库。
- 主库(192.168.1.1)配置已经完成,假设我们用 从库1(192.168.1.2)和 从库2(192.168.1.3)。
配置从库1(
server-id = 2
)和从库2(server-id = 3
),并分别执行CHANGE MASTER TO
指令连接到主库。从库1和从库2都会从主库获取 binlog 数据,执行与主库相同的操作,实现数据同步。
四、配置二主二从(2 Masters, 2 Slaves)
二主二从配置支持双向复制,其中每个主库都有自己的从库,两个主库之间也可以相互复制。这种配置支持读写分离和高可用性。配置时需要格外注意 冲突管理 和 数据一致性。
4.1. 配置主库1和主库2
假设你有两个主库:
- 主库1(192.168.1.1)和 主库2(192.168.1.2)
每个主库都有对应的从库。
- 主库1 配置
server-id = 1
,从库1 配置server-id = 3
。 - 主库2 配置
server-id = 2
,从库2 配置server-id = 4
。
4.2. 配置双向复制
在 主库1 上,创建复制账号,并配置双向复制:
-- 在主库1上创建复制账号
CREATE USER 'replica'@'%' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
-- 配置主库1复制主库2
CHANGE MASTER TO
MASTER_HOST='192.168.1.2',
MASTER_USER='replica',
MASTER_PASSWORD='replica_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107,
MASTER_AUTO_POSITION = 1;
START SLAVE;
在 主库2 上,创建复制账号,并配置双向复制:
-- 在主库2上创建复制账号
CREATE USER 'replica'@'%' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
-- 配置主库2复制主库1
CHANGE MASTER TO
MASTER_HOST='192.168.1.1',
MASTER_USER='replica',
MASTER_PASSWORD='replica_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107,
MASTER_AUTO_POSITION = 1;
START SLAVE;
4.3. 配置从库
在 从库1(192.168.
1.3)和 从库2(192.168.1.4)上,分别配置与相应主库的复制关系。
五、总结
- 一主二从:适用于主库有多个从库的场景。主库进行数据更新,从库同步数据。配置时需要确保每个节点的
server-id
唯一。 - 二主二从:适用于双主复制的场景,允许两个主库互相复制。配置时需要小心数据冲突,尤其是在同时进行写操作时。
在实际运维中,主从复制需要监控和管理复制延迟、复制中断等问题。对于高可用环境,可以结合 MHA、Orchestrator 或 Galera Cluster 等技术实现更高的可靠性和容错性。
最后编辑:严锋 更新时间:2024-11-09 15:59