MySQL8.0.37组复制MGR配置详解
目录
环境准备
拉起容器节点
容器中安装用到的工具
配置hosts文件
安装插件
创建复制用户
my.cnf文件配置
master节点
slave1节点
slave2节点
启动MGR
master节点
slave1节点
slave2节点
查看三个节点是否加入组内
问题分析
端口问题
端口参数配置问题
连接到源服务器时用户名无效
hosts文件配置问题
slave节点执行的事务比组中存在的事务多
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 |
环境准备
拉起容器节点
#拉起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;