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

在CloudFoundry上为Redis实例配置Sentinel节点

穆宾白
2023-03-14

我正在从单节点Redis切换到基于哨兵的多节点Redis实例,由于新实例的VCAP结构不同,并且Spring默认不处理,我知道我们需要自己解析VCAP并配置Redis bean。

按照这里的Spring文档,这是我如何改编我的Redis beans的:

       public RedisConnectionFactory jedisConnectionFactory(JsonArray sentinelNodes) {
              RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration().master("mymaster");
              String hostname;
              String port;
              for (int i = 0; i < sentinelNodes.size(); i++) {
                     JsonObject sentinelNode = sentinelNodes.getJsonObject(i);
                     hostname = sentinelNode.getString("hostname");
                     port = sentinelNode.getString("port");
                     sentinelConfig.sentinel(hostname, Integer.parseInt(port));
              }
              return new JedisConnectionFactory(sentinelConfig);
       }

       @Bean
       public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
              JsonArray sentinelNodes = environmentHandler.getSentinelNodesForRedis();
              if (sentinelNodes != null) {
                     cf = jedisConnectionFactory(sentinelNodes);
              }
              RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
              redisTemplate.setConnectionFactory(cf);
              redisTemplate.setKeySerializer(new StringRedisSerializer());
              redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
              return redisTemplate;
       }

       @SuppressWarnings("rawtypes")
       @Bean
       public CacheManager cacheManager(RedisTemplate redisTemplate) {
              return new RedisCacheManager(redisTemplate);
       }

我从VCAP中获取哨兵节点的信息,并将其传递给创建我的绝地连接工厂。我能够像这样配置豆子,但在运行时收到一个异常,指出“组织.Spring框架.data.redis.Redis连接失败异常:无法获得绝地武士连接;嵌套的异常是 java.lang.NullPointer异常:在尝试调用从局部变量“分片信息”加载的空对象的方法 redis.clients.jedis.jedisShardInfo.getHost() |在组织.Spring框架.数据.redis.连接.杰迪斯.杰迪斯连接工厂.fetchJedis连接器(杰迪斯连接工厂.java:204)...'。在我的理解中,我使用RedisSentinel配置而不是杰迪斯碎片信息来配置杰迪斯连接工厂,分片信息对我来说不应该是必需的。

在检查这个库的较新版本时,我注意到这个特定的代码被修改为这样。所以我适应了这个较新的版本,但是现在应用程序在启动过程中崩溃,有以下例外。

Java . lang . nosuchmethoderror:org . spring framework . util . assert . is true(ZL Java/util/function/Supplier;)V | at org . spring framework . data . redis . connection . redistandaloneconfiguration .(redistandaloneconfiguration . Java:61)| at org . spring framework . data . redis . connection . jedis . jedisconnectionfactory .(jedisconnectionfactory . Java:99)| at org . spring framework . data . redis . connection . jedis . jedisconnection factory .(jedisconnectionfactory . Java:111)…

遵循例外把我带到这里,但我不明白为什么会导致这个例外。

有人能指出我错在哪里,或者给我指出如何通过Spring Boot豆配置这些多节点Redis哨兵的例子吗?

共有1个答案

云骏奇
2023-03-14

现在,在返回RedisConnectionFactory之前调用postProperty tiesSet()方法似乎已经完成了。

(此外,还为工厂设置了密码。)

 类似资料:
  • 本文向大家介绍Linux redis-Sentinel配置详解,包括了Linux redis-Sentinel配置详解的使用技巧和注意事项,需要的朋友参考一下 下载 下载地址:https://redis.io/download 在/usr/local/src目录下执行下载。 安装 解压到/usr/local/src目录,放源码包。 创建目录/usr/local/redis: 进入源码目录: 然后执

  • 问题内容: 我有一个基于Spring Cloud的应用程序,带有多个后端Spring- Boot服务器。这些服务器都通过@EnableRedisHttpSession与Redis服务器共享会话。 我正在尝试使用主从配置和Redis Sentinel配置应用程序。我的设置是1个主机,2个从机和3个哨兵。 我不断遇到环境问题。刚开始,我遇到一个错误,说我的奴隶是READONLY。因此,我必须将所有从属

  • 我正在尝试用主从配置和Redis Sentinel配置应用程序。我的设置是1个主人,2个奴隶,3个哨兵。 我一直对环境有问题。起初,我得到了一个错误,说我的奴隶它是只读的。所以我不得不将所有的奴隶都设置为读写。然后,我还是得到了这个错误。原来,当一个从机提升为主机时,旧的主机也会变成从机,默认的是只读设置。所以我不得不将主程序也设置为READWRITE。以下是我引导redis服务器的命令(我知道使

  • 我编写了一个监控程序来监控我的Redis Sentinel HA集群的健康状况,它标记了一个从服务器丢失,即节点10.10.10.30。经过一些调试,发现处于sdown状态true的从服务器被过滤掉了。 我的系统由三个节点组成,一个主节点,两个从节点。每个节点上都部署了哨兵。 在主服务器上,如果我登录到redis-cli,报告如下: 我所有的redis服务器以及每台机器上的哨兵都已经启动并运行。

  • 基本上,我试图设置一个Redis-sentinel docker实例,并希望从我的应用程序容器进行调用。我正在运行的问题是,redis-sentinel容器链接到应用程序容器。 因此,最初该应用程序询问哨兵进程关于redis Master的情况。哨兵接着说是“127.0.0.1”。但是应用程序容器假定它是容器本地的。这可以通过在sentinel进程开始时传递的公告-IP/公告-端口参数来克服。然而