MGR新节点RECOVERING状态的分析与解决:caching_sha2_password验证插件的影响

这篇具有很好参考价值的文章主要介绍了MGR新节点RECOVERING状态的分析与解决:caching_sha2_password验证插件的影响。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

起因

在GreatSQL社区上有一位用户提出了“手工构建MGR碰到的次节点一直处于recovering状态”,经过排查后,发现了是因为新密码验证插件caching_sha2_password导致的从节点一直无法连接主节点,帖子地址:(https://greatsql.cn/thread-420-2-1.html))

复现

环境介绍

本文验证环境,以及本文所采用数据库为GreatSQL 8.0.32-24

$ cat /etc/system-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)
$ uname -a
Linux gip 3.10.0-1160.el7.x86_64 #1 SMP Tue Aug 18 14:50:17 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux

部署准备:

采用的是单机多实例的部署方式,如何部署单机多实例可以前往(https://gitee.com/GreatSQL/GreatSQL-Manual/blob/master/6-oper-guide/6-6-multi-instances.md)

IP 端口 角色
172.17.139.77 3306 mgr01
172.17.139.77 3307 mgr02

MGR有关配置参数:

#mgr settings
loose-plugin_load_add = 'mysql_clone.so'
loose-plugin_load_add = 'group_replication.so'
loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1"
loose-group_replication_group_seeds = '172.17.139.77:33061,172.17.139.77:33071'
loose-group_replication_start_on_boot = ON
loose-group_replication_bootstrap_group = OFF
loose-group_replication_exit_state_action = READ_ONLY
loose-group_replication_flow_control_mode = "DISABLED"
loose-group_replication_single_primary_mode = ON
loose-group_replication_communication_max_message_size = 10M
loose-group_replication_transaction_size_limit = 3G
loose-group_replication_arbitrator = 0
loose-group_replication_single_primary_fast_mode = 0
loose-group_replication_request_time_threshold = 20000
report_host = "172.17.139.77"

MGR01节点配置如下:

[mysqld@mgr01]
datadir=/data/GreatSQL/mgr01
socket=/data/GreatSQL/mgr01/mysql.sock
port=3306
server_id=103306
log-error=/data/GreatSQL/mgr01/error.log
loose-group_replication_local_address= "172.17.139.77:33061"

MGR02节点配置如下:

[mysqld@mgr02]
datadir=/data/GreatSQL/mgr02
socket=/data/GreatSQL/mgr02/mysql.sock
port=3307
server_id=103317
log-error=/data/GreatSQL/mgr02/error.log
loose-group_replication_local_address= "172.17.139.77:33071"

启动MGR01实例、MGR02实例,并修改密码

#启动两个实例
$ systemctl restart greatsql@mgr01 &
$ systemctl restart greatsql@mgr02 &
#获取初始化密码
$ grep root /data/GreatSQL/mgr01/error.log
$ grep root /data/GreatSQL/mgr02/error.log
#登录数据库并修改密码
$ mysql -S /data/GreatSQL/mgr01/mysql.sock -uroot -p
greatsql> alter user root@'localhost' identified by 'GreatSQL@666';
$ mysql -S /data/GreatSQL/mgr02/mysql.sock -uroot -p
greatsql> alter user root@'localhost' identified by 'GreatSQL@666';

检查两个实例是否正确加载group_replicaiton 插件

greatsql> show plugins;
+----------------------------------+----------+--------------------+----------------------+---------+
| Name                             | Status   | Type               | Library              | License |
+----------------------------------+----------+--------------------+----------------------+---------+
| group_replication                | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------------+----------+--------------------+----------------------+---------+

没有加载的话可以手动加载这个plugin

greatsql> install plugin group_replication soname 'group_replication.so';

搭建MGR

接下来就可以手工搭建MGR,流程如下可参考安装部署MGR集群 | 深入浅出MGR(https://gitee.com/GreatSQL/GreatSQL-Doc/blob/master/deep-dive-mgr/deep-dive-mgr-03.md))

MGR01实例操作:

greatsql> set session sql_log_bin=0;
# 特别注意下面因为8.0.4版本开始使用的默认是“caching_sha2_password”,所以这样创建会采用最新的身份认证插件
greatsql> create user repl@'%' identified by 'GreatSQL@666';
greatsql> GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO `repl`@`%`;
greatsql> set session sql_log_bin=1;
greatsql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='GreatSQL@666' FOR CHANNEL 'group_replication_recovery';

接下来即可启动MGR集群:

greatsql> set global group_replication_bootstrap_group=ON;

greatsql> start group_replication;

greatsql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: 2920447e-35bf-11ee-89a5-00163e566da1
               MEMBER_HOST: 172.17.139.77
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: PRIMARY
            MEMBER_VERSION: 8.0.32
MEMBER_COMMUNICATION_STACK: XCom

MGR02实例操作:

greatsql> set session sql_log_bin=0;
greatsql> create user repl@'%' identified by 'GreatSQL@666';
greatsql> GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO `repl`@`%`;
greatsql> set session sql_log_bin=1;
greatsql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='GreatSQL@666' FOR CHANNEL 'group_replication_recovery';
greatsql> start group_replication;
Query OK, 0 rows affected (5.39 sec)

此时创建的用户采用的都是caching_sha2_password身份认证插件

greatsql> SELECT USER,PLUGIN FROM mysql.`user` ;
+------------------+-----------------------+
| USER             | PLUGIN                |
+------------------+-----------------------+
| repl             | caching_sha2_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | caching_sha2_password |
+------------------+-----------------------+

虽然启动MGR成功,但是查看下节点状态:

greatsql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: 2920447e-35bf-11ee-89a5-00163e566da1
               MEMBER_HOST: 172.17.139.77
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: PRIMARY
            MEMBER_VERSION: 8.0.32
MEMBER_COMMUNICATION_STACK: XCom
*************************** 2. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: 2a4f068b-35bf-11ee-9504-00163e566da1
               MEMBER_HOST: 172.17.139.77
               MEMBER_PORT: 3307
              MEMBER_STATE: RECOVERING
               MEMBER_ROLE: SECONDARY
            MEMBER_VERSION: 8.0.32
MEMBER_COMMUNICATION_STACK: XCom
2 rows in set (0.00 sec)

此时节点一直处于RECOVERING状态,查看mgr02实例的错误日志如下:

2023-08-08T08:00:47.034870Z 42 [ERROR] [MY-010584] [Repl] Slave I/O for channel 'group_replication_recovery': error connecting to master 'repl@172.17.139.77:3306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061
2023-08-08T08:00:47.037631Z 35 [ERROR] [MY-011582] [Repl] Plugin group_replication reported: 'There was an error when connecting to the donor server. Please check that group_replication_recovery channel credentials and all MEMBER_HOST column values of performance_schema.replication_group_members table are correct and DNS resolvable.'
2023-08-08T08:00:47.037671Z 35 [ERROR] [MY-011583] [Repl] Plugin group_replication reported: 'For details please check performance_schema.replication_connection_status table and error log messages of Slave I/O for channel group_replication_recovery.'

这是由于caching_sha2_password 是 MySQL 8.0.4 引入的一个新的身份验证插件,caching_sha2_password 对密码安全性要求更高,要求用户认证过程中在网络传输的密码是加密的,所以导致的这个问题的出现,caching_sha2_password的介绍可以看社区文章“浅谈 MySQL 新的身份验证插件 caching_sha2_password【微信导入、微信导入】”

解决方式

1、采用旧密码验证插件

旧的身份验证插件mysql_native_passwordmysql_native_password的特点是不需要加密的连接。该插件验证速度特别快,但是不够安全,只需要更改创建用户的语句

create user repl@'%' identified with mysql_native_password by 'GreatSQL@666';

旧密码验证插件容易被破解,如果有 GreatSQL 服务要公网上使用,建议还是尽量使用 caching_sha2_password作为认证插件

2、启用group_replication_recovery_get_public_key

设置 group_replication_recovery_get_public_key=ON 可以确保从节点在连接到主节点时能够获取所需的公钥,从而允许安全连接并成功进行身份验证,避免了连接错误和身份验证问题。

手册中也有明确说明:

18.6.3.1.1 Replication User With The Caching SHA-2 Authentication Plugin
By default, users created in MySQL 8 use Section 6.4.1.2, “Caching SHA-2 Pluggable Authentication”. If the replication user you configure for distributed recovery uses the caching SHA-2 authentication plugin, and you are not using SSL for distributed recovery connections, RSA key-pairs are used for password exchange. For more information on RSA key-pairs, see Section 6.3.3, “Creating SSL and RSA Certificates and Keys”.

In this situation, you can either copy the public key of the to the joining member, or configure the donors to provide the public key when requested. The more secure approach is to copy the public key of the replication user account to the joining member. Then you need to configure the group_replication_recovery_public_key_path system variable on the joining member with the path to the public key for the replication user account. rpl_user

The less secure approach is to set group_replication_recovery_get_public_key=ON on donors so that they provide the public key of the replication user account to joining members. There is no way to verify the identity of a server, therefore only set group_replication_recovery_get_public_key=ON when you are sure there is no risk of server identity being compromised, for example by a man-in-the-middle attack.

可以看到,当确认环境安全以及没人任何人攻击集群时,如果不配置ssl,可以最低配置group_replication_recovery_get_public_key=ON来在请求复制用户密钥时给公钥

3、为组复制通道启用SSL支持

以下操作方法仅使用于 GreatSQL/MySQL 8.0.27版本及以上

更安全的方法是将repl用户所需的公钥文件复制到joiner节点的Server所在主机中。然后,在joiner节点的Server中配置group_replication_recovery_public_key_path系统变量,指定rpl_user用户所需的公钥文件路径。

使用caching_sha2_password 插件身份验证会在数据目录下生成如下两个RSA文件:

private_key.pem
public_key.pem
  • private_key.pem:RSA私钥
  • public_key.pem: RSA公钥

对于 MGR ,如果设置 group_replication_ssl_mode=DISABLED 必须使用下面的变量来指定 RSA 公钥,否则报错:

  • group_replication_recovery_get_public_key :向服务端请求 RSA 公钥;
  • group_replication_recovery_public_key_path :指定本地 RSA 公钥文件;

指定本地RSA公钥,首先需要全局MGR配置开启SSL

[mysqld]
#开启use_ssl,指定组成员之间的组复制分布式恢复连接是否应使用 SSL
loose-group_replication_recovery_use_ssl=ON

进入MGR01实例配置

greatsql> set session sql_log_bin=0;
# 此时就可以使用“caching_sha2_password”身份认证插件
greatsql> create user repl@'%' identified by 'GreatSQL@666';
greatsql> GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO `repl`@`%`;
greatsql> set session sql_log_bin=1;
greatsql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='GreatSQL@666' FOR CHANNEL 'group_replication_recovery';

启动MGR01实例的MGR集群

greatsql> set global group_replication_bootstrap_group=ON;
greatsql> start group_replication;
greatsql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: 35b653d2-3658-11ee-93c9-00163e566da1
               MEMBER_HOST: 172.17.139.77
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: PRIMARY
            MEMBER_VERSION: 8.0.32
MEMBER_COMMUNICATION_STACK: XCom

启动成功后,需要把MGR01节点的RSA公钥拷贝到MGR02节点上,因为MGR02也会生成此公钥,所以最好创建一个文件夹

$ mkdir mgr01_key
$ chown mysql:mysql mgr01_key/
# 将public_key.pem移动到MGR02
$ mv /data/GreatSQL/mgr01/public_key.pem /data/GreatSQL/mgr02/mgr01_key/

当然,如果有多个节点,也需要把主节点的RSA公钥移动到各个节点上

MGR02节点操作

greatsql> set session sql_log_bin=0;
greatsql> create user repl@'%' identified by 'GreatSQL@666';
greatsql> GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO `repl`@`%`;
greatsql> set session sql_log_bin=1;
greatsql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='GreatSQL@666' FOR CHANNEL 'group_replication_recovery';

# 此命令设置完成后,最好写进my.cnf文件中持久化
greatsql> set global group_replication_recovery_public_key_path = "/data/GreatSQL/mgr02/mgr01key/public_key.pem";

greatsql> start group_replication;
greatsql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: 35b653d2-3658-11ee-93c9-00163e566da1
               MEMBER_HOST: 172.17.139.77
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: PRIMARY
            MEMBER_VERSION: 8.0.32
MEMBER_COMMUNICATION_STACK: XCom
*************************** 2. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: aa031fb9-365a-11ee-9925-00163e566da1
               MEMBER_HOST: 172.17.139.77
               MEMBER_PORT: 3307
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: SECONDARY
            MEMBER_VERSION: 8.0.32
MEMBER_COMMUNICATION_STACK: XCom

可以看到双节点ONLINE,新加入的节点不会一直是RECOVERING状态

总结

新身份验证插件caching_sha2_password安全度相比其他的身份验证插件,既解决安全性问题又解决性能问题,建议使用新密码验证插件。

也感谢社区用户指出GreatSQL社区文档中的不足,并给予用户金币奖励,同时欢迎大家来GreatSQL社区捉虫~


Enjoy GreatSQL 😃

关于 GreatSQL

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

MGR新节点RECOVERING状态的分析与解决:caching_sha2_password验证插件的影响

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群

MGR新节点RECOVERING状态的分析与解决:caching_sha2_password验证插件的影响文章来源地址https://www.toymoban.com/news/detail-707993.html

到了这里,关于MGR新节点RECOVERING状态的分析与解决:caching_sha2_password验证插件的影响的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法sql连接乱码

    今天在阿里云租了一个服务器,当我用sqlyog远程连接mysql时,报了plugin caching_sha2_password could not be loaded错,即无法加载插件缓存sha2密码,但是我在cmd窗口就可以访问,在网上找了很多解决方法都没有解决,最后找到了原因。在MySQL 8.0中,caching_sha2_password是默认的身份验证插件

    2024年02月07日
    浏览(27)
  • workbench 链接mysql 报错 authentication plugin caching_sha2_password

    用workbench连接MySQL出现Authentication plugin ‘caching_sha2_password’ cannot be loaded的问题,如下图 原因 出现这个问题的原因是由于Navicat和MySQL的版本问题, mysql8 之前,加密规则是mysql_native_password; mysql8 之后,加密规则是caching_sha2_password。 解决方法一种是升级Navicat驱动,一种是My

    2024年02月11日
    浏览(34)
  • 2059-Authentication plugin‘caching_sha2_password‘cannot be loaded

    2059-Authentication plugin’caching_sha2_password’cannot be loaded 由于目前已有的客户端连接软件还不支持Mysql8新增加的加密方式:caching_sha2_password 老的加密验证方式:mysql_native_password 1、打开MySQL 8.0 Command Line Client,控制面板搜索即可搜到,打开即可 2、输入密码 3、输入以下命令 其实

    2024年02月05日
    浏览(28)
  • MySQL 连接出现 Authentication plugin ‘caching_sha2_password‘ cannot be loaded

    在使用Navicat Premium 12连接MySQL数据库时会出现Authentication plugin \\\'caching_sha2_password\\\' cannot be loaded  出错 出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法:把mysql用户登录密码加密规则还原成mysql_native_password

    2024年02月09日
    浏览(26)
  • Navicat连接mysql8.0:提示无法加载身份验证插件“caching_sha2_password”

    Navicat连接mysql时,提示:Unable to load authentication plugin ‘caching_sha2_password‘. 原因:mysql 8.0 默认使用 caching_sha2_password 身份验证机制。 更改过程: MYSQL8.0开启远程链接

    2024年02月09日
    浏览(30)
  • Sqlyog 无法连接 8 版本的mysql caching_sha2_password could not be loaded

    近期系统对Mysql 版本进行了升级,由原来的 5.7升至 8版本,在现场使用Sqlyog 作为数据库连接软件时,发现连接失败。 使用Sqlyog配置完连接信息后点击连接,报错: MySQL 8.0中修改了默认的密码加密方式,使用了caching_sha2_password加密方式,对于Sqlyog老版本不支持该方式,从13.

    2024年02月06日
    浏览(31)
  • MySQL Shell如何接管手动搭建(含仲裁节点)MGR集群

    本文源自GreatSQL社区用户的一次提问: Q:一个包含仲裁节点( ARBITRATOR )的GreatSQL MGR集群,一开始是用手动方式构建,后来想用MySQL Shell接管,可以吗? A:是可以的,不过也有一定局限性 具体的操作如下 可以看到三个节点都是 ONLINE 状态 连接 Primary 节点,查看下原来的账户

    2024年02月05日
    浏览(36)
  • 解决C#报“MSB3088 未能读取状态文件*.csprojAssemblyReference.cache“问题

        今天在使用vscode软件+C#插件,编译.cs文件时,发现如下warning: 图(1) C#报cache没有更新     出现该warning的原因: 当前.cs文件修改了,但是其缓存文件*.csprojAssemblyReference.cache没有更新,需要重新清理一下工程,再编译、运行即可。     命令如下:     或者手动在vs里

    2024年02月11日
    浏览(31)
  • error 2059: Authentication plugin ‘caching_sha2_password‘ cannot be loaded: /usr/lib64/mysql/plugin/

    Mysql学习中,尝试远程登录报(2059)错误:(从虚拟机登录到本地的mysql8.0.26版本) 想要实现mysql的远程登录 我的尝试,从虚拟机登录到本地mysql 方法一: 修改密码的加密方式,对后续的新建用户有效(在添加下述语句后,后续的新用户加密方式默认被改为了mysql_native_password)

    2024年02月09日
    浏览(26)
  • 使用pymysql报错RuntimeError ‘cryptography‘ package is required for sha256_password or caching_sha2_passw

    使用pymysql连接MySql数据库报错RuntimeError: 该错误提示的意思是:sha256_password和caching_sha2_password两种加密方式需要cryptography。 所以只需要安装一下cryptography包就可以了: 安装完成后,重新执行, 就ok了。

    2024年02月08日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包