You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法连接启用集群模式的AWS ElastiCache for Redis集群求助

问题分析与解决方案

核心问题原因

  1. 单机配置的MOVED异常:单机Redis客户端不识别集群拓扑,当Redis集群返回MOVED指令(指示数据存储在其他节点)时,客户端无法处理节点跳转逻辑,因此抛出异常。
  2. 集群模式的拓扑获取失败:Lettuce客户端在集群模式下会自动从集群端点获取所有节点的VPC内部地址,但本地机器通过堡垒机只能访问集群端点,无法直接连接这些内部节点,导致拓扑刷新失败——这确实和堡垒机的网络限制直接相关。
  3. 配置遗漏:代码中未启用SSL、未配置密码,与application.yml中的配置不匹配,也会导致连接失败。

解决方案步骤

1. 修正Redis集群配置,读取配置文件参数并启用SSL/密码

修改RedisConfiguration类,从application.yml加载配置参数,同时配置Lettuce客户端强制通过集群端点路由所有请求:

@Configuration
class RedisConfiguration {

    @Value("\${redis.host}")
    private lateinit var redisHost: String

    @Value("\${redis.port}")
    private lateinit var redisPort: String

    @Value("\${redis.password}")
    private lateinit var redisPassword: String

    @Value("\${redis.ssl}")
    private var redisSsl: Boolean = true

    @Bean
    fun redisClusterConfiguration(): RedisClusterConfiguration {
        val clusterConfig = RedisClusterConfiguration()
        clusterConfig.clusterNode(redisHost, redisPort.toInt())
        clusterConfig.setPassword(RedisPassword.of(redisPassword))
        return clusterConfig
    }

    @Bean
    fun connectionFactory(): RedisConnectionFactory {
        // 启用SSL配置
        val socketOptions = SocketOptions.builder()
            .sslEnabled(redisSsl)
            .build()

        // 配置集群客户端选项,禁用节点成员验证,避免直接连接内部节点
        val clusterClientOptions = ClusterClientOptions.builder()
            .socketOptions(socketOptions)
            .validateClusterNodeMembership(false)
            .build()

        // 固定使用初始配置的集群端点刷新拓扑,不使用动态获取的内部节点地址
        val topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
            .useDynamicRefreshSources(false)
            .build()

        val lettuceClientConfiguration = LettuceClientConfiguration.builder()
            .clientOptions(clusterClientOptions)
            .clusterTopologyRefreshOptions(topologyRefreshOptions)
            .build()

        return LettuceConnectionFactory(redisClusterConfiguration(), lettuceClientConfiguration)
    }

    @Bean
    fun redisTemplate(redisConnectionFactory: RedisConnectionFactory) =
        RedisTemplate<String, String>().apply {
            setConnectionFactory(redisConnectionFactory)
            StringRedisSerializer().let {
                keySerializer = it
                valueSerializer = it
            }
        }

    @Bean
    fun remoteConfigCacheManager(
        connectionFactory: RedisConnectionFactory
    ): RedisCacheManager {
        return RedisCacheManager.builder(connectionFactory)
            .withCacheConfiguration(
                "CACHE_NAME",
                RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1))
            )
            .build()
    }
}

2. 保持堡垒机端口转发配置不变

继续使用现有端口转发规则,确保本地localhost:6379转发到ElastiCache集群端点:

LocalForward localhost:6379 my-app.redis.apps.region.company.com:6379

3. 验证效果

启动Spring Boot应用后,客户端会通过堡垒机转发的集群端点连接Redis,所有请求均通过该端点路由,不再尝试直接连接VPC内部节点,即可解决拓扑获取失败和MOVED异常问题。


内容的提问来源于stack exchange,提问作者Maciaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:25:18