Redis/Jedis не имеет единой точки отказа и автоматизированного аварийного переключения

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

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

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


person Derek Organ    schedule 01.05.2013    source источник


Ответы (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.

person FGRibreau    schedule 03.05.2013
comment
похоже, нет фрагмента кода для Java, который я мог бы использовать с часовыми. Я понимаю основную идею, но что люди на самом деле используют в буквальном коде прямо сейчас в производстве? - person Derek Organ; 03.05.2013
comment
Для управления автоматическим аварийным переключением Redis без Sentinel всегда требуется внешнее программное обеспечение. Однако вы взглянули на реализацию FailSafe? github.com/xetorthio/jedis/pull/386 Это будет не так хорошо в качестве реального аварийного переключения, но если вы ищете быстрое решение, это может быть хорошей отправной точкой - person FGRibreau; 03.05.2013
comment
но что люди на самом деле используют в буквальном коде прямо сейчас в производстве? Zookeeper, а теперь и Redis Sentinel, в основном. - person FGRibreau; 03.05.2013
comment
но с Redis Sentinel вам нужен код поверх Jedis, например, чтобы узнать, когда мастер изменился, и я предполагаю, что много функций и проверок повторных попыток? - person Derek Organ; 03.05.2013
comment
Вот код, который вам сейчас нужен для работы с Sentinel и Jedis: github.com/hamsterready/jedis-sentinel-pool/blob/master/src/ - person FGRibreau; 03.05.2013
comment
В качестве альтернативы вы можете запустить сценарий, когда произойдет аварийное переключение, и предполагается, что сценарий каким-то образом переконфигурирует клиентов с новым главным адресом. - person antirez; 03.05.2013
comment
тестирование пула Jedis-sentinel, и он очень хорошо работает на локальных тестах. будет иметь тайник в нашем постоянном хранилище данных, пока произойдет аварийное переключение, которое будет воспроизведено в Pipeline - person Derek Organ; 03.05.2013
comment
Не забудьте подтвердить ответ, если вы искали Jedis-sentinel-pool :) - person FGRibreau; 05.05.2013

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

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

person Guy Lubovitch    schedule 12.03.2014