
MGR新节点RECOVERING状态的分析与解决:caching_sha2_password验证插件的影响
起因
在GreatSQL社区上有一位用户提出了“手工构建MGR碰到的次节点一直处于recovering状态”,经过排查后,发现了是因为新密码验证插件caching_sha2_password
导致的从节点一直无法连接主节点,帖子地址:➥https://greatsql.cn/thread-420-2-1.html
复现
环境介绍
本文验证环境,以及本文所采用数据库为GreatSQL 8.0.32-24
部署准备:
采用的是单机多实例的部署方式,如何部署单机多实例可以前往➥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有关配置参数:
MGR01节点配置如下:
MGR02节点配置如下:
启动MGR01实例、MGR02实例,并修改密码
检查两个实例是否正确加载group_replicaiton
插件
没有加载的话可以手动加载这个plugin
搭建MGR
接下来就可以手工搭建MGR,流程如下可参考安装部署MGR集群 | 深入浅出MGR
➥https://gitee.com/GreatSQL/GreatSQL-Doc/blob/master/deep-dive-mgr/deep-dive-mgr-03.md
MGR01实例操作:
接下来即可启动MGR集群:
MGR02实例操作:
此时创建的用户采用的都是caching_sha2_password
身份认证插件
虽然启动MGR成功,但是查看下节点状态:
此时节点一直处于RECOVERING
状态,查看mgr02实例的错误日志如下:
这是由于caching_sha2_password
是 MySQL 8.0.4 引入的一个新的身份验证插件,caching_sha2_password
对密码安全性要求更高,要求用户认证过程中在网络传输的密码是加密的,所以导致的这个问题的出现,caching_sha2_password
的介绍可以看社区文章“浅谈 MySQL 新的身份验证插件 caching_sha2_password”
解决方式
1、采用旧密码验证插件
旧的身份验证插件mysql_native_password
,mysql_native_password
的特点是不需要加密的连接。该插件验证速度特别快,但是不够安全,只需要更改创建用户的语句
旧密码验证插件容易被破解,如果有 GreatSQL 服务要公网上使用,建议还是尽量使用 caching_sha2_password
作为认证插件
2、启用group_replication_recovery_get_public_key
设置 group_replication_recovery_get_public_key=ON
可以确保从节点在连接到主节点时能够获取所需的公钥,从而允许安全连接并成功进行身份验证,避免了连接错误和身份验证问题。
手册中也有明确说明:
可以看到,当确认环境安全以及没人任何人攻击集群时,如果不配置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
: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
进入MGR01实例配置
启动MGR01实例的MGR集群
启动成功后,需要把MGR01节点的RSA公钥
拷贝到MGR02节点上,因为MGR02也会生成此公钥,所以最好创建一个文件夹
当然,如果有多个节点,也需要把主节点的RSA公钥移动到各个节点上
MGR02节点操作
可以看到双节点ONLINE
,新加入的节点不会一直是RECOVERING
状态
总结
新身份验证插件caching_sha2_password
安全度相比其他的身份验证插件,既解决安全性问题又解决性能问题,建议使用新密码验证插件。
也感谢社区用户指出GreatSQL社区文档中的不足,并给予用户金币奖励,同时欢迎大家来GreatSQL社区捉虫~
Enjoy GreatSQL :)
文章转载自公众号:GreatSQL社区
