Redis 可以连接但无法进行读写问题,“Could not get a resource from the pool“报错

最近灰度的B组遇到一些问题,可以连上 Redis 却无法进行读写,代码报“Could not get a resource from the pool” 的错,上网查了好多方法都没用,最后才发现是网络的问题。特此记录一下排查问题的过程。

因为弄了两组Redis,A组连A组的 Redis,B组连B组的 Redis,现在发现进行读写时一直报错,报错为“Could not get a resource from the pool

尝试换了A组之后,发现没问题,系统运行正常。

然后又怀疑是网络不通,ping、telnet 试过之后发现网络是通的。
懵逼了,咨询运维人员后说两组 Redis 的配置是一样的,我又让他们检查了一下。

上网查了下,说是可能开了防火墙,运维说内网未开防火墙。

还有说是 Redis 开启了保护模式,检查了下发现也没有开启。

然后运维在 Redis 主机上连接后是可以读写的,我们程序就无法读写,然后我开始查看我们的相关代码,顺便看了下源码。
没看出问题,因为如果有问题的话,A组又是好的,这个怎么解释呢,感觉就是两组 Redis 肯定有什么配置是不一样的,导致了这个问题。

继续排查。。。。

开始分析代码。。。

单机版和集群版的连接配置

连接池配置

连接池看着应该也没什么问题,然后我心想在本地把项目运行起来看看,把 Redis 配置改为连B组的,debug 看看能不能是什么问题,为啥不能读写。

一切很顺利,项目顺利启动了,Redis 应该是连上了,试了下我本地网络是通的。

正当我调个接口想试试的时候,刷出了一堆报错,感觉是找到原因了!
看报错:

发现这些显示的 Redis 的节点是 192.168 网段的。而这几台主机应该是 172.22 网段,这 192.168 网段当然连不上啊,试了下用 192.168 网段去连接,果然。。。连不上。。。。。网络不通

那这又是咋回事?!
我们配置的时候是主机名,难道是代码解析为 192.168 网段了,开始怀疑这个。

然后我又试了试,把连接的配置改为 IP,172.22 网段的,发现还是一样的报错,还是 192.168 。

运维说应该不是网络解析,然后我又开始分析代码,点开源码,debug看看哪里获取的这些 IP。

终于,

这是获取 Redis 集群的节点的啊,不是我们代码进行解析的,终于找到问题了。

然后让运维在 Redis 主机登录后 执行 cluster nodes 命令,果然,Redis 节点的信息就是 192.168 网段的。。。。

排查了半天终于找到了问题的原因,连接的时候是通过 172.22 网段进行连接,但是读写的时候,组件先获取 Redis 的节点,然后进行读写,用的是不同网段,所以就造成了可以连接却无法读写的问题。

然后我去查看A组,发现不管是用主机名、172.22,还是 192.168,网络都是通的,这就难怪了。
有点奇怪为什么 Redis 集群节点的 IP 是不同网段的,后面得查一下。

解决办法:
1、更换 Redis 节点的 IP,好像比较麻烦。
2、打通 192.168 网段的网络,运维找网络组解决了。

系统恢复正常,完结,撒花。

改天再写一个关于 Redis 集群的,好好学习一下~

2020-07-07更
发现 192.168 网段是内网IP,我们日常使用的 172.22 是浮动IP,Redis 集群使用的应该是内网的IP,所以当内网网络不通时,无法通过内网IP访问的话就会出现这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值