美文网首页
Redis线上问题:连接太多导致,应用启动失败

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

作者: 鱼da王 | 来源:发表于2019-01-24 17:29 被阅读0次

    最近一次上线时,出现有的实例可构建成功,有的实例不能构建成功。当时比较紧急,采用了最直接的方式是切换到新的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>
      

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/uhjujqtx.html