Перейти к содержанию

Кластер Redis

Для корректной работы системы требуется Redis версии 6.2.12. В статье описана установка 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
  2. Создайте необходимые сопоставления имён хостов в DNS. Если такой возможности нет, внесите нужные записи в /etc/hosts.

Шаг 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.gpgecho "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
  • символы:  -_.

Зарезервированные (недопустимые) символы: ! * ' ( ) ; : @ & = + $ , / ? % # [ ]

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

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

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

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

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

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

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

    masterauth SecretPassword
    
  7. Укажите домен (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
    
  8. Укажите пароль для доступа:

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

    replicaof redis-server1.your_domain 6379
    
  10. Перезапустите все сервера (сначала Мастер, затем Слэйвы):

    sudo systemctl restart redis-server
    sudo systemctl enable redis-server
    
  11. Проверьте статус репликации на ноде redis-server1.your_domain:

    sudo redis-cli -a SecretPassword info replication
    

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

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

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

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

    bind 0.0.0.0 
    
  2. Укажите домен (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
    
  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/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
    

Шаг 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 по паролю не включён:
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