在一个简单的情况下,有3个服务器,1个主服务器和2个从服务器,没有分片。是否有经过验证的解决方案,java和Jedis没有单点故障,并且会自动处理单个服务器,即主服务器或从服务器(自动故障转移)。例如在没有任何数据丢失的情况下提升主人并重置失败。
在我看来它应该是一个已解决的问题,但我找不到任何代码,只是对可能的方法进行高级描述。
实际上是谁覆盖并在生产中工作?
答案 0 :(得分:9)
您可能想尝试Redis Sentinel来实现这一目标:
Redis Sentinel是一个旨在帮助管理Redis实例的系统。 它执行以下三个任务:
<强>监控即可。 Sentinel会不断检查您的主实例和从属实例是否按预期工作。
<强>通知即可。 Sentinel可以通过API通知系统管理员或其他计算机程序一个错误 受监控的Redis实例。
自动故障转移。如果主服务器未按预期工作,Sentinel可以启动故障转移过程,其中从服务器被提升为主服务器 其他额外的从站被重新配置为使用新的主站,和 使用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();
}
});
请参阅此presentation of Zookeeper + Redis。
[更新] ...或使用Jedis + Sentinel的纯Java解决方案是使用处理Redis Sentinel事件的包装器,请参阅SentinelBasedJedisPoolWrapper。
答案 1 :(得分:1)
目前使用Jedis 2.4.2(来自git),我没有找到基于redis或sentinel进行故障转移的方法。我希望有办法。我正在考虑现在探索zookeeper选项。 redis集群在性能和稳定性方面表现良好,但仍处于测试阶段。
如果有人有更好的见解,请告诉我们。