在一个简单的情况下,有 3 个服务器,1 个主服务器和 2 个从属服务器,没有分片。是否有一个经过验证的 Java 和 Jedis 解决方案,它没有单点故障,并且会自动处理单台服务器宕机,无论是主服务器还是从服务器(自动故障转移)。例如,升级主机并在故障后重置而不会丢失任何数据。
在我看来,这应该是一个已解决的问题,但我找不到任何代码,只是对可能的方法进行高级描述。
谁实际上已经涵盖并在生产中工作?
在一个简单的情况下,有 3 个服务器,1 个主服务器和 2 个从属服务器,没有分片。是否有一个经过验证的 Java 和 Jedis 解决方案,它没有单点故障,并且会自动处理单台服务器宕机,无论是主服务器还是从服务器(自动故障转移)。例如,升级主机并在故障后重置而不会丢失任何数据。
在我看来,这应该是一个已解决的问题,但我找不到任何代码,只是对可能的方法进行高级描述。
谁实际上已经涵盖并在生产中工作?
您可能想尝试使用Redis Sentinel来实现:
Redis Sentinel 是一个旨在帮助管理 Redis 实例的系统。它执行以下三个任务:
监测。Sentinel 会不断检查您的主从实例是否按预期工作。
通知。Sentinel 可以通过 API 通知系统管理员或其他计算机程序,其中一个受监控的 Redis 实例出现问题。
自动故障转移。如果一个 master 没有按预期工作,Sentinel 可以启动一个故障转移过程,其中一个 slave 被提升为 master,其他额外的 slave 被重新配置为使用新的 master,并且使用 Redis 服务器的应用程序通知新地址以在何时使用连接。
...或使用Zookeeper和Jedis_failover等外部解决方案:
JedisPool pool = new JedisPoolBuilder()
.withFailoverConfiguration(
"localhost:2838", // ZooKeeper cluster URL
Arrays.asList( // List of redis servers
new HostConfiguration("localhost", 7000),
new HostConfiguration("localhost", 7001)))
.build();
pool.withJedis(new JedisFunction() {
@Override
public void execute(final JedisActions jedis) throws Exception {
jedis.ping();
}
});
[更新] ...或 Jedis + Sentinel 的纯 Java 解决方案是使用处理 Redis Sentinel 事件的包装器,请参阅SentinelBasedJedisPoolWrapper。
目前使用 Jedis 2.4.2(来自 git),我没有找到仅基于 Redis 或 Sentinel 进行故障转移的方法。我希望会有办法。我现在正在考虑探索 zookeeper 选项。Redis 集群在性能甚至稳定性方面运行良好,但仍处于 beta 阶段。
如果有人有更好的见解,请告诉我们。