使用 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 中找到所有代码,而不是在这里发布所有代码,因为它会成为一堵代码墙。
AWS 和 Lettuce 有了进一步的改进,使其更易于支持 Master/Slave。
AWS 最近发生的一项改进是它为 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);
}
我有一个包含一个主服务器和两个从服务器的 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 中找到所有代码,而不是在这里发布所有代码,因为它会成为一堵代码墙。
AWS 和 Lettuce 有了进一步的改进,使其更易于支持 Master/Slave。
AWS 最近发生的一项改进是它为 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);
}