Redis/Jedis нет единой точки отказа и автоматического перехода на другой ресурс

В простой ситуации с 3 серверами с 1 ведущим и 2 ведомыми без шардинга. Существует ли проверенное решение с java и Jedis, которое не имеет единой точки отказа и будет автоматически работать с одним сервером, который будет работать как главный или подчиненный (автоматический переход на другой ресурс). например, продвижение мастеров и сброс после сбоя без потери данных.

Мне кажется, что это должно быть решенной проблемой, но я не могу найти никакого кода на нем, только высокоуровневые описания возможных способов сделать это.

Кто на самом деле это покрыл и работает в производстве?

2 ответа

Решение

Вы можете попробовать 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();
    }
});

Смотрите эту презентацию Zookeeper + Redis.

[Обновить]... или решение Java с Jedis + Sentinel должно использовать оболочку, которая обрабатывает события Redis Sentinel, см. SentinelBasedJedisPoolWrapper.

В настоящее время использую Jedis 2.4.2 (из git), я не нашел способа сделать отказоустойчивый, основанный только на Redis или Sentinel. Я надеюсь, что будет способ. Я думаю, чтобы изучить вариант зоопарка прямо сейчас. Redis кластер хорошо работает с точки зрения производительности и даже стабильности, но он все еще находится на стадии бета-тестирования.

если у кого-то есть лучшее понимание, дайте нам знать.

Другие вопросы по тегам