sentinel服务器出现大量的连接问题【转载】

时间:2017-05-17 09:17:46   收藏:0   阅读:669

一、问题现象

二、问题排查过程

1、根据连接状态进行推断

2、检查业务系统的redis配置和程序逻辑

3、从网络寻找线索

4、重新思考产生连接的根源

public void run() {

      running.set(true);

      while (running.get()) {

        j = new Jedis(host, port);

        try {

          j.subscribe(new JedisPubSub() {

            @Override

            public void onMessage(String channel, String message) {

              log.fine("Sentinel " + host + ":" + port + " published: " + message + ".");

              String[] switchMasterMsg = message.split(" ");

              if (switchMasterMsg.length > 3) {

                if (masterName.equals(switchMasterMsg[0])) {

                  initPool(toHostAndPort(Arrays.asList(switchMasterMsg[3], switchMasterMsg[4])));

                } else {

                  log.fine("Ignoring message on +switch-master for master name "

                      + switchMasterMsg[0] + ", our master name is " + masterName);

                }

              } else {

                log.severe("Invalid message received on Sentinel " + host + ":" + port

                    + " on channel +switch-master: " + message);

              }

            }

          }, "+switch-master");

        } catch (JedisConnectionException e) {

          if (running.get()) {

            log.severe("Lost connection to Sentinel at " + host + ":" + port

                + ". Sleeping 5000ms and retrying.");

            try {

              Thread.sleep(subscribeRetryWaitTimeMillis);

            } catch (InterruptedException e1) {

              e1.printStackTrace();

            }

          } else {

            log.fine("Unsubscribing from Sentinel at " + host + ":" + port);

          }

        }

      }

    }

正常情况下 j.subscribe会产生阻塞,而出现异常时会重新创建连接并且打印日志“Lost connection to Sentinel at……”

一般在系统中设置时间间隔都会是个整数,2小时1115秒显得有点怪异,然后将时间换算成秒,看是否为一个常用的或有规律的整数,2小时=7200秒,突然想到操作系统的keepalive设置中有一个7200秒,查一下操作系统默认的设置,参数如下:

net.ipv4.tcp_keepalive_time = 7200   默认 tcp空闲时间

net.ipv4.tcp_keepalive_intvl =75        默认心跳检测时间间隔

net.ipv4.tcp_keepalive_probes = 9     默认检测次数

如果完成9次心跳,仍然发现连接无效的时间为:7200+9*75=2小时1115秒,由此,基本上可以判断,客户端的连接是被操作系统回收的,结合前面的分析,连接被回收时并未向服务端发送关闭的报文。

5、与运维进行沟通防火墙问题

6、持续观察测试环境的日志

7、初步结论

8、继续思考服务断连接不被释放的问题

以上因素使得防火墙每30分钟将该连接的会话信息清除,从而导致客户端操作系统检测到心跳失败,随后操作系统清除了客户端连接,使得客户端的连接数能正常释放,随后客户端的jedis收到异常后重新创建连接,而服务端的keepalive并未执行,以上过程不断循环,导致服务端established状态的连接不断增加并得不到释放。

原文:http://www.cnblogs.com/devilwind/p/6865750.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!