Redis线上问题:连接太多导致,应用启动失败

2019-01-24  本文已影响0人  鱼da王

最近一次上线时,出现有的实例可构建成功,有的实例不能构建成功。当时比较紧急,采用了最直接的方式是切换到新的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硬件方面增添升级。二是因为看不到服务器端的情况,猜测有可能应用在终止时,连接没有释放,导致服务器端存在无效连接。这部分可以在代码层面和配置可以改善和配置。

问题解决方案:

  1. RedisServer配置

    # Close the connection after a client is idle for N seconds (0 to disable) timeout 0
    

    配置含义:RedisServer会自动关闭超过N seconds时间的idel的连接,如果配置0那就是用不关闭。所以可以检查此配置是否是0。如果是0,请修改。

  2. 代码

    为保证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>
    
上一篇 下一篇

猜你喜欢

热点阅读