使用Lettuce为ElastiCache Master / Slave配置Spring Data Redis

时间:2018-01-26 22:46:02

标签: java redis amazon-elasticache spring-data-redis lettuce

我有一个Elasticache设置,其中包含一个主服务器和两个服务器。我仍然不确定如何传入主奴隶RedisURI列表来为StatefulRedisMasterSlaveConnection构建LettuceConnectionFactory。我只看到对具有单个主机和端口的standaloneConfiguration的支持。

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 Master / Slave设置,因为目前上面的代码会尝试使用MasterSlaveTopologyProvider来发现slave ips。但是,无法访问从属IP地址。那么配置Spring Data Redis以使其与Master / Slave ElastiCache兼容的正确方法是什么?在我看来LettuceConnectionFactory需要接受端点列表并使用StaticMasterSlaveTopologyProvider才能工作。

2 个答案:

答案 0 :(得分:0)

目前,Spring Data Redis不支持带有提供的端点的静态主/从。我提交了a ticket来增加对此的支持。

您可以通过继承LettuceConnectionFactory,创建自己的配置和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中找到所有代码,而不是在此处发布所有代码,因为它会成为代码墙。

答案 1 :(得分:0)

AWS和Lettuce进行了进一步的改进,使其更易于支持Master / Slave。 AWS最近发生的一项改进是,它已启动用于Redis的读取器端点,该端点在副本之间https://aws.amazon.com/about-aws/whats-new/2019/06/amazon-elasticache-launches-reader-endpoint-for-redis/之间分配负载。

因此,使用Spring Data Redis连接到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);

}