最近一次上线时,出现有的实例可构建成功,有的实例不能构建成功。当时比较紧急,采用了最直接的方式是切换到新的Redis实例。但是根本问题还是没有解决,在此记录分析一下。
问题发现:
通过jenkins构建日志,发现了这样一段错误日志
WARNING: Cannot get master address from sentinel running @ redis3.blackfi.sh:36379. Reason: redis.clients.jedis.exceptions.JedisDataException: ERR max number of clients reached. Trying next one.
问题分析:
其实通过日志可知,Redis服务端的连接已经达到了最大的连接数,客户端无法建立连接。通过运维查看,确实该Redis集群已存在大量的连接,不能建立新的连接。连接数量大,一个是因为线上的应用比较多,这个就没有办法了,只能从Redis硬件方面增添升级。二是因为看不到服务器端的情况,猜测有可能应用在终止时,连接没有释放,导致服务器端存在无效连接。这部分可以在代码层面和配置可以改善和配置。
问题解决方案:
-
RedisServer配置
# Close the connection after a client is idle for N seconds (0 to disable) timeout 0
配置含义:RedisServer会自动关闭超过N seconds时间的idel的连接,如果配置0那就是用不关闭。所以可以检查此配置是否是0。如果是0,请修改。
-
代码
为保证redis连接池在关闭项目时候,收回连接池连接,配置destroy-method方法。
<bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="testWhileIdle" value="true"/> </bean> <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="destroy"> <constructor-arg ref="jedisConfig" /> <constructor-arg value="localhost" /> <constructor-arg type="int" value="6379" /> </bean>
网友评论