`
woodding2008
  • 浏览: 286024 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Redis Cluster Slots风暴

 
阅读更多

 

       近期Redis集群服务出现不稳定的情况,请求的总体RT波动性很大,出现请求失败的情况。

 

表现症状

  • p99的请求RT耗时问题时段大幅变长
  • 个别Redis实例的total_net_output_bytes飚高【100+Mbytes】
  • 个别Redis实例的cmdstats_cluster命令执行的次数飙高
  • 个别Redis实例CPU使用率飚高

 

total_net_output_bytes飚高

 

 

Cluster命令次数飙高

 

事故现场

      首先要搞明白到底谁在发送cluster指令,tcpflow官方版本抓包数据不带时间戳,这点非常不爽,问题很难被追溯,很庆幸在github上找到一个支持时间戳的tcpflow,https://github.com/mukhin/tcpflow。

 

 

 

tcpflow -cp -x -i eth0 -cp dst port 12884 |grep --line-buffered -i -C2 'cluster' > tcpflow.12884.2016-10-07-11.log 2>&1

 

抓包数据

2016-10-08 17:08:50 010.192.192.186.64292-010.192.192.192.12884: *2
2016-10-08 17:08:50 $7
2016-10-08 17:08:50 CLUSTER
2016-10-08 17:08:50 $5
2016-10-08 17:08:50 slots

 

发送的来源

99 010.192.192.090
87 010.192.192.181
78 010.192.192.108
68 010.192.192.121
65 010.192.192.024
64 010.192.192.063
62 010.192.192.089
61 010.192.192.124
60 010.192.192.192
57 010.192.192.164
56 010.192.192.064
52 010.192.192.161
50 010.192.192.127
48 010.192.192.123
46 010.192.192.118
45 010.192.192.065
43 010.192.192.122
42 010.192.192.125
39 010.192.192.120
39 010.192.192.192
36 010.192.192.119
35 010.192.192.126
33 010.192.192.109
17 010.192.192.163
15 010.192.192.162
1 010.192.192.066

 

 

发送的频率

266 17:08:51
204 17:08:53
193 17:08:52
120 17:08:54
98 17:08:50
93 17:08:56
92 17:08:55
82 17:08:59
80 17:08:57
70 17:08:58

 

     根据ip很容易判断出这些命令是Jedis客户端发送,1秒执行了266次,行成了cluster slots风暴,由于频繁执行cluster slots,而且输出的内容体积很大,这就可以解释Redis实例输出内容变多的原因。

 

 

分析jedis客户端

    目前使用的是jedis比较老的一个版本2.7.0,jedis运行过程中当出现网络波动会导致请求随机节点,然后随机节点会返回Moved指令,这时会导致大量客户端更新slot【JedisClusterConnectionHandler.renewSlotCache()】的请求,由于选择Redis Server时没有做Shuffled会导致所有的cluster slots请求发给同一个Redis Server,Cluster slots会让这个Redis会出现严重的热点问题,进而影响到集群的吞吐以及稳定。

 

private T runWithRetries(String key, int redirections, boolean tryRandomNode, boolean asking) {
    if (redirections <= 0) {
      throw new JedisClusterMaxRedirectionsException("Too many Cluster redirections?");
    }

    Jedis connection = null;
    try {

      if (asking) {
        // TODO: Pipeline asking with the original command to make it
        // faster....
        connection = askConnection.get();
        connection.asking();

        // if asking success, reset asking flag
        asking = false;
      } else {
        if (tryRandomNode) {
          connection = connectionHandler.getConnection();
        } else {
          connection = connectionHandler.getConnectionFromSlot(JedisClusterCRC16.getSlot(key));
        }
      }

      return execute(connection);
    } catch (JedisConnectionException jce) {
      if (tryRandomNode) {
        // maybe all connection is down
        throw jce;
      }

      releaseConnection(connection, true);
      connection = null;

      // retry with random connection
      return runWithRetries(key, redirections - 1, true, asking);
    } catch (JedisRedirectionException jre) {
      if (jre instanceof JedisAskDataException) {
        asking = true;
        askConnection.set(this.connectionHandler.getConnectionFromNode(jre.getTargetNode()));
      } else if (jre instanceof JedisMovedDataException) {
        // it rebuilds cluster's slot cache
        // recommended by Redis cluster specification
        this.connectionHandler.renewSlotCache();
      } else {
        throw new JedisClusterException(jre);
      }

      releaseConnection(connection, false);
      connection = null;

      return runWithRetries(key, redirections - 1, false, asking);
    } finally {
      releaseConnection(connection, false);
    }

  }
    

 

 

  public void renewSlotCache() {
    for (JedisPool jp : cache.getNodes().values()) {
      Jedis jedis = null;
      try {
        jedis = jp.getResource();
        cache.discoverClusterSlots(jedis);
        break;
      } finally {
        if (jedis != null) {
          jedis.close();
        }
      }
    }
  }
 

 

 

处理方案

Jedis 2.8.0版本renewSlotCache时增加了Shuffled,使得cluster slots请求尽可能打散至更多Redis Server上。

https://github.com/xetorthio/jedis/pull/1090

 

 

 

  • 大小: 64.8 KB
  • 大小: 65.2 KB
  • 大小: 294.8 KB
分享到:
评论

相关推荐

    Redis高可用集群Redis Cluster搭建

    Redis高可用集群Redis Cluster搭建

    codis/redis 迁移redis cluster工具

    支持codis迁移数据到redis 支持codis迁移数据到redis cluster 支持redis迁移数据到redis 支持redis迁移数据到codis 支持增量同步数据

    RedisCluster集群(Spring访问Redis)

    RedisCluster集群(Spring访问Redis),初学者实例源码

    Redis Cluster的实现机制和原理

    Redis Cluster主要特性和设计,Redis Cluster主要特性和设计

    Redis cluster最佳实践

    我在做redis cluster的时候发现,两节点的cluster在处理断网或单节点故障时,会出现脑裂情况,为此,我做了实验去测试redis cluster配置的最佳方式,本文包含了测试的全过程。

    redisCluster集群demo

    redisCluster集群demo,java语言用于获取Redis集群的数据连接池并获取数据。

    RedisCluster.zip

    RedisCluster 集群搭建文件RedisCluster 集群搭建文件RedisCluster 集群搭建文件

    redis cluster spring整合代码

    个人测试redis cluster spring整合代码 的demo

    redis cluster配置文件

    redis cluster配置文件,配置后的参考; 创建目录: mkdir -p /etc/redis-cluster mkdir -p /var/log/redis mkdir -p /var/redis/7001 mkdir -p /var/redis/7002 拷贝配置文件: cp /usr/local/redis-3.2.8/redis....

    Windows下安装部署redis cluster

    Windows下安装部署redis cluster,亲测好使,包含 安装环境,redis-3.2.1.gem,redis cluster集群实例

    redisCluster.zip

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/...

    rediscluster.rar

    集群版redis,使用MySQL数据库,里面有批处理的SQL,性能十分卓越,单机版经供参考,抛转引玉,doc中包含数据库文件

    rediscluster配置文件.zip

    6389为6379的从节点,6390为6380的从节点,6391为6381的从节点。三主三从,下载完了修改bind dir masterauth cluster

    Redis官方Cluster搭建配置步骤详解

    Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。 Redis集群并 不支持处理多个keys... 本文,是我自己写的Redis Cluster集群搭建和配置详细步骤,包含了常用的Redis配置文件,和节点的管理等,以供大家参考.

    基于Spring支持的redis线程池,(redis Cluster,主从Redis,sentenl)

    redis命令实践,基于Spring支持的redis线程池,(redis Cluster,主从Redis,sentenl)。适用人群:计算机,软件工程、人工智能,网络安全,电子信息等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料...

    Redis Cluster部署文档.docx

    redis3.0版本cluster安装部署配置和管理,样例演示, 集群操作常用命令 CLUSTER INFO 打印集群的信息 CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。

    redis-trib.rb是官方提供的Redis Cluster的管理工具

    redis-trib.rb是官方提供的Redis Cluster的管理工具,无需额外下载,默认位于源码包的src目录下,但因该工具是用ruby开发的,所以需要准备相关的依赖环境。

    Tomcat 8+ redis cluster session

    在不改变工程代码的情况下,使tomcat多个节点利用redis cluster进行session共享.

    Redis Cluster集群部署搭建详解附件

    Redis Cluster集群部署搭建详解附件,转自linux公社,里面有redis搭建集群的例子。供大家参考

    Redis集群管理工具redis-cluster-tool.zip

    used 195 M 25% master[127.0.0.1:34502] used 195 M 25% master[127.0.0.1:34503] used 195 M 25% cluster used 780 MRebalance the cluster slots: $redis-cluster-tool -a 127.0.0.1:34501 -C cluster_...

Global site tag (gtag.js) - Google Analytics