﻿# Кластер Redis

> [HTML Version](configure-redis.html)

В статье описана установка Redis 6.2.12 для ОС Ubuntu Linux 20.04 и 22.04. Перед установкой проверьте допустимые версии Redis в статье [«Системные требования ELMA365 On-Premises»](elma365-enterprise-on-premises.md#valkey). Вы также можете ознакомиться с руководством в [официальной документации Redis](https://redis.io/docs/management/sentinel/).

````
начало внимание

````
В связи с изменением лицензионной политики Redis рекомендуем устанавливать Valkey в качестве альтернативного решения. Подробнее об установке читайте в статье [«Кластер Valkey»](valkey-cluster.md).

````
конец внимание

````
Развёртывание кластера Redis включает этапы:

1. [Подготовка нод (серверов)](#preparation-node).

2. [Установка Redis и Sentinel](#installation).

3. [Настройка Redis](#redis-setup).

4. [Настройка Sentinel](#sentinel-setup).

5. [Подключение к Redis](#connection-to-redis).

## Шаг 1. Подготовка нод (серверов)

````
начало внимание

````
Минимальное количество серверов для организации кластера — три.

````
конец внимание

1. ````
Создайте три ноды (сервера) с последовательно пронумерованными именами хостов:

- **redis-server1.your\_domain**;

- **redis-server2.your\_domain**;

- **redis-server3.your\_domain**.

2. Создайте необходимые сопоставления имён хостов в DNS. Если такой возможности нет, внесите нужные записи в \[OBJECT\].

## Шаг 2. Установка Redis и Sentinel

1. Установите необходимые пакеты:

````
sudo apt install lsb-release curl gpg

2. ````
Импортируйте необходимые ключи и добавьте репозиторий 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

3. ````
Обновите кеш пакетов:

````
sudo apt-get update

4. ````
Установите 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;

- символы:  -\_.

Зарезервированные (недопустимые) символы:

\! \* ' ( ) ; : @ \& = + \$ , / ? % # \[ \]

````
конец примечание

````
Для настройки отредактируйте файл \[OBJECT\] на каждом из серверов:

````
sudo nano /etc/redis/redis.conf

1. ````
Сделайте сервера доступными для всех IP-адресов данного сервера. Это делает сервис Redis доступным со всех внешних адресов:

````
bind 0.0.0.0 

2. ````
Увеличьте максимальное количество клиентов, изменив значение параметра \[OBJECT\] на \[OBJECT\]. Раскомментируйте строку, убрав знак решетки #:

````
maxclients 20000

3. ````
Задайте политику вытеснения ключей, изменив значение параметра \[OBJECT\] на \[OBJECT\]. Раскомментируйте строку, убрав знак решетки #:

````
maxmemory-policy allkeys-lfu

4. ````
Отключите создание **snapshots**, изменив значение параметра \[OBJECT\] на \[OBJECT\]. Раскомментируйте строку, убрав знак решетки #:

````
save ""

5. ````
Отключите **AOF** (сохранение базы данных Redis в файл). Для этого замените значение параметра \[OBJECT\] на \[OBJECT\]. Раскомментируйте строку, убрав знак решетки #:

````
appendonly no

6. ````
Укажите пароль к мастеру:

````
masterauth SecretPassword

7. ````
Укажите домен (FQDN) для представления ноды в кластере:

- на ноде \[OBJECT\]:

````
replica-announce-ip redis-server1.your\_domain

- ````
на ноде \[OBJECT\]:

````
replica-announce-ip redis-server2.your\_domain

- ````
на ноде \[OBJECT\]:

````
replica-announce-ip redis-server3.your\_domain

8. ````
Укажите пароль для доступа:

````
requirepass SecretPassword

9. ````
На нодах \[OBJECT\] и** **\[OBJECT\] укажите домен (FQDN) и порт для подключения к ноде Мастера (\[OBJECT\]):

````
replicaof redis-server1.your\_domain 6379

10. ````
Перезапустите все сервера (сначала мастер, затем слейвы):

````
sudo systemctl restart redis-server  
sudo systemctl enable redis-server

11. ````
Проверьте статус репликации на ноде \[OBJECT\]:

````
sudo redis-cli -a SecretPassword info replication

````
Если не возникло ошибки, настройки проведена успешно. 

Настройка включения TLS в Redis

  
Для включения поддержки TLS в Redis необходимо в файле конфигурации \[OBJECT\]:

1. Отключить незащищённые подключения, выставив \[OBJECT\] в параметре \[OBJECT\]. 

2. Задать порт для TLS подключений, расскоментировав параметр \[OBJECT\].

3. В параметре \[OBJECT\] указать путь до файла сертификата сервера.

4. В параметре \[OBJECT\] указать путь до файла закрытого ключа.

5. В параметре \[OBJECT\] указать путь до файла корневого CA.

````
port 0  
tls-port 6379  
tls-cert-file /path/to/redis.crt  
tls-key-file /path/to/redis.key  
tls-ca-cert-file /path/to/ca.crt

6. ````
Перезапустить все сервера (сначала мастер, затем слейвы):

````
sudo systemctl restart redis-server  
sudo systemctl enable redis-server

7. ````
Проверить статус репликации на ноде \[OBJECT\]:

````
sudo redis-cli -p 6379 -h redis-server1.your\_domain --tls --cacert /path/to/ca.crt --cert /path/to/redis.crt --key /path/to/redis.key -a SecretPassword info replication

````
  
Подробнее о настройке TLS в Redis читайте в [официальной документации Redis](https://redis.io/docs/management/security/encryption/).

## Шаг 4. Настройка Sentinel

Чтобы настроить Sentinel, отредактируйте файл \[OBJECT\] на каждом из серверов.

````
Начало внимание````
 

Для корректной работы соблюдайте указанный порядок записей в файле \[OBJECT\].

````
Конец внимание

1. ````
Сделайте сервера доступными для всех IP-адресов данного сервера. Это делает сервис Sentinel доступным со всех внешних адресов:

````
bind 0.0.0.0 

2. ````
Укажите домен (FQDN) для представления нод Sentinel:

- на ноде \[OBJECT\]:

````
sentinel announce-ip redis-server1.your\_domain

- ````
на ноде** **\[OBJECT\]:

````
sentinel announce-ip redis-server2.your\_domain

- ````
на ноде \[OBJECT\]:

````
sentinel announce-ip redis-server3.your\_domain

3. ````
Укажите домен (FQDN) и порт мастера, а также значение для достижения кворума:

````
sentinel monitor mymaster redis-server1.your\_domain 6379 2

4. ````
Укажите пароль для доступа к мастеру:

````
sentinel auth-pass mymaster SecretPassword

5. ````
Укажите время, после которого мастер будет считаться упавшим:

````
sentinel down-after-milliseconds mymaster 3000

6. ````
Укажите время ожидания после смены ролей слейва на мастер в случае, если мастер вышел из строя:

````
sentinel failover-timeout mymaster 6000

7. ````
Включите поддержку разрешения имён хостов:

````
sentinel resolve-hostnames yes  
sentinel announce-hostnames yes

8. ````
Для повышения безопасности настройте для пользователя **default** доступ к Sentinel только по паролю:

````
user default on >SecretPassword sanitize-payload ~\* \&\* +@all

9. ````
После этого перезапустите все сервера:

````
sudo systemctl restart redis-sentinel  
sudo systemctl enable redis-sentinel

10. ````
Проверьте статус Sentinel и состояние кворума на ноде **redis-server1.your\_domain**, используя разные команды в зависимости от использования TLS и настройки Sentinel:

- без TLS, если доступ к Sentinel по паролю не включён:

````
sudo redis-cli -p 26379 info sentinel  
sudo redis-cli -p 26379 sentinel ckquorum mymaster

- ````
без TLS, если настроен доступ к Sentinel только по паролю:

````
sudo redis-cli -p 26379 -a SecretPassword info sentinel  
sudo redis-cli -p 26379 -a SecretPassword sentinel ckquorum mymaster

- ````
с TLS, если доступ к 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, если настроен доступ к 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 в Sentinel

  
Для включения поддержки TLS в Sentinel необходимо в файле конфигурации \[OBJECT\]:

1. Отключить незащищённые подключения, выставив \[OBJECT\] в параметре \[OBJECT\]. 

2. Задать порт для TLS подключений, добавив параметр \[OBJECT\].

3. Добавить параметр \[OBJECT\] и указать в нём путь до файла сертификата сервера.

4. Добавить параметр \[OBJECT\] и указать в нём путь до файла закрытого ключа.

5. Добавить параметр \[OBJECT\] и указать в нём путь до файла корневого CA.

6. Добавить параметр \[OBJECT\] и включить поддержку TLS, указав значение \[OBJECT\].

````
port 0  
tls-port 26379  
tls-cert-file /path/to/redis.crt  
tls-key-file /path/to/redis.key  
tls-ca-cert-file /path/to/ca.crt  
tls-replication yes

7. ````
После этого перезапустить все сервера:

````
sudo systemctl restart redis-sentinel  
sudo systemctl enable redis-sentinel

8. ````
Проверить статус Sentinel и состояние кворума на ноде \[OBJECT\]:

````
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 в Sentinel читайте в [официальной документации Redis](https://redis.io/docs/management/security/encryption/#sentinel).

## Шаг 5. Подключение к Redis

Подключитесь к Redis. Строка подключения зависит от использования TLS и настройки Sentinel:

- без TLS, если доступ к Sentinel только по паролю не включён:

````
redis://:SecretPassword@redis-server1.your\_domain:26379,redis-server2.your\_domain:26379,redis-server3.your\_domain:26379/0?masterName=mymaster

- ````
без TLS, если настроен доступ к 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, если доступ к Sentinel по паролю не включён:

````
rediss://:SecretPassword@redis-server1.your\_domain:26379,redis-server2.your\_domain:26379,redis-server3.your\_domain:26379/0?masterName=mymaster

- ````
с TLS, если настроен доступ к 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
````