李解的博客

2021-08-07

MYSQL-双主集群搭建

准备工作

  • 安装三台MySql,两台做双主节点, 一台做为从节点
  • Mysql的版本需要保持一致,以免不必要的诡异错误
  • 本文使用的mysql版本为8.0.26
  • 文中的主机信息如下
    • 主节点1 172.16.1.1
    • 主节点2 172.16.1.2
    • 从节点 172.16.1.3

配置主节点参数

  • 修改参数

分别修改mysql配置文件 默认的配置文件存储路径为/etc/my.cnf,mysql版本不同路径会略有差异

将下列配置写入

[mysqld]
# 默认配置,按照需求更改
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
# -------- 集群配置 ---------
# 每台服务器ID为集群内唯一, 例如1,2,3
server_id=1 
# 开启binlog,数据同步的关键
log_bin=on
# 事务隔离级别, 不可重复度
transaction_isolation=READ-COMMITTED
# 自增起始位置
auto_increment_offset = 1
# 自增递增, 两个主库保持不同即可
auto_increment_increment = 2
# 主从复制模式开启
gtid_mode=on
enforce_gtid_consistency=1
# 从库连接
default_authentication_plugin=mysql_native_password
# 将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启
log-slave-updates = true 
# 开启表名小写转换,表名叫规范可以不开启,大小写表名混用建议开启
# 同时需要注意这个配置只有在数据库初始化时才会生效,初始化之后mysql会报异常,提示不允许更新
lower_case_table_names=1
  • 分别重启数据库

配置主节点

  • 连接mysql

  • 创建用户repl

create user repl@'172.16.1.%' identified by 'repl';

可以使用%模糊匹配,比如172.16.1.%表示172.16.1下所有的ip地址都可以

  • 授权用户REPLICATION SLAVE权限
GRANT REPLICATION SLAVE ON *.* to repl@'172.16.1.%';
  • 重置主节点
reset master

双主节点配置

第二个主节点同一个主节点一样,其实就是两个主节点互相指定对象为主节点,需要注意的是双主下必须开启log-slave-updates的配置

  • 创建用户repl
create user repl@'172.16.1.%' identified by 'repl'

可以使用%模糊匹配,比如repl@172.16.1.%表示172.16.1下所有的ip地址都可以使用repl用户连接

  • 授权用户REPLICATION SLAVE权限
GRANT REPLICATION SLAVE ON *.* to repl@'172.16.1.%';
  • 重置主节点
reset master;

双主节点需要分别配置另外一个主节点为自身的主节点

在主节点1执行

change master to master_host='172.16.1.2',master_port=3306,master_user='repl',master_password='repl',master_auto_position=1;
start slave;

在主节点2执行

change master to master_host='172.16.1.1',master_port=3306,master_user='repl',master_password='repl',master_auto_position=1;
start slave;

配置从节点

  • 重置主节点
reset master;
  • 指定主节点
change master to master_host='172.16.1.1',master_port=3306,master_user='repl',master_password='repl',master_auto_position=1;
  • 重置从节点
start slave;

验证节点状态

在所有节点中输入 show slave status \G

主要查看 Slave_IO_Running, Slave_IO_Running 均为 yes 说明同步开启成功

*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
1 row in set, 1 warning (0.00 sec)

数据验证

双主验证

分别连接主库1,主库2

create schema test

在主库2,从库中执行

use test
# 显示 Database changeed 说明成功

在主库2执行建表语句

create table test(id int);

在主库1执行

desc test
# 如下显示说明双主互相同步
#+-------------+---------------+------+-----+---------+----------------+
#| Field       | Type          | Null | Key | Default | Extra          |
#+-------------+---------------+------+-----+---------+----------------+
#| ID          | int           | YES  |     | NULL    |                |
#+-------------+---------------+------+-----+---------+----------------+
#1 rows in set (0.00 sec)

主从验证

在从库中执行如下语句,没有问题说明从库同步成功

use test;
desc test;

大致流程

  • 安装N台mysql
  • 分别修改N台mysql的配置文件,并重启
  • 创建同步用户并授权
  • 分别指定主节点并开启同步
  • 验证

通过Docker创建

x86架构mysql镜像 Mysql - Official Image | Docker Hub

arm架构mysql镜像 mysql/mysql-server - Docker Image | Docker Hub

docker pull mysql

分别在宿主机创建mysql数据卷映射目录,根据自身情况创建对应目录就好

# mysql数据目录
mkdir /mysql/data
# 将上文中的配置文件写入或上传
touch /mysql/my.cnf 

注意: 下面的启动命令将mysql的配置文件做为数据卷映射,如果配置文件不正确会出现异常

docker run -itd \ # -it通过交互模式运行容器并分配伪终端,-d守护进程后台运行
-p 3306:3306 \ #本地3306端口映射容器3306端口
-v /mysql/data:/var/lib/mysql \ #mysql数据映射
-v /mysql/my.cnf:/etc/my.cnf \ #mysql默认配置文件映射
-e MYSQL_ROOT_PASSWOR=123456 \ #mysql root默认密码
--privileged=true \ #拥有宿主机root权限
--name mysql-master \ # container-name
mysql # 根据情况选择版本

其余与上文一样

架构图示

WX20210807-194300@2x