ELMA365 On-Premises > Подготовка инфраструктуры > Базы данных > Отказоустойчивая инфраструктура / Кластер Redis

Кластер Redis

Для корректной работы системы требуется Redis версии 5 или 6.2. В статье описана установка Redis 6.2.12 для ОС Ubuntu Linux 20.04 и 22.04. Вы также можете ознакомиться с руководством в официальной документации Redis.

Установка состоит из пяти этапов:

  1. Подготовка нод (серверов).
  2. Установка Redis и Sentinel.
  3. Настройка Redis.
  4. Настройка Sentinel.
  5. Подключение к Redis.

Шаг 1. Подготовка нод (серверов)

начало внимание

Минимальное количество серверов для организации кластера — три.

конец внимание

  1. Создайте три ноды (сервера) с последовательно пронумерованными именами хостов:
  • redis-server1.your_domain;
  • redis-server2.your_domain;
  • redis-server3.your_domain.
  1. Создайте необходимые сопоставления имён хостов в DNS. Если такой возможности нет, внесите нужные записи в /etc/hosts.

Шаг 2. Установка Redis и Sentinel

  1. Установите необходимые пакеты:

sudo apt install lsb-release curl gpg

  1. Импортируйте необходимые ключи и добавьте репозиторий Redis:

curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

  1. Обновите кеш пакетов:

sudo apt-get update

  1. Установите Redis:

sudo apt-get -y install redis=6:6.2.12-1rl1~$(lsb_release -cs)1 redis-server=6:6.2.12-1rl1~$(lsb_release -cs)1 redis-tools=6:6.2.12-1rl1~$(lsb_release -cs)1 redis-sentinel=6:6.2.12-1rl1~$(lsb_release -cs)1

Шаг 3. Настройка Redis

Начало внимание

Для пароля разрешается применять следующие символы:

  • заглавные латинские буквы: от A до Z;
  • строчные латинские буквы: от a до z;
  • цифры от 0 до 9;
  • символы:  -_.

Зарезервированные (недопустимые) символы:

! * ' ( ) ; : @ & = + $ , / ? % # [ ]

конец внимание

Для настройки необходимо отредактировать файл /etc/redis/redis.conf на каждом из серверов:

sudo nano /etc/redis/redis.conf

  1. Сделайте сервера доступными для всех IP-адресов данного сервера. Это делает сервис Redis доступным со всех внешних адресов:

bind 0.0.0.0 

  1. Увеличьте максимальное количество клиентов, изменив значение параметра maxclients на 20000. Раскомментируйте строку, убрав знак решетки #:

maxclients 20000

  1. Задайте политику вытеснения ключей, изменив значение параметра maxmemory-policy на allkeys-lfu. Раскомментируйте строку, убрав знак решетки #:

maxmemory-policy allkeys-lfu

  1. Отключите создание snapshots, изменив значение параметра save на "". Раскомментируйте строку, убрав знак решетки #:

save ""

  1. Отключите AOF (сохранение базы данных Redis в файл). Для этого замените значение параметра appendonly на no. Раскомментируйте строку, убрав знак решетки #:

appendonly no

  1. Укажите пароль к Мастеру:

masterauth SecretPassword

  1. Укажите домен (FQDN) для представления ноды в кластере:
  • на ноде redis-server1.your_domain:

replica-announce-ip redis-server1.your_domain

  • на ноде redis-server2.your_domain:

replica-announce-ip redis-server2.your_domain

  • на ноде redis-server3.your_domain:

replica-announce-ip redis-server3.your_domain

  1. Укажите пароль для доступа:

requirepass SecretPassword

  1. На нодах redis-server2.your_domain и redis-server3.your_domain укажите домен (FQDN) и порт для подключения к ноде Мастера (redis-server1.your_domain):

replicaof redis-server1.your_domain 6379

  1. Перезапустите все сервера (сначала Мастер, затем Слэйвы):

sudo systemctl restart redis-server
sudo systemctl enable redis-server

  1. Проверьте статус репликации на ноде redis-server1.your_domain:

sudo redis-cli -a SecretPassword info replication

Настройка включения TLS/SSL в Redis

Шаг 4. Настройка Sentinel

Чтобы настроить Sentinel, необходимо отредактировать файл /etc/redis/sentinel.conf на каждом из серверов.

Начало внимание 

Для корректной работы соблюдайте указанный порядок записей в файле /etc/redis/sentinel.conf.

Конец внимание

  1. Сделайте сервера доступные для всех IP-адресов данного сервера. Это делает сервис Sentinel доступным со всех внешних адресов:

bind 0.0.0.0 

  1. Укажите домен (FQDN) для представления нод Sentinel:
  • на ноде redis-server1.your_domain:

sentinel announce-ip redis-server1.your_domain

  • на ноде redis-server2.your_domain:

sentinel announce-ip redis-server2.your_domain

  • на ноде redis-server3.your_domain:

sentinel announce-ip redis-server3.your_domain

  1. Укажите домен (FQDN) и порт Мастера, а также значение для достижения кворума:

sentinel monitor mymaster redis-server1.your_domain 6379 2

  1. Укажите пароль для доступа к Мастеру:

sentinel auth-pass mymaster SecretPassword

  1. Укажите время, после которого мастер будет считаться упавшим:

sentinel down-after-milliseconds mymaster 3000

  1. Укажите время ожидания после смены ролей слейва на мастер в случае, если мастер вышел из строя:

sentinel failover-timeout mymaster 6000

  1. Включите поддержку разрешения имён хостов:

sentinel resolve-hostnames yes
sentinel announce-hostnames yes

  1. Для повышения безопасности настройте для пользователя default доступ к Sentinel только по паролю:

user default on >SecretPassword sanitize-payload ~* &* +@all

  1. После этого перезапустите все сервера:

sudo systemctl restart redis-sentinel
sudo systemctl enable redis-sentinel

  1. Проверьте статус Sentinel и состояние кворума на ноде redis-server1.your_domain, используя разные команды в зависимости от использования TLS/SSL и настройки Sentinel:
  • без TLS/SSL, если доступ к Sentinel по паролю не включён:

sudo redis-cli -p 26379 info sentinel
sudo redis-cli -p 26379 sentinel ckquorum mymaster

  • без TLS/SSL, если настроен доступ к Sentinel только по паролю:

sudo redis-cli -p 26379 -a SecretPassword info sentinel
sudo redis-cli -p 26379 -a SecretPassword sentinel ckquorum mymaster

  • с TLS/SSL, если доступ к Sentinel по паролю не включён:

sudo redis-cli -p 26379 -h redis-server1.your_domain --tls --cacert /path/to/ca.crt --cert /path/to/redis.crt --key /path/to/redis.key info sentinel
sudo redis-cli -p 26379 -h redis-server1.your_domain --tls --cacert /path/to/ca.crt --cert /path/to/redis.crt --key /path/to/redis.key sentinel ckquorum mymaster

  • с TLS/SSL, если настроен доступ к Sentinel только по паролю:

sudo redis-cli -p 26379 -a SecretPassword -h redis-server1.your_domain --tls --cacert /path/to/ca.crt --cert /path/to/redis.crt --key /path/to/redis.key info sentinel
sudo redis-cli -p 26379 -a SecretPassword -h redis-server1.your_domain --tls --cacert /path/to/ca.crt --cert /path/to/redis.crt --key /path/to/redis.key sentinel ckquorum mymaster

Настройка включения TLS/SSL в Sentinel

Шаг 5. Подключение к Redis

Подключитесь к Redis. Строка подключения зависит от использования TLS/SSL и настройки Sentinel:

  • без TLS/SSL, если доступ к Sentinel только по паролю не включён:

redis://:SecretPassword@redis-server1.your_domain:26379,redis-server2.your_domain:26379,redis-server3.your_domain:26379/0?masterName=mymaster

  • без TLS/SSL, если настроен доступ к Sentinel только по паролю:

redis://:SecretPassword@redis-server1.your_domain:26379,redis-server2.your_domain:26379,redis-server3.your_domain:26379/0?masterName=mymaster&sentinelUsername=default&sentinelPassword=SecretPassword

  • с TLS/SSL, если доступ к Sentinel по паролю не включён:

rediss://:SecretPassword@redis-server1.your_domain:26379,redis-server2.your_domain:26379,redis-server3.your_domain:26379/0?masterName=mymaster

  • с TLS/SSL, если настроен доступ к Sentinel только по паролю:

rediss://:SecretPassword@redis-server1.your_domain:26379,redis-server2.your_domain:26379,redis-server3.your_domain:26379/0?masterName=mymaster&sentinelUsername=default&sentinelPassword=SecretPassword