事情的起因源于近期测试环境调整,Redis的集群Server从阿里云迁移到机房,机房自建Redis使用的5.0.8版本的docker镜像建立的集群,切换到自建Redis之后,测试环境业务发生问题,获取的Redis数据值为null, 百思不得其解,很神奇,和运维同事探讨,无法定位原因,因为服务本身没有调整过,初步感觉是Redis集群的问题,但就是无法解释。将连接切换阿里云使用没有问题,切回自建Redis问题依旧,因为有的服务使用的是SpringBoot默认的Lettuce客户端,有的服务因为用到了分布式锁,使用的Redisson客户端,现象是用到了Redisson的客户端使用RedisTemplate就无法获取到数据,所以立刻写了Demo调试。在使用Lettuce的服务上写入Redis,读取Redis没有问题,使用Redisson的服务上读取redis对应Key的数据时显示为null. 最后协调运维,又重新组建了一个新的Redis集群,并控制台启动Redis服务并查看启动后的日志信息,果然发现了报错信息

redis6    | 1:S 06 Jul 2021 05:59:42.285 * Retrying with SYNC...
redis6    | 1:S 06 Jul 2021 05:59:42.285 # MASTER aborted replication with an error: NOAUTH Authentication required.
redis4    | 1:S 06 Jul 2021 05:59:42.315 * Connecting to MASTER 192.168.38.218:6733
redis4    | 1:S 06 Jul 2021 05:59:42.316 * MASTER <-> REPLICA sync started
redis4    | 1:S 06 Jul 2021 05:59:42.316 * Non blocking connect for SYNC fired the event.
redis4    | 1:S 06 Jul 2021 05:59:42.316 * Master replied to PING, replication can continue...
redis4    | 1:S 06 Jul 2021 05:59:42.316 * (Non critical) Master does not understand REPLCONF listening-port: -NOAUTH Authentication required.
redis4    | 1:S 06 Jul 2021 05:59:42.316 * (Non critical) Master does not understand REPLCONF capa: -NOAUTH Authentication required.
redis4    | 1:S 06 Jul 2021 05:59:42.316 * Partial resynchronization not possible (no cached master)
redis4    | 1:S 06 Jul 2021 05:59:42.317 # Unexpected reply to PSYNC from master: -NOAUTH Authentication required.

立刻搜索了相应的报错信息,之所以有这个报错,是因为如果在进行Redis主从配置的时候,出现这样的报错,一般原因是因为master节点设置了密码,而在从节点的配置中,没有配置masterauth参数导致的

当进行主从配置的时候,如果master节点开启了安全机制并设置了密码的话,就需要在从节点配置文件中配置masterauth参数,该参数就是master节点的密码(即master节点中requirepass参数的值),否则的话,master节点会拒绝同步请求。

而由于Redisson默认使用的从节点获取数据,所以可以定位,是由于主节点数据没有同步到从节点导致的获取不到相应的信息。所以使用Redisson的时候请注意,如果获取不到数据,要考虑主从数据同步的问题。

还有一点值得注意的是运维在shell里,通过get命令获取从节点数据的时候,的确每次都能显示location定位到了主节点上并获取到数据,这也是导致当时迷惑的地方,为何shell能获取到数据而客户端不行呢,那是因为授权从节点进入的时候每次都输入密码后再进行查看,也就是验证通过后完全可以获取到数据,而客户端从服务器直接获取,master没有同步从节点.

拓展阅读一些文章,引用一些知识了解一下 requirepass和masterauth的区别

requirepass和masterauth是不一样的,requirepass是配置在主节点的,masterauth是配置在从节点的,两边配置要一样从节点才能和主节点连接上进行主从复制。

redis启用密码认证一定要requirepass和masterauth同时设置。

如果主节点设置了requirepass登录验证,在主从切换,slave在和master做数据同步的时候首先需要发送一个ping的消息给主节点判断主节点是否存活,再监听主节点的端口是否联通,发送数据同步等都会用到master的登录密码,否则无法登录,log会出现响应的报错。也就是说slave的masterauth和master的requirepass是对应的,所以建议redis启用密码时将各个节点的masterauth和requirepass设置为相同的密码,降低运维成本。当然设置为不同也是可以的,注意slave节点masterauth和master节点requirepass的对应关系就行。

masterauth作用:主要是针对master对应的slave节点设置的,在slave节点数据同步的时候用到。
requirepass作用:对登录权限做限制,redis每个节点的requirepass可以是独立、不同的。

拓展阅读

https://blog.csdn.net/hou_ge/article/details/104639396

https://blog.csdn.net/damanchen/article/details/100584275

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐