问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MySQL 8.0.37组复制(MGR)配置详解

创作时间:
作者:
@小白创作中心

MySQL 8.0.37组复制(MGR)配置详解

引用
CSDN
1.
https://blog.csdn.net/weixin_72610956/article/details/146846054

环境准备

拉起容器节点

# 拉起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命令安装下面两个工具,等会配置的时候需要用到

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)

#容器节点ip      #容器id
172.17.0.5      fd8fe63cc738
172.17.0.6      e5b0f9986741
172.17.0.7      6d570814d8bb  

安装插件

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

INSTALL PLUGIN group_replication SONAME 'group_replication.so';  

创建复制用户

创建用来复制的用户

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

my.cnf文件配置

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

select uuid();  

master节点

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节点

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节点

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节点

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;  

slave1节点

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

slave2节点

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

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

SELECT * FROM performance_schema.replication_group_members;  

问题分析

端口问题

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

port = 3306
bind-address = 0.0.0.0  

端口参数配置问题

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

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"  

修该端口号即可

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文件中重新加载下就可以了

#/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节点执行的事务比组中存在的事务多

解决方法:

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

STOP GROUP_REPLICATION;
RESET MASTER;
START GROUP_REPLICATION;  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号