MySQL双主模式(2022/11/19)

MySQL双主模式(2022/11/19)

本文将介绍如何搭建 MySQL 双主模式,互为主从,均可读写。

一、搭建环境

  • CentOS Linux release 7.8.2003;
  • Docker version 20.10.14;
  • MySQL Ver 14.14 Distrib 5.7.40;

二、搭建过程

2.1 MySQL 服务安装

此处笔者两台服务器的 IP 地址分别为 172.20.2.2 与 172.20.2.3,接下来将通过 Docker 分别在两台服务器上启动 MySQL 服务。

# 创建工作目录
$ mkdir -p /data/mysql

$ cd /data/mysql

# 启动 MySQL 服务
$ docker run --name mysql -itd --restart always \
-p 3306:3306 \
-v $PWD/config:/etc/mysql \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e LANG=C.UTF-8 \
-e TZ=Asia/Shanghai \
--log-driver json-file \
--log-opt max-size=1g \
--log-opt max-file=3 \
mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=1

2.2 binlog 开启

# 在 172.20.2.2. 节点进行以下配置
# 编辑 $PWD/config/mysql.conf.d/mysqld.cnf 文件,不存在则手动创建,添加以下内容
$ mkdir -p $PWD/config/mysql.conf.d && vim $PWD/config/mysql.conf.d/mysqld.cnf
[mysqld]
server-id=1

auto_increment_offset=1
auto_increment_increment=2

binlog-format=row
expire_logs_days=7
log-bin=/var/lib/mysql/mysql-bin.log
log-slave-updates=true
sync_binlog=0

gtid-mode=on
enforce-gtid-consistency=true

replicate-ignore-db=mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=sys

# 重启 MySQL
$ docker restart mysql

# 在 172.20.2.3 节点进行以下配置
# 编辑 $PWD/config/mysql.conf.d/mysqld.cnf 文件,不存在则手动创建,添加以下内容
$ mkdir -p $PWD/config/mysql.conf.d && vim $PWD/config/mysql.conf.d/mysqld.cnf
[mysqld]
server-id=2

auto_increment_offset=2
auto_increment_increment=2

binlog-format=row
expire_logs_days=7
log-bin=/var/lib/mysql/mysql-bin.log
log-slave-updates=true
sync_binlog=0

gtid-mode=on
enforce-gtid-consistency=true

replicate-ignore-db=mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=sys

# 重启 MySQL
$ docker restart mysql

注意:

  1. server-id 为每个节点的标识,不可重复;
  2. auto_increment_offset 与 auto_increment_increment 指定了 172.20.2.2 节点自增主键为奇数、172.20.2.3 节点自增主键为偶数,避免使用自增主键两节点同时写入时主键产生冲突;

2.3 创建节点用户

# 在 172.20.2.2 节点进行以下配置
$ docker exec -it mysql mysql -uroot -p
> CREATE USER master1@172.20.2.3 IDENTIFIED BY '123456';
> GRANT REPLICATION SLAVE ON *.* TO master1@172.20.2.3;
> FLUSH PRIVILEGES;

# 在 172.20.2.3 节点进行以下配置
$ docker exec -it mysql mysql -uroot -p
> CREATE USER master2@172.20.2.2 IDENTIFIED BY '123456';
> GRANT REPLICATION SLAVE ON *.* TO master2@172.20.2.2;
> FLUSH PRIVILEGES;

2.4 关联主从节点

# 在 172.20.2.2 节点进行以下配置
$ docker exec -it mysql mysql -uroot -p
> CHANGE MASTER TO MASTER_HOST='172.20.2.3', MASTER_PORT=3306, MASTER_USER='master2', MASTER_PASSWORD='123456', MASTER_AUTO_POSITION=1;
> START SLAVE;
> SHOW SLAVE STATUS\G;
# 看到以下输出表示成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

# 在 172.20.2.3 节点进行以下配置
$ docker exec -it mysql mysql -uroot -p
> CHANGE MASTER TO MASTER_HOST='172.20.2.2', MASTER_PORT=3306, MASTER_USER='master1', MASTER_PASSWORD='123456', MASTER_AUTO_POSITION=1;
> START SLAVE;
> SHOW SLAVE STATUS\G;
# 看到以下输出表示成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

2.5 测试是否成功

# 在 172.20.2.2 节点创建 test 数据库
$ docker exec -it mysql mysql -uroot -p
> CREATE DATABASE IF NOT EXISTS `test` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 在 172.20.2.3 节点查看是否存在 test 数据库
$ docker exec -it mysql mysql -uroot -p
> SHOW DATABASES;

# 在 172.20.2.3 节点删除 test 数据库
$ docker exec -it mysql mysql -uroot -p
> DROP TABLE IF EXISTS `test`;

# 在 172.20.2.2 节点查看是否还存在 test 数据库
$ docker exec -it mysql mysql -uroot -p
> SHOW DATABASES;

参考链接:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值