>最近灰度的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访问的话就会出现这个问题。

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