MYSQL-双主集群搭建
MySql搭建双主集群
准备工作
- 安装三台MySql,两台做双主节点, 一台做为从节点
- Mysql的版本需要保持一致,以免不必要的诡异错误
- 本文使用的mysql版本为8.0.26
- 文中的主机信息如下
- 主节点1
172.16.1.1
- 主节点2
172.16.1.2
- 从节点
172.16.1.3
- 主节点1
配置主节点参数
- 修改参数
分别修改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 # 根据情况选择版本
其余与上文一样