一、背景
在高可用性和数据冗余的需求下,MySQL 的双主同步配置是一个常见的解决方案。本文将详细介绍如何在 Docker 环境中实现这一配置。
二、具体操作
1、创建目录结构
首先,我们需要创建必要的目录结构来存放 MySQL 的数据和配置文件。假设我们的工作目录为 ~/test/mysql_test1
,目录结构如下:
~/test/mysql_test1
-- mysql
-- mone
-- data
-- conf
-- my.cnf
-- mtwo
-- data
-- conf
-- my.cnf
2、配置文件编写
接下来,我们需要编写两个主节点的配置文件 my.cnf
。
Mone: my.cnf
[mysqld]
server_id = 1
log-bin = mysql-bin
replicate-ignore-db = mysql
replicate-ignore-db = sys
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
read-Only= 0
relay_log = mysql-relay-bin
log-slave-updates = on
auto-increment-offset = 1
auto-increment-increment = 2
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
Mtwo: my.cnf
[mysqld]
server_id = 2
log-bin = mysql-bin
replicate-ignore-db = mysql
replicate-ignore-db = sys
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
read-Only= 0
relay_log = mysql-relay-bin
log-slave-updates = on
auto-increment-offset = 2
auto-increment-increment = 2
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
3、创建并启动 Docker 容器
使用以下命令创建并启动两个 MySQL 容器:
// 创建并启动 mone 容器
docker run --name monemysql -d -p 3317:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test1/mone/data:/var/lib/mysql -v ~/test/mysql_test1/mone/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7
// 创建并启动 mtwo 容器
docker run --name mtwomysql -d -p 3318:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test1/mtwo/data:/var/lib/mysql -v ~/test/mysql_test1/mtwo/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7
4、容器设置
mone 容器设置:
// 进入 mone 容器
docker exec -it monemysql mysql -u root -p
// 创建一个用于同步的用户
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
// 查看主库状态,记录 File 和 Position 的值
SHOW MASTER STATUS;
mtwo 容器设置:
// 进入 mtwo 容器
docker exec -it mtwomysql mysql -u root -p
// 设置主库链接
CHANGE MASTER TO
MASTER_HOST='172.17.0.11',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=154,
MASTER_PORT=3306;
// 创建一个用于同步的用户
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
// 启动同步
START SLAVE;
// 查看主库状态
SHOW MASTER STATUS;
设置完成后,再次进入 mone 容器,设置 mtwo 为主库:
// 进入 mone 容器
docker exec -it monemysql mysql -u root -p
// 设置 mtwo 主库链接
CHANGE MASTER TO
MASTER_HOST='172.17.0.12',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=443,
MASTER_PORT=3306;
// 启动同步
START SLAVE;
配置完成后,可以通过以下命令验证双主同步是否成功:
// 在 mone 容器中
SHOW SLAVE STATUS\G;
// 在 mtwo 容器中
SHOW SLAVE STATUS\G;
如果两个容器中的 Slave_IO_Running
和 Slave_SQL_Running
均为 Yes
,则说明双主同步配置成功。
三、验证
1、在 mone 库中操作:
CREATE DATABASE mone_demo;
USE mone_demo;
CREATE TABLE userinfo (username VARCHAR(50), age INT);
INSERT INTO userinfo VALUES ('Tom', 18);
SELECT * FROM userinfo;
2、在 mone 库操作完后,在 mtwo 库中查看验证:
USE mone_demo;
SELECT * FROM userinfo;
可以看到,数据已经同步到 mtwo 库中。
3、在 mtwo 库中,新增记录:
INSERT INTO userinfo VALUES ('mtwo', 20);
在 mone 库中查看,发现在 mtwo 库中新增的记录也同步到了 mone 库中。
4、继续验证,在 mtwo 库中新增一个数据库:
CREATE DATABASE mtwo_demo;
在 mone 库中查看验证:
SHOW DATABASES;
可以看到,新创建的数据库已经同步到了 mone 库中。
至此,MySQL 的双主同步配置和验证就完成了。希望本文对您有所帮助,欢迎点赞和关注。