Статьи

Spring Data Redis: высокая доступность с Sentinel

1. Обзор

Для обеспечения высокой доступности с Redis мы можем использовать поддержку Spring Data Redis для Redis Sentinel. С помощью Sentinel мы можем создать развертывание Redis, которое автоматически противостоит определенным сбоям.

Redis Sentinel также предоставляет другие сопутствующие задачи, такие как мониторинг, уведомления и выступает в качестве поставщика конфигурации для клиентов.

На высоком уровне возможности Sentinel:

  • Автоматическое аварийное переключение . Когда мастер работает не так, как ожидалось, Sentinel запускает для нас процесс восстановления после сбоя, когда подчиненный становится мастером. Кроме того, другие ведомые устройства перенастроены на использование нового главного устройства, и приложения, использующие сервер Redis, информируются о новом используемом адресе.
  • Источник конфигурации . Когда происходит аварийное переключение, Sentinels сообщит новый адрес. Это потому, что Sentinel действует как источник полномочий для клиентов. Когда клиенты выполняют обнаружение службы, они подключаются к Sentinels для запроса адреса текущего мастера Redis, ответственного за данную службу.
  • Мониторинг Sentinel периодически проверяет, работают ли наши главные и подчиненные экземпляры так, как они предназначены.
  • Уведомлять Sentinel может быть настроен на уведомление множества целей при возникновении ошибки с одним из экземпляров Redis. Эти цели включают другие приложения, системного администратора или API.

2. Как запустить Sentinel

Стабильная версия Sentinel поставляется с Redis начиная с Redis 2.8.

Запуск Sentinel очень прост. Когда мы рассматривали Spring Data Redis (с Spring Boot) в моей предыдущей статье, мы установили Redis, используя homebrew на Mac. Эта команда позволяет нам запустить Sentinel с этой установкой:

1
redis-sentinel /path/to/sentinel.conf

Если мы используем исполняемый файл redis-sentinel (или если у нас есть символическая ссылка с этим именем на исполняемый файл redis-server ), мы также можем запустить Sentinel с помощью приведенной выше команды.

В качестве альтернативы, мы можем использовать исполняемый файл redis-server и запустить его в режиме Sentinel, например так:

1
redis-server /path/to/sentinel.conf --sentinel

3. Основные понятия, которые необходимо знать перед развертыванием Sentinel

Некоторые концепции, которые мы должны рассмотреть перед развертыванием в Sentinel, включают:

  1. Для длительного развертывания Redis нам требуется как минимум три экземпляра Sentinel.
  2. Мы должны поместить три экземпляра Sentinel в компьютеры или виртуальные машины, которые, как считается, выходят из строя независимо, а не вместе. Например, это может означать разные зоны доступности.
  3. Redis использует асинхронную репликацию и поэтому не гарантирует, что полученные записи будут сохраняться во время сбоев, даже при использовании Sentinel. Тем не менее, мы можем развернуть Sentinel, который сокращает время записи.
  4. Любая установка высокой доступности должна периодически проверяться, и Sentinel ничем не отличается. Нам нужно тестировать как в средах разработки, так и в наших производственных средах. Планируя и тестируя на отказ, мы ограничиваем наши сбои.

4. Конфигурация в Spring Data

Когда мы используем конфигурацию на основе Sentinels, мы не предоставляем информацию о хосте / порте Redis для Spring Data Redis. Вместо этого мы предоставляем свойство для главного сервера и список URL-адресов Sentinel. Каждый процесс Sentinel имеет свой собственный файл конфигурации, в котором указан главный сервер Redis, например:

1
2
3
4
sentinel monitor themaster 127.0.0.1 6379 2
sentinel down-after-milliseconds themaster 60000
sentinel failover-timeout themaster 180000
sentinel parallel-syncs themaster 1

После того, как мы сконфигурировали нашего ведущего, подчиненных и Sentinels, нам нужно изменить конфигурацию повторного отображения данных пружины в нашем приложении для работы со стражами.

4.1 Конфигурация Java

Конфигурация Java может быть выполнена с использованием Jedis и Lettuce:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * Jedis
 */
@Bean
public RedisConnectionFactory jedisConnectionFactory() {
  RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
  .master("themaster")
  .sentinel("127.0.0.1", 26579)
  .sentinel("127.0.0.1", 26580);
  return new JedisConnectionFactory(sentinelConfig);
}
 
/**
 * Lettuce
 */
@Bean
public RedisConnectionFactory lettuceConnectionFactory() {
  RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
  .master("themaster")
  .sentinel("127.0.0.1", 26579)
  .sentinel("127.0.0.1", 26580);
  return new LettuceConnectionFactory(sentinelConfig);
}

4.2 Конфигурация свойств

ProperySource , такой как application.properties , может быть использован для конфигурации. Например, если мы используем localhost:

1
2
spring.redis.sentinel.master= themaster # Name of our Redis server.
spring.redis.sentinel.nodes= localhost:26579, localhost:26580, localhost:26581 # Comma-separated list of host:port pairs.

5. Заключение

Сегодня мы рассмотрели, как можно добиться высокой доступности с помощью Redis с помощью Sentinel и как это поддерживает Spring Data Redis в наших приложениях Spring. Для получения дополнительной информации о Sentinel, сайт Redis является хорошим источником.

На моем сайте также есть информация, начиная с Spring Data Redis и Spring Boot и нескольких статей о Spring Framework в целом.

Опубликовано на Java Code Geeks с разрешения Майкла Гуда, партнера нашей программы JCG . См. Оригинальную статью здесь: Spring Data Redis: высокая доступность с Sentinel

Мнения, высказанные участниками Java Code Geeks, являются их собственными.