MySQL8.0.37组复制MGR配置详解


属性 master slave1 slave2
IP 172.17.0.5 172.17.0.6 172.17.0.7
VERSION 8.0.37 8.0.37 8.0.37

环境准备

拉起容器节点

1
2
3
4
5
6
#拉起master节点
docker run -itd --name mysql_mgr_master_8.0.37 -e MYSQL_ROOT_PASSWORD 123456 -p 3310:3306 -v /var/lib/docker/mysql-mgr-master-8.0.37:/var/lib/mysql 8279f68ee77d
#拉起slave1节点
docker run -itd --name mysql_mgr_slave1_8.0.37 -e MYSQL_ROOT_PASSWORD 123456 -p 3320:3306 -v /var/lib/docker/mysql-mgr-slave1-8.0.37:/var/lib/mysql 8279f68ee77d
#拉起slave2节点
docker run -itd --name mysql_mgr_slave2_8.0.37 -e MYSQL_ROOT_PASSWORD 123456 -p 3330:3306 -v /var/lib/docker/mysql-mgr-slave2-8.0.37:/var/lib/mysql 8279f68ee77d

容器中安装用到的工具

拉起三个节点后进入容器使用microndnf命令安装下面两个工具,等会配置的时候需要用到

1
microdnf install -y vim net-tools

配置hosts文件

三个节点都要配置

这里有个遗留问题,不知道为什么每次容器重启后hosts文件都会重置,导致MGR复制出错,详见问题分析

error log

Error connecting to source ‘rep fd8fe63cc738:3306’. This was attempt 1/1, with a delay of 60 seconds between attempts. Message: Unknown MySQL server host ‘fd8fe63cc738’ (-2)

1
2
3
4
#容器节点ip #容器id
172.17.0.5 fd8fe63cc738
172.17.0.6 e5b0f9986741
172.17.0.7 6d570814d8bb

安装插件

三个节点中分别安装MGR插件

1
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

创建复制用户

创建用来复制的用户

1
2
3
create user 'rep' '%' identified by '123456';
grant replication slave on *.* to 'rep' '%' ;
flush privileges;

my.cnf文件配置

下面文件中使用的UUID随机生成就可以

1
select uuid();

master节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
port 3306
bind-address 0.0.0.0

log-bin
server-id 1
gtid_mode ON
enforce_gtid_consistency 1

#Plugin_dir /usr/lib64/mysql/plugin

#禁用二进制日志事件校验,MGR不支持带checksum的binlog event
binlog_checksum NONE

loose-group_replication_recovery_get_public_key ON
loose-group_replication_recovery_use_ssl ON

#使用哈希算法
transaction_write_set_extraction XXHASH64
#组复制的组名
loose-group_replication_group_name ba3350b0-0abc-11f0-a872-0242ac110006
#不自动启动组复制
loose-group_replication_start_on_boot OFF
#本机地址和端口
loose-group_replication_local_address 172.17.0.5:33061
#组中成员
loose-group_replication_group_seeds 172.17.0.5:33061,172.17.0.6:33061,172.17.0.7:33061
#不启用引导组,手动引导启动
loose-group_replication_bootstrap_group OFF

slave1节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
port 3306
bind-address 0.0.0.0

log-bin
server-id 2
gtid_mode ON
enforce_gtid_consistency 1

binlog_checksum NONE

#这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key ON
loose-group_replication_recovery_use_ssl ON
loose-group_replication_group_name ba3350b0-0abc-11f0-a872-0242ac110006
loose-group_replication_start_on_boot OFF

loose-group_replication_local_address 172.17.0.6:33061
loose-group_replication_group_seeds 172.17.0.5:33061,172.17.0.6:33061,172.17.0.7:33061
loose-group_replication_bootstrap_group OFF

slave2节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
port 3306
bind-address 0.0.0.0

log-bin
server-id 3
gtid_mode ON
enforce_gtid_consistency 1

binlog_checksum NONE

loose-group_replication_recovery_get_public_key ON
loose-group_replication_recovery_use_ssl ON
loose-group_replication_group_name ba3350b0-0abc-11f0-a872-0242ac110006
loose-group_replication_start_on_boot OFF

loose-group_replication_local_address 172.17.0.7:33061
loose-group_replication_group_seeds 172.17.0.5:33061,172.17.0.6:33061,172.17.0.7:33061
loose-group_replication_bootstrap_group OFF

启动MGR

master节点

1
2
3
SET GLOBAL group_replication_bootstrap_group ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group OFF;

slave1节点

1
2
3
4
5
6
7
#指定主从账户与指定通信频道
CHANGE MASTER TO
MASTER_USER 'rep',
MASTER_PASSWORD '123456'
FOR CHANNEL 'group_replication_recovery';
#启动组复制
START GROUP_REPLICATION;

slave2节点

1
2
3
4
5
6
7
#指定主从账户与指定通信频道
CHANGE MASTER TO
MASTER_USER 'rep',
MASTER_PASSWORD '123456'
FOR CHANNEL 'group_replication_recovery';
#启动组复制
START GROUP_REPLICATION;

查看三个节点是否加入组内

1
SELECT * FROM performance_schema.replication_group_members;

问题分析

端口问题

mysql没有监听tcp4的3306端口,导致MGR复制失,再配置文件中开启即可

1
2
port 3306
bind-address 0.0.0.0

端口参数配置问题

下面的这两个参数配置错误导致组成员无法加入复制组

1
2
loose-group_replication_local_address 172.17.0.5:3306
loose-group_replication_group_seeds 172.17.0.5:3306,172.17.0.6:3306,172.17.0.7:3306

修该端口号即可

1
2
loose-group_replication_local_address 172.17.0.5:33061
loose-group_replication_group_seeds 172.17.0.5:33061,172.17.0.6:33061,172.17.0.7:33061

连接到源服务器时用户名无效

这里报错是因为再指定主从账户与指定通信频道的时候还是使用了异步复制的那套配置,查看官方文档后发现这里其实是有区别的

https://dev.mysql.com/doc/refman/8.0/en/group-replication-adding-instances.html

但是这里改变之后又遇到了另一个问题,无法在通道“group_REPLICATION_recovery”上使用给定参数更改复制源,起初以为是复制通道名称的问题,但是换掉名称还是不行,后来查看官网后发现这里没有获取公钥的配置** GET_MASTER_PUBLIC_KEY 1 **,去掉后果然成功了,但是为什么?

最初*GET_MASTER_PUBLIC_KEY 1是为了解决MySQL8.0中密码插件改变导致异步复制的时候slave节点使用rep复制账号连接失败的问题,但是为什么这里指定通道后会出现这个问题?***(待分析 **

error log

ERROR 3139 (HY000): CHANGE REPLICATION SOURCE with the given parameters cannot be performed on channel ‘group_replication_recovery’.

https://dev.mysql.com/doc/refman/8.0/en/change-master-to.html

嗯,经过一段的时间的排查确定了group_replication_recovery通道有自己的安全机制和配置要求,所以在配置通道的时候不允许使用get_master_public_key

昨天搭建好后,今天去看发现master节点的容器挂掉了,slave1节点选举成了新的master节点,

嗯,发现这个问题后手动的拉起了之前挂掉的master节点,但是拉起之前挂掉master节点后,发现处于recovering状态,于是赶紧去看error log,这就出现了之前提到了8.0密码插件的问题** 在从库连接主库的时候使用的是不被 caching_sha2_password认可的RSA公钥,所以主库MySQL拒绝了数据库连接的请求,从而,从库报错’caching_sha2_password’ reported error:Authentication require secure connection。 **

select * from performance_schema.replication_connection_status\G

嗯,在组复制中要解决这个问题其实也很简单只需要在MySQL的配置文件中加入

loose-group_replication_recovery_get_public_key ON就可以了

hosts文件配置问题

最开始的时候其实是没有去配置hosts文件的,导致出现找不到主机的报错,再容器节点的hosts文件中添加主机映射就可以了,

error log

2025-03-27T08:59:18.354273Z 25 [ERROR] [MY-010584] [Repl] Replica I/O for channel ‘group_replication_recovery’: Error connecting to source ‘rep fd8fe63cc738:3306’. This was attempt 1/1, with a delay of 60 seconds between attempts. Message: Unknown MySQL server host ‘fd8fe63cc738’ (-2), Error_code: MY-002005

但是这里又遇到一个问题,容器节点重启的时候会重置hosts文件,

嗯,经过一段时间的定位,原因找到了,但是怎么解决呐

csdn:docker容器重启之后/etc下某些配置文件被重置的问题_docker run gitlab重启配置文件被还原-CSDN博客

解决方法:可以再容器中写个脚本去自动修改hosts文件,然后再容器启动的时候自动执行这个脚本 /etc/rc.local),最后在/root/.bashrc文件中重新加载下就可以了

1
2
3
4
5
6
7
8
9
10
11
12
#/etc/rc.local
echo 127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.5 fd8fe63cc738
172.17.0.6 e5b0f9986741
172.17.0.7 6d570814d8bb > /etc/hosts
#/root/.bashrc
source /etc/rc.local

slave节点执行的事务比组中存在的事务多

解决方法:

停止组复制-清除事务日志-重启组复制

1
2
3
STOP GROUP_REPLICATION;
RESET MASTER;
START GROUP_REPLICATION;