MGR集群部署,解决执行INSTALL PLUGIN group_replication SONAME 'group_replication.so'时出错!

204 阅读6分钟

参考:万字详解 MySQL MGR 高可用集群搭建-CSDN博客Docker环境下部署MySQL MGR单主模式集群_docker-comm 部署mgr-CSDN博客MySQL :: MySQL 8.4 Reference Manual :: 20.2.1 Deploying Group Replication in Single-Primary Mode这三篇文章。

我在安装group_reolication插件时报错一直解决不了,可以在配置文件加disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" plugin_load_add='group_replication.so'就可以让msyql在启动时自动加载这个插件。

前提

在MySQL服务可以运行的情况下,修改配置文件/etc/my.cnf将msyql服务变成mgr的成员节点。

开始

第一步

首先准备好我们的服务器,随便选一台作为主节点的服务器。 设置主机名字

# 第一台服务器
hostnamectl set-hostname n0
# 第二台服务器
hostnamectl set-hostname n1
# 第三台服务器
hostnamectl set-hostname n2

根据主机和对应的ip写配置 # 3台服务器都执行 在 /etc/hosts 追加

192.168.244.133 n0
192.168.244.135 n1
192.168.244.136 n2

第二步

先配置防火墙:把组复制的端口24901和用到的3306端口放行。

sudo firewall-cmd --add-port=24901/tcp --permanent
sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload

根据官方文档,组复制的节点的配置最好有:disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"和plugin_load_add='group_replication.so'这两段属性。

其中最重要就是:plugin_load_add='group_replication.so 可以让MySQL服务启动自动携带组复制插件,不用我们后续手动安装!

第三步

主节点:

# 修改 MySQL 配置
sudo cat >> /etc/my.cnf <<-'EOF'
[mysqld]
port=3306
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 让mysql启动自动加载插件
plugin_load_add='group_replication.so'# 使用mysql_native_password密码策略,防止navicat连不上mysql8
default_authentication_plugin=mysql_native_password
# 设置MySQL插件目录:MGR基于插件,必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
# 服务器编号,Master=1
server_id=1
# 开启binlog的GTID模式(MGR强制要求)
gtid_mode=ON
# 开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON
# 关闭binlog校验(MGR强制要求)
binlog_checksum=NONE
​
# 定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为 XXHASH64。
transaction_write_set_extraction=XXHASH64
# 确定组复制恢复时是否应该应用 SSL,通常设置为“开”,但默认设置为“关”。
loose-group_replication_recovery_use_ssl=ON
# 服务器实例所在复制组名称,必须是有效的 UUID,所有节点必须相同。
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
# 确定服务器是否应该在服务器启动期间启动组复制。
loose-group_replication_start_on_boot=OFF# 为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。
# 很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换
# 所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address="n0:24901"# 同样采用n0~n2的主机名替代
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901"# 配置此服务器为引导组,这个选项必须仅在一台服务器上设置,
# 并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。
loose-group_replication_bootstrap_group=OFF
EOF

从节点1:

sudo cat >> /etc/my.cnf <<-'EOF'
​
[mysqld]
port=3306
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
plugin_load_add='group_replication.so'default_authentication_plugin=mysql_native_password
plugin_dir=/usr/lib64/mysql/plugin
​
# 设置唯一的服务器编号
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
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="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF# 设置本机地址n1:24901
loose-group_replication_local_address="n1:24901"
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901"
loose-group_replication_bootstrap_group=OFF
EOF

从节点2

sudo cat >> /etc/my.cnf <<-'EOF'
​
[mysqld]
port=3306
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
plugin_load_add='group_replication.so'default_authentication_plugin=mysql_native_password
plugin_dir=/usr/lib64/mysql/plugin
​
#设置唯一的服务器编号
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
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="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF#设置本机地址n2:24901
loose-group_replication_local_address="n2:24901"
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901"
loose-group_replication_bootstrap_group=OFF
EOF

实际上到这里需要在每台服务器都要执行INSTALL PLUGIN group_replication SONAME 'group_replication.so';来安装插件,但是我们在配置文件里写了disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" plugin_load_add='group_replication.so'所以这里不用执行。

连接随便一台mysql实例,执行show plugins可以看见group_replication这个插件是在工作的,状态是ACTIVE就行。

第四步

所有节点执行:

# 创建rpl_user账户,此账户用于实现主从数据同步 # 赋予主从同步权限
CREATE USER rpl_user@'%' IDENTIFIED BY 'asAS123456!';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

# 创建一个远程连接用户,这个用户用在Navcate、JDBC登录的时候,直接用root登录不好
create user 'remote'@'%' identified with mysql_native_password by 'asAS123456!';
grant all privileges on *.* to remote@'%';

# 让刚才的修改生效
FLUSH PRIVILEGES;

# 删除已产生的Binlog
# 一定要RESET MASTER,它会删除刚才已产生的Binlog
# 因为刚才Binglog包含创建用户这种高权限操作,用于主从同步的rpl_user账户是没有权限执行的
# 这就会导致RelayLog重放无法正确执行,导致从属服务器卡死在"RECEVERING"状态
# 利用RESET MASTER删除这些无法执行的binlog,就没问题了
RESET MASTER;

第五步

主节点执行:

# 注意:只在主服务器上运行
# 我们在 primary.cnf 配置文件中把 group_replication_bootstrap_group 参数设置成 OFF
# 在 primary 服务器启动时并不会直接启动复制组,通过下面的命令动态的开启复制组是我们的集群更安全
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

从节点加入集群:

# 指定主从账户与指定通信频道 # 开启组网数据同步 # 查看集群状态
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="asAS123456!" FOR CHANNEL 'group_replication_recovery';

START GROUP_REPLICATION;

SELECT * FROM performance_schema.replication_group_members;

查看节点状态:SELECT * FROM performance_schema.replication_group_members;

查看主节点uuid:select * from performance_schema.global_status where variable_name like '%group%';

在查看节点的状态时,如果从节点的状态是recovering,而且一段时间后还是recovering这个节点就是不正常的,正常的状态是online!这时候就要看日志有什么报错信息了。不过一般都是big-log的问题导致无法数据同步,这时候只要对出现异常的节点操作:

stop group_reolication
reset master

然后再执行上面从节点接入集群的操作。

如果还是不行的话主节点也一起停止组复制,然后执行reset master删除已产生的Binlog。然后从第五步开始。