我有一个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
才能工作。
答案 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);
}