代码之家  ›  专栏  ›  技术社区  ›  HLiu

为ElastiCache主/从配置Spring Data Redis和莴苣

  •  3
  • HLiu  · 技术社区  · 7 年前

    我有一个Elasticache设置,有一个主设备和两个从设备。我仍然不知道如何传入主从Reduris列表来构建 StatefulRedisMasterSlaveConnection 对于 LettuceConnectionFactory . 我只看到对单主机和端口的独立配置的支持。

    LettuceClientConfiguration configuration = LettuceTestClientConfiguration.builder().readFrom(ReadFrom.SLAVE).build();
    LettuceConnectionFactory factory = new LettuceConnectionFactory(SettingsUtils.standaloneConfiguration(),configuration);
    

    我知道有一个类似的问题 Configuring Spring Data Redis with Lettuce for Redis master/slave

    但我认为它不适用于ElastiCache主/从设置,因为目前上述代码将尝试使用 MasterSlaveTopologyProvider 发现从属IP。但是,无法访问从属IP地址。那么,配置Spring Data Redis以使其与主/从ElastiCache兼容的正确方法是什么呢?在我看来 莴苣连接工厂 需要接受端点列表并使用 StaticMasterSlaveTopologyProvider 为了工作。

    2 回复  |  直到 7 年前
        1
  •  5
  •   catch32    6 年前

    AWS和莴苣有了进一步的改进,使其更容易支持主/从。

    AWS最近的一项改进是,它为Redis启动了读卡器端点,可在副本之间分配负载: Amazon ElastiCache launches reader endpoints for Redis .

    因此,使用 Spring数据Redis 将使用Redis群集的主端点(主端点)和读取器端点(用于副本)。

    您可以从AWS控制台获取这两个选项。以下是示例代码:

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                .readFrom(ReadFrom.SLAVE_PREFERRED)
                .build();
        RedisStaticMasterReplicaConfiguration redisStaticMasterReplicaConfiguration =
                new 
         RedisStaticMasterReplicaConfiguration(REDIS_CLUSTER_PRIMARY_ENDPOINT, redisPort);
        redisStaticMasterReplicaConfiguration.addNode(REDIS_CLUSTER_READER_ENDPOINT, redisPort);
        redisStaticMasterReplicaConfiguration.setPassword(redisPassword);
        return new LettuceConnectionFactory(redisStaticMasterReplicaConfiguration, clientConfig);
    }
    
        2
  •  0
  •   mp911de    7 年前

    目前,Spring Data Redis不支持提供端点的静态主/从。我提交了 a ticket 为其添加支持。

    您可以通过子类化自己实现此功能 LettuceConnectionFactory ,创建自己的配置和 莴苣连接工厂 .

    您可以从以下内容开始:

    public static class MyLettuceConnectionFactory extends LettuceConnectionFactory {
    
        private final MyMasterSlaveConfiguration configuration;
    
        public MyLettuceConnectionFactory(MyMasterSlaveConfiguration standaloneConfig,
                LettuceClientConfiguration clientConfig) {
            super(standaloneConfig, clientConfig);
            this.configuration = standaloneConfig;
        }
    
        @Override
        protected LettuceConnectionProvider doCreateConnectionProvider(AbstractRedisClient client, RedisCodec<?, ?> codec) {
            return new ElasticacheConnectionProvider((RedisClient) client, codec, getClientConfiguration().getReadFrom(),
                    this.configuration);
        }
    }
    
    static class MyMasterSlaveConfiguration extends RedisStandaloneConfiguration {
    
        private final List<RedisURI> endpoints;
    
        public MyMasterSlaveConfiguration(List<RedisURI> endpoints) {
            this.endpoints = endpoints;
        }
    
        public List<RedisURI> getEndpoints() {
            return endpoints;
        }
    }
    

    您可以在中找到所有代码 this gist ,而不是在此处发布所有代码,因为这将是一堵代码墙。