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 кластер хорошо работает с точки зрения производительности и даже стабильности, но он все еще находится на стадии бета-тестирования.
если у кого-то есть лучшее понимание, дайте нам знать.