Mysql 8 MGR集群单主配置图解

声明与简介

本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。本文主要介绍mysql的MGR集群的配置。

MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引进的一个数据库高可用与高扩展的解决方案,以插件形式提供,实现了分布式下数据的最终一致性。其特点如下:

  • 高一致性:基于分布式paxos协议实现组复制,保证数据一致性;
  • 高容错性:自动检测机制,只要不是大多数节点都宕机就可以继续工作,内置防脑裂保护机制;
  • 高扩展性:节点的增加与移除会自动更新组成员信息,新节点加入后,自动从其他节点同步增量数据,直到与其他节点数据一致;
  • 高灵活性:提供单主模式和多主模式,单主模式在主库宕机后能够自动选主,所有写入都在主节点进行,多主模式支持多节点写入

:1 当前MGR集群验证环节在VVMware虚拟机内,真实环境可略过虚拟机复制环节。

       2 当前虚拟机内mysql库运行在Centos 8内,版本号是 8.0.23、端口号3306。

       3 MGR集群当前验证环境192.168.111.128(host_128)是单主节点,host_129、host_130是从节点。

虚拟机复制

Step 1:先选择一台虚拟机(鼠标点中),然后找到克隆按钮。

Mysql 8 group replication组复制集群单主配置图解_mysql

Step 2:克隆虚拟机当前状态

Mysql 8 group replication组复制集群单主配置图解_初始化_02

 Step 3:选择创建完整克隆

Mysql 8 group replication组复制集群单主配置图解_数据库_03

Step4:配置虚拟机名字和存储位置

Mysql 8 group replication组复制集群单主配置图解_初始化_04

Step 5:耐心等待克隆完毕

Mysql 8 group replication组复制集群单主配置图解_初始化_05

Step 6:修改新克隆的虚拟机,修改IP

#修改网卡信息
vi /etc/sysconfig/network-scripts/ifcfg-ens33

Mysql 8 group replication组复制集群单主配置图解_初始化_06

Step 7:修改主机名,配置IP与主机名映射。

# 定义IP与主机名映射
vi /etc/hosts

Mysql 8 group replication组复制集群单主配置图解_数据库_07

Step 8:重启服务器

#重启虚拟机
reboot now

Step 9:同样的方式操作另外一台虚拟机。

准备环境

  • 准备3台版本一致(一样)的mysql数据库的主机,当前主服务数据库服务的操作系统都是linux。详见虚拟机复制环节。
  • 192.168.111.128(host_128)是单主节点,192.168.111.129(host_129)、192.168.111.130(host_130)是从节点。

配置MGR集群

安装MGR插件

-- 三台主机里都安装group_replication插件,可事先三台都执行该操作。
-- Step 1查看 MGR插件是否安装,如果已安装可忽略如下安装插件环节。
SELECT PLUGIN_NAME, PLUGIN_STATUS, PLUGIN_TYPE, PLUGIN_LIBRARY, PLUGIN_LICENSE FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'group%' AND PLUGIN_STATUS='ACTIVE';

Mysql 8 group replication组复制集群单主配置图解_数据库_08

-- Step 2 安装MGR插件
install PLUGIN group_replication SONAME 'group_replication.so';

Mysql 8 group replication组复制集群单主配置图解_初始化_09

-- Step 3 验证MGR插件状态
SELECT PLUGIN_NAME, PLUGIN_STATUS, PLUGIN_TYPE, PLUGIN_LIBRARY, PLUGIN_LICENSE FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'group%' AND PLUGIN_STATUS='ACTIVE';

Mysql 8 group replication组复制集群单主配置图解_数据库_10

生成集群组名

-- Way1 :参照官网使用固定的值aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa,该值在三个节点都配置成一样。

-- Way2:通过uuid生成唯一的id。
select replace(uuid(),"-","") as uuid;

Mysql 8 group replication组复制集群单主配置图解_初始化_11

配置单主节点MGR参数

Step  1: 修改mysql配置文件/etc/my.cnf,追加引用外部文件参数

!include /etc/my.cnf.d/ mgr_auth.cnf

Step 2:  /etc/my.cnf.d目录内新建MGR配置文件mgr_auth.cnf

Step 3 mgr_auth.cnf文件内配置如下内容:

[mysqld]

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

server_id=1 #其它节点相应修改,不能重复

gtid_mode=ON

enforce_gtid_consistency=ON

binlog_checksum=NONE

log_bin=binlog

log_slave_updates=ON

binlog_format=ROW

master_info_repository=TABLE

relay_log_info_repository=TABLE

transaction_write_set_extraction=XXHASH64

plugin_load_add='group_replication.so'

group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

group_replication_start_on_boot=off

group_replication_local_address= "host_128:33091" #修改成节点对应主机名

group_replication_group_seeds= "host_128:33091,host_129:33091,host_130:33091"

group_replication_bootstrap_group=off

:1 这里的step 1外部引用MGR配置文件是为了mysql配置和MGR参数分离,如果不需要可以将MGR参数放置于mysql的配置文件内。

2 这里的group_replication_group_name来源于生成组名环节。

 端口加入防火墙信任列表

#MGR集群组复制端口33091加入信任列表
firewall-cmd --add-port=33091/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
#注:如果防火墙关闭,可忽略此步骤。

Mysql 8 group replication组复制集群单主配置图解_mysql_12

重启单主mysql

#重启单主节点数据库
service mysqld restart

创建同步用户

--单主节点创建该用户并赋予从服务复制权限,从节点在配置其它节点环节会有相同的操作。
SET SQL_LOG_BIN=0;
create user rpl_user@'%' identified by 'Rpl_user123';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;

Mysql 8 group replication组复制集群单主配置图解_初始化_13

启动MGR集群主节点

--在单主节点上启动MGR集群引导
SET GLOBAL group_replication_bootstrap_group=ON;

--用之前创建的用户rpl_user创建同步规则认证
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Rpl_user123' FOR CHANNEL 'group_replication_recovery';

-- 启动MGR
start group_replication;

-- 查看MGR集群状态
SELECT * FROM performance_schema.replication_group_members;

--在主库上关闭MGR集群引导
SET GLOBAL group_replication_bootstrap_group=OFF;

Mysql 8 group replication组复制集群单主配置图解_数据库_14

配置其它从节点

#Step 1:scp分发mysql配置文件到129和130主机上去
scp -r /etc/my.cnf root@host_129:/etc/
scp -r /etc/my.cnf root@host_130:/etc/

Mysql 8 group replication组复制集群单主配置图解_初始化_15

#Step 2:分发MGR配置文件到129和130主机上去
scp -r /etc/my.cnf.d/mgr_auth.cnf root@host_129:/etc/my.cnf.d/
scp -r /etc/my.cnf.d/mgr_auth.cnf root@host_130:/etc/my.cnf.d/

Mysql 8 group replication组复制集群单主配置图解_mysql_16

#Step3: 分别修改129、130 里的MGR配置文件。
#host_129内mgr_auth.cnf文件里修改部分的参数有:
server-id = 2
group_replication_local_address= "host_129:33091"

#host_130内mgr_auth.cnf文件里修改部分的参数有:
server-id = 3
group_replication_local_address= "host_130:33091"

启动MGR集群从节点

-- 将节点host_129里接入组。
-- Step 1:重复创建同步用户环节在从节点里创建用户并赋权。

-- Step 2:添加用户认证
CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='Rpl_user123' FOR CHANNEL 'group_replication_recovery';

-- 注: mysql 8.0.23之前版本用以下命令:
/*
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD=' Rpl_user123' FOR CHANNEL 'group_replication_recovery';
*/

-- Step 3:开始group_replication组复制,使得当前节点接入组。
START GROUP_REPLICATION;

-- Step 4:当前节点上查看MGR集群 成员与状态
SELECT * FROM performance_schema.replication_group_members;

Mysql 8 group replication组复制集群单主配置图解_mysql_17

以上同样的操作应用于host130,最终集群的状态都在线且一个是Primary,另外两个是SECONDARY。至此MGR单主模式搭建完毕。

Mysql 8 group replication组复制集群单主配置图解_mysql_18

验证

从节点数据库修改

从库里插入数据时报错,符合单主模式的特点(即仅主节点可写,从节点不可写)。

ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

Mysql 8 group replication组复制集群单主配置图解_mysql_19

延展阅读

查看插件系统路径

-- SQL命令查看插件的系统路径
show variables like 'plugin%';

Mysql 8 group replication组复制集群单主配置图解_mysql_20

查看MGR插件位置

#查看MGR插件系统路径
ll /usr/lib64/mysql/plugin/ | grep group*

Mysql 8 group replication组复制集群单主配置图解_mysql_21

查看plugin命令帮助手册

-- 查看SQL命令的使用说明
? show plugins;

Mysql 8 group replication组复制集群单主配置图解_初始化_22

注:​​show plugins命令官方详细介绍​​。

重新初始化数据库

#Step 1初始化数据库
#赋予数据目录访问权限给mysql用户
chown -R mysql:mysql /data/mysql/
# 删除数据目录下文件
rm -rf /data/mysql/*
#初始化数据库
mysqld --initialize --user=mysql --basedir=/usr/ --datadir=/data/mysql/
# 找到生成的临时密码
grep 'temporary password' /var/log/mysqld.log

Mysql 8 group replication组复制集群单主配置图解_数据库_23

:1 初始化数据库操作仅限于实验或者新环境。

       2 初始化mysql时配置参数不能有错误。

# Step 2 启动服务修改数据库密码
# 启动mysql服务
service mysqld start
# 以初始密码登入数据库
mysql -uroot -p'czkik+j)y84A'
# 修改新的数据库密码(Mysql里操作)
alter user root@localhost identified by 'root1234';

Mysql 8 group replication组复制集群单主配置图解_初始化_24