MySQL 5.7 的双主配置可以实现两台 MySQL 服务器之间的双向数据同步,这样在任何一台服务器上进行的数据修改都会同步到另一台服务器上。以下是详细的配置步骤:
环境准备
- 两台安装了 MySQL 5.7 的服务器,分别记为
Server A
和Server B
。 - 两台服务器之间网络可以互相访问。
配置 Server A
1. 编辑 MySQL 配置文件
打开 MySQL 配置文件 my.cnf
(通常位于 /etc/mysql/my.cnf
或 /etc/my.cnf
),添加或修改以下配置:
[mysqld]
# 唯一的服务器 ID,范围 1 - 2^32 - 1
server-id = 1
# 开启二进制日志
log-bin = mysql-bin
# 忽略对 mysql 系统数据库的同步
binlog-ignore-db = mysql
# 启用行级复制
binlog_format = ROW
# 自动递增的起始值
auto-increment-increment = 2
# 自动递增的偏移量
auto-increment-offset = 1
# 确保主从复制的一致性
sync-binlog = 1
# 开启中继日志
relay-log = mysql-relay-bin
# 跳过从库错误
slave-skip-errors = all
修改完成后,重启 MySQL 服务:
sudo systemctl restart mysql
2. 创建用于复制的用户
登录 MySQL 并创建一个具有复制权限的用户:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
3. 查看二进制日志信息
SHOW MASTER STATUS;
记录下 File
和 Position
的值,后续配置 Server B
时会用到。
配置 Server B
1. 编辑 MySQL 配置文件
同样打开 my.cnf
文件,添加或修改以下配置:
[mysqld]
# 唯一的服务器 ID,不能与 Server A 相同
server-id = 2
# 开启二进制日志
log-bin = mysql-bin
# 忽略对 mysql 系统数据库的同步
binlog-ignore-db = mysql
# 启用行级复制
binlog_format = ROW
# 自动递增的起始值
auto-increment-increment = 2
# 自动递增的偏移量
auto-increment-offset = 2
# 确保主从复制的一致性
sync-binlog = 1
# 开启中继日志
relay-log = mysql-relay-bin
# 跳过从库错误
slave-skip-errors = all
修改完成后,重启 MySQL 服务:
sudo systemctl restart mysql
2. 创建用于复制的用户
登录 MySQL 并创建一个具有复制权限的用户:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
3. 查看二进制日志信息
SHOW MASTER STATUS;
记录下 File
和 Position
的值,后续配置 Server A
时会用到。
配置 Server A 作为 Server B 的从库
在 Server B
上执行以下命令,配置 Server A
作为从库:
CHANGE MASTER TO
MASTER_HOST='Server_A_IP',
MASTER_USER='repl_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='Server_A_File',
MASTER_LOG_POS=Server_A_Position;
其中 Server_A_IP
是 Server A
的 IP 地址,Server_A_File
和 Server_A_Position
是之前在 Server A
上执行 SHOW MASTER STATUS;
记录的值。
启动从库:
START SLAVE;
检查从库状态:
SHOW SLAVE STATUS\G
确保 Slave_IO_Running
和 Slave_SQL_Running
都为 Yes
。
配置 Server B 作为 Server A 的从库
在 Server A
上执行以下命令,配置 Server B
作为从库:
CHANGE MASTER TO
MASTER_HOST='Server_B_IP',
MASTER_USER='repl_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='Server_B_File',
MASTER_LOG_POS=Server_B_Position;
其中 Server_B_IP
是 Server B
的 IP 地址,Server_B_File
和 Server_B_Position
是之前在 Server B
上执行 SHOW MASTER STATUS;
记录的值。
启动从库:
START SLAVE;
检查从库状态:
SHOW SLAVE STATUS\G
确保 Slave_IO_Running
和 Slave_SQL_Running
都为 Yes
。
测试双主复制
在 Server A
上创建一个数据库和表,并插入一些数据:
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE test_table (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255));
INSERT INTO test_table (name) VALUES ('test');
然后在 Server B
上检查是否同步了这些数据:
USE test_db;
SELECT * FROM test_table;
同样,在 Server B
上进行数据修改,检查 Server A
是否同步。
通过以上步骤,你就完成了 MySQL 5.7 的双主配置。