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

使用Lettuce连接到AWS ElastiCache Redis的Spring会话

江曦
2023-03-14
    null
<!-- Lettuce Configuration -->
<bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory">
    <constructor-arg ref="redisClusterConfiguration"/>
</bean>

<!-- Redis Cluster Configuration -->
<bean id="redisClusterConfiguration" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
    <constructor-arg>
        <list>
            <value><!-- AMAZON SINGLE ENDPOINT HERE --></value>
         </list>
     </constructor-arg>
 </bean>
myserver-0001-001
cache-cluster
Monday, July 6, 2020 at 8:25:32 PM UTC+3
Finished recovery for cache nodes 0001
 
myserver-0001-001
cache-cluster
Monday, July 6, 2020 at 8:20:38 PM UTC+3
Recovering cache nodes 0001
 
myserver
replication-group
Monday, July 6, 2020 at 8:19:14 PM UTC+3
Failover to replica node myserver-0001-002 completed
 
myserver
replication-group
Monday, July 6, 2020 at 8:17:59 PM UTC+3
Test Failover API called for node group 0001
org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: CLUSTERDOWN The cluster is down
endpoint:6379> cluster nodes
ffe51ecc6a8c1f32ab3774eb8f159bd64392dc14 172.31.11.216:6379@1122 master - 0 1594114396000 9 connected 0-8191
f8ff7a20f4c493b63ba65f107f575631faa4eb1b 172.31.11.52:6379@1122 slave 4ab10ca0a6a932179432769fcba7fab0faba01f7 0 1594114396872 2 connected
c18fee0e47800d792676c7d14782d81d7d1684e8 172.31.10.64:6379@1122 master,fail - 1594114079948 1594114077000 8 connected
4ab10ca0a6a932179432769fcba7fab0faba01f7 172.31.10.84:6379@1122 myself,master - 0 1594114395000 2 connected 8192-16383
endpoint:6379> cluster nodes
ffe51ecc6a8c1f32ab3774eb8f159bd64392dc14 172.31.11.216:6379@1122 master - 0 1594114461262 9 connected 0-8191
f8ff7a20f4c493b63ba65f107f575631faa4eb1b 172.31.11.52:6379@1122 slave 4ab10ca0a6a932179432769fcba7fab0faba01f7 0 1594114460000 2 connected
6a7339ae4df3c78e31c9cc8fd8cec4803eed5fc1 172.31.10.64:6379@1122 master - 0 1594114460256 0 connected
c18fee0e47800d792676c7d14782d81d7d1684e8 172.31.10.64:6379@1122 master,fail - 1594114079948 1594114077000 8 connected
4ab10ca0a6a932179432769fcba7fab0faba01f7 172.31.10.84:6379@1122 myself,master - 0 1594114458000 2 connected 8192-16383
endpoint:6379> cluster nodes
ffe51ecc6a8c1f32ab3774eb8f159bd64392dc14 172.31.11.216:6379@1122 master - 0 1594114509000 9 connected 0-8191
f8ff7a20f4c493b63ba65f107f575631faa4eb1b 172.31.11.52:6379@1122 slave 4ab10ca0a6a932179432769fcba7fab0faba01f7 0 1594114510552 2 connected
6a7339ae4df3c78e31c9cc8fd8cec4803eed5fc1 172.31.10.64:6379@1122 slave ffe51ecc6a8c1f32ab3774eb8f159bd64392dc14 0 1594114510000 9 connected
c18fee0e47800d792676c7d14782d81d7d1684e8 172.31.10.64:6379@1122 master,fail - 1594114079948 1594114077000 8 connected
4ab10ca0a6a932179432769fcba7fab0faba01f7 172.31.10.84:6379@1122 myself,master - 0 1594114508000 2 connected 8192-16383
endpoint:6379> cluster nodes
ffe51ecc6a8c1f32ab3774eb8f159bd64392dc14 172.31.11.216:6379@1122 master - 0 1594114548000 9 connected 0-8191
f8ff7a20f4c493b63ba65f107f575631faa4eb1b 172.31.11.52:6379@1122 slave 4ab10ca0a6a932179432769fcba7fab0faba01f7 0 1594114548783 2 connected
6a7339ae4df3c78e31c9cc8fd8cec4803eed5fc1 172.31.10.64:6379@1122 slave ffe51ecc6a8c1f32ab3774eb8f159bd64392dc14 0 1594114547776 9 connected
4ab10ca0a6a932179432769fcba7fab0faba01f7 172.31.10.84:6379@1122 myself,master - 0 1594114547000 2 connected 8192-16383

难道我的配置还不够让生菜连上新升职的师傅吗?我是否需要在Lettuce中启用一个不同的模式,以便它能够接收Redis的通知并切换到新的master(例如,拓扑刷新)?

另外,Lettuce是如何处理来自AWS的单个endpoint的?它是解析IPs然后使用它们吗?它们被缓存了吗?

如果我想让读取从所有四个节点发生,我的配置是否足够?在Redis集群中(即,即使在AWS上下文之外),当从服务器提升为主服务器时,客户机是轮询以获取信息,还是集群以某种方式将信息推送到客户机?

启用了调试,并使用断点拦截bean创建和配置拓扑,以这种方式刷新。似乎通过ClusterClientOptions的构造函数启用ClusterTopologyRefreshTask:

protected ClusterClientOptions(Builder builder) {
 
        super(builder);
 
        this.validateClusterNodeMembership = builder.validateClusterNodeMembership;
        this.maxRedirects = builder.maxRedirects;
 
        ClusterTopologyRefreshOptions refreshOptions = builder.topologyRefreshOptions;
 
        if (refreshOptions == null) {
            refreshOptions = ClusterTopologyRefreshOptions.builder() //
                    .enablePeriodicRefresh(DEFAULT_REFRESH_CLUSTER_VIEW) // Breakpoint here and enter to enable refreshing
                    .refreshPeriod(DEFAULT_REFRESH_PERIOD_DURATION) // Breakpoint here and enter to set the refresh interval
                    .closeStaleConnections(builder.closeStaleConnections) //
                    .build();
        }
 
        this.topologyRefreshOptions = refreshOptions;
    }

这似乎是令人耳目一新的OK,但现在的问题是,当Lettuce通过Spring会话而不是作为Redis的普通客户端使用时,如何配置它?

共有1个答案

龙安阳
2023-03-14

当我在思考我的问题时,我意识到我还没有回答那个问题!所以这里是为了防止有人有同样的问题。

我最后做的是为Redis创建一个配置bean,而不是使用XML。守则如下:

@EnableRedisHttpSession
public class RedisConfig {
  private static final List<String> clusterNodes = Arrays.asList(System.getProperty("redis.endpoint"));

  @Bean
  public static ConfigureRedisAction configureRedisAction() {
    return ConfigureRedisAction.NO_OP;
  }

  @Bean(destroyMethod = "destroy")
  public LettuceConnectionFactory lettuceConnectionFactory() {
    RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(clusterNodes);
    return new LettuceConnectionFactory(redisClusterConfiguration, getLettuceClientConfiguration());
  }


  private LettuceClientConfiguration getLettuceClientConfiguration() {
    ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder().enablePeriodicRefresh(Duration.ofSeconds(30)).build();

    ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder().topologyRefreshOptions(topologyRefreshOptions).build();

    return LettucePoolingClientConfiguration.builder().clientOptions(clusterClientOptions).build();
  }
}

然后,我没有通过XML注册ContextLoaderListener,而是使用了一个初始化器,如下所示:

public class Initializer extends AbstractHttpSessionApplicationInitializer {
  public Initializer() {
    super(RedisConfig.class);
  }
}
 类似资料:
  • 我想通过aplication.properties文件将Spring Boot REST Api项目连接到MongoDb。为什么?因为这对我来说似乎更容易。 我知道如何使用MySQL数据库进行连接。我已经下载了MongoDb Compass GUI。 应用属性文件 我使用uri是因为我发现如果MongoDb版本是 用户收藏:链接 pom文件: 用户存储库文件: 主要申请文件: 我得到以下错误恍惚:

  • 请帮帮我,我花了两天的时间在这个小问题上,但我还不知道如何解决它。 我已经将mysql安装在本地Windows10 PC的docker容器中。 mysql服务器运行良好(从mysql工作台运行) 但当我试图从intellij运行时,这些错误消息会出现。 我的Application.Protictions文件: 我的pom.xml文件:

  • 问题内容: 我在使用Spring使用凭据访问MongoDB时遇到问题。虽然没有凭据,但它就像一个咒语,但是使用它们却无法说 一定是由于新的auth默认设置,您可以在http://docs.mongodb.org/manual/core/authentication/中进行阅读 在3.0版中进行了更改:SCRAM-SHA-1是从3.0系列开始的MongoDB版本的默认机制。 问题: 有人找到一种使用

  • 我有一个Spring Boot应用程序(版本2.1.1),使用Postgresql 9.6作为数据库。我必须使用sslmode=verify ca通过SSL连接到db。到目前为止,我所做的是在申请表中设置。属性文件属性 有没有办法在其他一些Spring属性中指定ssl属性而不是在连接url中? 此外,还可以为证书指定相对路径,而不是使用绝对路径?

  • 我有简单的Spring启动应用程序和具有工作SSL连接的Kafka(其他应用程序,不是Spring启动,已成功连接)。我无法访问Kafka经纪人的属性。我的应用是Kafka的客户端。这个应用程序在库伯内特斯内部的容器中运行。我的Spring启动可以访问密钥库.p12,ca-cert,Kafka佩姆,Kafka.key文件(它位于容器内的目录中)。 在配置中我使用 每次我收到错误 我尝试了不同的变化