7

在一个简单的情况下,有 3 个服务器,1 个主服务器和 2 个从属服务器,没有分片。是否有一个经过验证的 Java 和 Jedis 解决方案,它没有单点故障,并且会自动处理单台服务器宕机,无论是主服务器还是从服务器(自动故障转移)。例如,升级主机并在故障后重置而不会丢失任何数据。

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

谁实际上已经涵盖并在生产中工作?

4

2 回答 2

9

您可能想尝试使用Redis Sentinel来实现:

Redis Sentinel 是一个旨在帮助管理 Redis 实例的系统。它执行以下三个任务:

  • 监测。Sentinel 会不断检查您的主从实例是否按预期工作。

  • 通知。Sentinel 可以通过 API 通知系统管理员或其他计算机程序,其中一个受监控的 Redis 实例出现问题。

  • 自动故障转移。如果一个 master 没有按预期工作,Sentinel 可以启动一个故障转移过程,其中一个 slave 被提升为 master,其他额外的 slave 被重新配置为使用新的 master,并且使用 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();
    }
});

请参阅Zookeeper + Redis 的演示文稿

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

于 2013-05-03T12:56:11.407 回答
1

目前使用 Jedis 2.4.2(来自 git),我没有找到仅基于 Redis 或 Sentinel 进行故障转移的方法。我希望会有办法。我现在正在考虑探索 zookeeper 选项。Redis 集群在性能甚至稳定性方面运行良好,但仍处于 beta 阶段。

如果有人有更好的见解,请告诉我们。

于 2014-03-12T10:14:29.223 回答