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

Configuring Spring Data Redis with Lettuce for ElastiCache Master/Slave

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

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

我知道有一个类似的问题

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

目前,Spring Data Redis 不支持提供端点的静态 Master/Slave。我提交了 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 中找到所有代码,而不是在这里发布所有代码,因为它会成为一堵代码墙。

A​​WS 和 Lettuce 有了进一步的改进,使其更易于支持 Master/Slave。

A​​WS 最近发生的一项改进是它为 Redis 启动了 reader 个端点,用于在副本之间分配负载:Amazon ElastiCache launches reader endpoints for Redis

因此,使用 Spring Data Redis 连接到 Redis 的最佳方法是使用主要端点(master ) 和 reader 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);
}