2013-05-01 150 views
7

在3个服务器有1个主站和2个没有分区的从站的简单情况下。是否有经过验证的java和Jedis解决方案没有单点故障,并且会自动处理单个服务器故障,即主服务器或从服务器(自动故障切换)。例如在失败后促进主人和重新设置而不丢失任何数据。Redis/Jedis没有单点故障和自动故障转移

在我看来,它应该是一个解决的问题,但我无法找到任何代码,只是对可能的方式进行高级别描述。

究竟谁拥有这样的产品?

回答

9

你可能想给一个尝试Redis Sentinel以实现:

Redis的哨兵是旨在帮助管理的Redis实例的系统。 它执行以下三项任务:

  • 监测。哨兵不断检查你的主从实例是否按预期工作。

  • 通知。 Sentinel可以通过API向系统管理员或其他计算机程序通知被监测的Redis实例的一个 有问题。

  • 自动故障转移。如果主站未按预期工作,则Sentinel可以启动故障切换过程,其中从站升级为主站,其他附加从站重新配置为使用新主站,使用Redis服务器的应用程序通知新地址 连接时使用。

...或使用像ZookeeperJedis_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

[Update] ...或者Jedis + Sentinel的纯Java解决方案是使用处理Redis Sentinel事件的包装器,请参阅SentinelBasedJedisPoolWrapper

+0

似乎没有一段代码可以用于java,我可以使用sentinels。我得到了压倒一切的想法,但是现在人们在生产中实际使用的是字面代码吗? – 2013-05-03 13:04:35

+1

在没有Sentinel的情况下管理Redis **的自动故障转移**将始终需要一个外部软件。但是,您是否看过FailSafe实施? https://开头github上。com/xetorthio/jedis/pull/386它不会像真正的故障转移一样好,但如果你正在寻找一个快速解决方案,它可能是一个很好的起点 – FGRibreau 2013-05-03 13:09:01

+1

“但是现在人们实际上使用的是字面代码在生产?“ Zookeeper现在主要是Redis Sentinel。 – FGRibreau 2013-05-03 13:14:05

1

目前使用Jedis 2.4.2(来自git),我没有找到一种方法来仅基于redis或sentinel进行故障切换。我希望有一个办法。我正在考虑现在探索zookeeper选项。 Redis集群在性能和稳定性方面表现良好,但仍处于测试阶段。

如果有人有更好的见解让我们知道。