当前位置: 首页 > 知识库问答 >
问题:

杰迪斯在雷迪斯的多个哨兵下表现出乎意料

洪涵亮
2023-03-14

我使用的是Spring2.1.1和Redis4.0.1。我已经配置了两台节点计算机,一台具有IP:192.168.20.40主配置,另一台具有IP:192.168.20.55从配置。我正在两个系统上使用jedis(不使用spring-jedis)运行Springboot应用程序,出现了不同的情况-

@Bean
public JedisSentinelPool jedisSentinelPool() {
    Set<String> sentinels=new HashSet<>();  
    sentinels.add("192.168.20.40:26379");
    sentinels.add("192.168.20.55:26379");
    JedisSentinelPool jedisSentinelPool=new JedisSentinelPool("mymaster", sentinels);
    return jedisSentinelPool;
}

>

  • 在主节点上运行应用程序(用主节点配置的redis)时,数据会集中在缓存中。
  • 在从节点上运行应用程序时(redis配置了从节点),出现异常-(i.)我能够从sentinel pool获得jedis对象,但无法将数据存储到redis中,异常为“redis.clients.jedis.exceptions.JedisDataException:READONLY You cant writing a read only slave.”
  • 当在另一台服务器(192.168.20.33)上运行应用程序时,redis服务器托管在“IP:192.168.20.40”和“IP:192.168.20.55”上,那么我的应用程序无法从sentinel池中获取jedis对象-

    public String addToCache(@PathVariable("cacheName") String cacheName, HttpEntity<String> httpEntity, @PathVariable("key") String key) {
    try (Jedis jedis = jedisPool.getResource();) {
        long dataToEnter = jedis.hset(cacheName.getBytes(), key.getBytes(), httpEntity.getBody().getBytes());
        if (dataToEnter == 0)
            log.info("data existed in cache {} get updated ",cacheName);
        else
            log.info("new data inserted in cache {}",cacheName);
    } catch (Exception e) {
        System.out.println(e);
    }
        return httpEntity.getBody();
    }
    

    任何投入都是值得赞赏的。

  • 共有1个答案

    茅涵映
    2023-03-14

    请检查redis配置文件(redis.conf)。默认情况下,它应该启用只读模式。您需要将只读模式更改为false。

     类似资料:
    • 我一直在读有关Redis sentinel用于故障转移的文章。我计划有1主+1从,如果主倒下超过1分钟,把从变成主。我知道这在哨兵身上是百分之百可能的。 null 与1个哨兵相比,多个哨兵有什么好处?我的应用程序一次只能连接到1个哨兵,即使有2个哨兵,如果其中一个在应用程序层中出现复杂的逻辑,我的应用程序也不能在其中任何一个之间旋转或切换。

    • https://github.com/kubernetes/examples/tree/master/staging/storage/redis 它在给定的图像中工作得很好,但当我们使用Redis官方图像时,哨兵无法在第一个豆荚中连接到Redis。 它显示以下错误: 无法连接到redis,地址-P:6379 如何创建带有Redis官方图像的集群?

    • 我试图有1个redis大师与2个redis复制品绑在一个3法定人数哨兵在Kubernetes。我对Kubernetes很陌生。 我最初的计划是让主控器在一个吊舱上运行,并绑定到一个Kubernetes SVC,而两个副本在自己的吊舱上运行,并绑定到另一个Kubernetes SVC。最后,3个哨兵吊舱将被绑在他们自己的SVC上。副本将被绑定到主SVC(因为没有SVC,ip将会改变)。sentine

    • 在配置包中配置Jedis和Redis后。我用bean注释创建了jedisConnectionFactory和redisTemplate。但是应用程序无法运行“错误:创建名为“redisConnectionFactory”的bean。我需要做什么?

    • 我很好奇当计算redis故障转移的多数时,是否考虑到了死掉的(不可到达的)哨兵进程。例如,如果我在节点A有三个哨兵+Redis Master,在节点B有三个哨兵+Redis Slave,如果节点A完全脱机,Redis Slave B会升为Master吗?多数票(N/2+1)将意味着4个哨兵同意,但由于节点A中的三个哨兵已经死亡,他们是否算作N的一部分?

    • 当主人倒下的时候,它不应该被降级为奴隶吗?有了这一点,当它再次升起时,它将立即成为奴隶。我知道(自从Redis2.8?)配置重写功能使得Redis实例关闭时不能修改配置。 在一段时间内有两个主服务器对我来说是一个问题,因为在这么短的时间内,HaProxy不是向一个主服务器Redis发送请求,而是在这两个主服务器之间进行负载平衡。 有没有办法把失败的主人立即降级为奴隶?