资讯专栏INFORMATION COLUMN

Redis-jedis客户端报Too many Cluster redirections异常

imtianx / 2050人阅读

摘要:客户端报异常很困扰不知道是什么问题请看以下文章,为你一一解答。解决方案暂没发现比较好的解决方案。环境场景问题现象请求间歇性穿透缓存。与该错误关系不大。

jedis客户端报Too many Cluster redirections异常?很困扰?不知道是什么问题?请看以下文章,为你一一解答。

1.解决方案

暂没发现比较好的解决方案。

2.环境

Redis 3.x Cluster

Jedis 2.8

Jdk1.8

3.场景 4.问题现象

请求间歇性穿透缓存。

错误信息
redis.clients.jedis.exceptions.JedisClusterMaxRedirectionsException: Too many Cluster redirections?
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:34)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:85)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:68)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:85)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:68)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:85)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:68)
    at redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:29)
    at redis.clients.jedis.JedisCluster.set(JedisCluster.java:75)
5.问题原因

通过分析以下代码得知错误原因:

private T runWithRetries(byte[] 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;
      }

      // release current connection before recursion
      releaseConnection(connection);
      connection = null;

      // retry with random connection
      return runWithRetries(key, redirections - 1, true, asking);
    } catch (JedisRedirectionException jre) {
      // if MOVED redirection occurred,
      if (jre instanceof JedisMovedDataException) {
        // it rebuilds cluster"s slot cache
        // recommended by Redis cluster specification
        this.connectionHandler.renewSlotCache(connection);
      }

      // release current connection before recursion or renewing
      releaseConnection(connection);
      connection = null;

      if (jre instanceof JedisAskDataException) {
        asking = true;
        askConnection.set(this.connectionHandler.getConnectionFromNode(jre.getTargetNode()));
      } else if (jre instanceof JedisMovedDataException) {
      } else {
        throw new JedisClusterException(jre);
      }

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

当发生JedisConnectionException或者JedisRedirectionException时,会重新调用当前方法。

JedisConnectionException

与该错误关系不大。

因为该错误是:连接Redis错误,如果连接第一个节点失败,尝试第二个节点也失败,会直接推断成全部节点down掉抛出错误,中断处理。

JedisRedirectionException

和该错误关系很大。

对该错误处理时,并处理了以下两个异常:
JedisMovedDataException:节点重置/迁移后,会抛出该异常
JedisAskDataException: 数据迁移,发生asking问题, 获取asking的Jedis

从此推断,发生该问题的原因为:

节点主从切换/迁移后,客户端与redis的slot不一致导致一直重试

asking 一直失败,当槽点数值分布在两个节点上时,容易引起该错误

因此,导致该错误的原因可为:

节点主从切换/迁移后,网络等各种原因导致更新slot信息失败

asking时一直指向同一个节点,导致asking一直失败(该几率较少?)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77194.html

相关文章

  • java 连接 redis 抛出一些异常及处理,和搭建集群时出现的一些错误

    摘要:集群时发生的错误搭建集群发生的错误在搭建完集群,重启了,抛出了。具体解决方法参考 1、集群时发生的错误 1.1、搭建集群发生的错误 在搭建完redis集群,重启了redis,抛出了127.0.0.1:6379 is not empty 。 解决方法:删除对应的redis下面的 dump.rdb 和aof 已经nodes.conf文件(如果没修改redis中的cluster-confi...

    shadajin 评论0 收藏0
  • java 连接 redis 抛出一些异常及处理,和搭建集群时出现的一些错误

    摘要:集群时发生的错误搭建集群发生的错误在搭建完集群,重启了,抛出了。具体解决方法参考 1、集群时发生的错误 1.1、搭建集群发生的错误 在搭建完redis集群,重启了redis,抛出了127.0.0.1:6379 is not empty 。 解决方法:删除对应的redis下面的 dump.rdb 和aof 已经nodes.conf文件(如果没修改redis中的cluster-confi...

    godiscoder 评论0 收藏0
  • 记一次 MySQL 数据库问题排查

    摘要:完成此次修改后,这个异常没有再复现,但是响应缓慢的情况依然没有得到缓解。问题一条引发的血案我们再次查看了错误日志,发现了另一个异常报错。不可重复读事务还没有结束时,事务也访问同一数据。 最近遇到应用频繁的响应缓慢,无法正常访问。帮忙一起定位原因,最后定位到的问题说起来真的是很小的细节问题,但是就是这些小细节导致了服务不稳定,真是细节决定成败。这里尝试着来分享下,希望对大家有所帮助。 问...

    marser 评论0 收藏0
  • Openstack: Too many open Files 错误解决办法

    摘要:页面无法打开,页面报错误,查看日志报如下错误解决方式修改操作系统打开的文件数登录到节点,执行系统默认设置为。使用命令查看当前打开文件数修改,在文件最后加入如下信息表示所有用户,修改后重启服务器,配置生效。 Openstack WebUI页面无法打开,页面报500错误,查看httpd->error_log日志报如下错误: [Tue Apr 02 14:01:05.658276 2019]...

    raledong 评论0 收藏0
  • MySQL Cluster搭建及配置

    摘要:节点负责向数据节点传送访问请求,具体集群过程以及数据库底层均对外透明。通常只需配置一个管理节点然而为了排除单点故障需要,有可能的话,尽量增加管理节点的数量。并发加大后出现默认只有,调整该参数为后解决。 MySQL Cluster介绍 MySQL Cluster是一个高性能、可扩展、集群化数据库产品。MySQL Cluster是一个基于NDB Cluster存储引擎的完整分布式数据库系统...

    AbnerMing 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<