在简单情况下,如果3台服务器具有1个主服务器和2个从属服务器而没有分片。是否有使用Java和Jedis的经过验证的解决方案,该解决方案没有单点故障,并且将自动处理单个服务器(无论是主服务器还是从服务器)(自动故障转移)。例如,提升主机并在故障后重置,而不会丢失任何数据。
在我看来,这似乎应该是一个已解决的问题,但是我找不到关于它的任何代码,而仅是对实现此方法的高级描述。
谁实际覆盖并在生产中工作?
您可能想尝试Redis Sentinel来实现:
Redis Sentinel是旨在帮助管理Redis实例的系统。它执行以下三个任务: 监控 。Sentinel不断检查您的主实例和从实例是否按预期工作。 通知 。Sentinel可以通过API通知系统管理员或其他计算机程序,其中一个受监视的Redis实例出了问题。 自动故障转移 。如果主服务器未按预期工作,则Sentinel可以启动故障转移过程,在该过程中,将一个从服务器提升为主服务器,将其他附加从服务器重新配置为使用新的主服务器,并且使用Redis服务器的应用程序会获悉在以下情况下要使用的新地址连接。
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(); } });
请参阅Zookeeper + Redis的此演示文稿。
[更新] …或Jedis + Sentinel的纯Java解决方案是使用处理Redis Sentinel事件的包装器,请参见SentinelBasedJedisPoolWrapper。