Кластер Redis – это встроенная функция Redis, которая поддерживает автоматическое шардирование, репликацию и высокую доступность, которая ранее реализовывалась с помощью Сентинелей. Он разработан для двух основных целей: автоматического разделения вашего набора данных между несколькими экземплярами и обеспечения определенной степени доступности во время разделения для продолжения операций, когда некоторые экземпляры (особенно мастера) выходят из строя или не могут связаться с большинством узлов в кластере.
Однако кластер прекращает свою работу в случае крупных отказов (например, когда большинство мастер-экземпляров недоступны). Кроме того, если мастер и его слейв выходят из строя одновременно, кластер не может продолжать нормальную работу (хотя обходным путем является добавление дополнительных узлов или создание асимметрии в кластере для автоматического изменения конфигурации кластера).
Согласно документации кластера Redis, “минимальный кластер”, который работает как ожидается, должен содержать как минимум 3 мастер-узла. Но наиболее подходящая настройка для обеспечения высокой доступности должна иметь как минимум 6 узлов с тремя мастерами и тремя слейвами, каждый мастер имеет своего слейва.
Важно: Кластер Redis также имеет некоторые ограничения, такие как отсутствие поддержки для сред с NAT-трансляцией, а также сред, где IP-адреса или TCP-порты отображаются, например, в Docker. Кроме того, не каждая клиентская библиотека его поддерживает.
Эта статья показывает, как настроить Redis кластер (с отключенным режимом кластера) в CentOS 8. Она включает в себя установку Redis, настройку узлов кластера, создание кластера и тестирование отказоустойчивости кластера.
Примечание: Для этого руководства мы будем использовать свежие/пустые экземпляры Redis для запуска режима кластера. Режим кластера не будет работать с некоторыми конфигурациями, выполненными в первых двух руководствах нашей серии Redis, особенно это не работает, когда используется параметр replica.
Предварительные требования:
Настройка тестовой среды
Redis Master1: 10.42.0.247 Redis Master2: 10.42.0.197 Redis Master3: 10.42.0.132 Redis Slave1: 10.42.0.200 Redis Slave2: 10.42.0.21 Redis Slave3: 10.42.0.34

Наша настройка имеет 3 узла-мастера для чтения/записи и 3 узла-реплики только для чтения, каждый мастер имеет одну реплику, таким образом, три шарда содержат все данные кластера в каждом узле. Приложение API или CLI клиент может писать только на узлы-мастеры, но читать с любого узла в кластере.
Шаг 1: Установка Redis на всех узлах
1. Войдите во все экземпляры через SSH, затем выполните следующую команду для установки модуля Redis с использованием менеджера пакетов DNF, как показано.
# dnf module install redis
2. Затем запустите службу Redis, включите её для автоматического запуска при загрузке системы и проверьте её состояние, чтобы убедиться, что она работает (проверьте службу на всех 6 экземплярах):
# systemctl start redis # systemctl enable redis # systemctl status redis
Шаг 2: Настройка экземпляров Redis на всех узлах
3. В этом разделе описано, как настроить узлы кластера Redis. Помните, что выполните настройки здесь на всех узлах.
Используйте файл конфигурации /etc/redis.conf, чтобы настроить сервер Redis. Как рекомендуемая практика, создайте резервную копию оригинального файла перед его редактированием с использованием текстового редактора командной строки на ваш выбор.
# cp /etc/redis.conf /etc/redis.conf.orig # vi /etc/redis.conf
4. Затем найдите следующие параметры конфигурации и отредактируйте их значения, как показано. Параметр bind устанавливает интерфейс, на котором будет слушать сервер Redis, установите его значение на LAN-IP экземпляра. Удалите 127.0.0.1, потому что мы поняли, что его наличие замедляет процесс создания кластера, особенно этап присоединения к кластеру.
bind 10.42.0.247
Затем установите protected-mode
в no
, чтобы разрешить подключения с других экземпляров в кластере.
protected-mode no
Параметр порта определяет порт, на котором сервер Redis будет слушать подключения, по умолчанию – 6379. Это порт данных для взаимодействия с клиентами.
port 6379

5. Следующий набор параметров активирует режим кластера и устанавливает некоторые его полезные функции. Параметр cluster-enabled, когда установлен в yes
, активирует режим кластера.
cluster-enabled yes
Затем параметр cluster-config-file устанавливает имя файла конфигурации кластера узла кластера (например, nodes-6379.conf). Файл создается в рабочем каталоге (по умолчанию /var/lib/redis, определенном с помощью параметра dir) и не подлежит редактированию пользователем.
cluster-config-file nodes-6379.conf
Следующая полезная опция кластера – cluster-node-timeout, используется для установки максимального времени в миллисекундах, в течение которого экземпляр может быть недоступен, чтобы считаться в состоянии отказа. Значение 15000 эквивалентно 15 секундам.
cluster-node-timeout 15000

6. Также нам нужно включить постоянство Redis на диске. Мы можем использовать один из режимов постоянства, это Append Only File (AOF): он регистрирует (в файле appendonly.aof, созданном в рабочем каталоге) каждую операцию записи, успешно принятую сервером. Данные будут воспроизведены при запуске сервера для восстановления исходного набора данных.
Чтобы включить его, установите параметр appendonly в yes
.
appendonly yes

7. После внесения всех изменений перезапустите службу Redis на всех узлах, чтобы применить последние изменения.
# systemctl restart redis
8. На данный момент каждый узел кластера должен иметь ID. Вы можете проверить это в файле журнала, расположенном по адресу /var/log/redis/redis.log.
# cat /var/log/redis/redis.log

9. Затем откройте порт 6397 и 16379 на всех экземплярах. Последний порт используется для шины кластера (канал связи между узлами с использованием двоичного протокола). Это базовое требование для TCP-соединений кластера Redis.
# firewall-cmd --zone=public --permanent --add-port=6379/tcp # firewall-cmd --zone=public --permanent --add-port=16379/tcp # firewall-cmd --reload
Шаг 3: Создание кластера Redis
10. Чтобы создать кластер, используйте клиент командной строки redis-cli следующим образом. Параметр --cluster create
включает создание кластера, а --cluster-replicas 1
означает создание одного репликата на мастер.
Для нашей настройки, которая имеет 6 узлов, у нас будет 3 мастера и 3 слейва.
Обратите внимание, что первые 6 узлов будут считаться мастерами (M)
, а следующие три будут считаться слейвами (S)
. Первый слейв, т.е. 10.42.0.200:6379, реплицирует первого мастера, т.е. 10.42.0.247:6379, второй слейв реплицирует второго мастера и так далее.
Следующая команда отформатирована таким образом, чтобы результат соответствовал нашей логической установке выше.
# redis-cli --cluster create 10.42.0.247:6379 10.42.0.197:6379 10.42.0.132:6379 10.42.0.200:6379 10.42.0.21:6379 10.42.0.34:6379 --cluster-replicas 1

11. После успешного создания кластера выполните следующую команду на любом хосте (указав его IP-адрес с помощью флага -h
), чтобы перечислить все узлы кластера.
# redis-cli -h 10.42.0.247 -p 6379 cluster nodes
Вы должны увидеть все узлы кластера, где слейвы указывают своих мастеров, как показано на следующем скриншоте.

Различные поля идут в следующем порядке: идентификатор узла, IP-адрес:порт, флаги, время последнего пинга, время последнего понга, конфигурационная эпоха, состояние связи, слоты (для мастеров).
Шаг 4: Тестирование отказоустойчивости кластера Redis
12. В этом разделе мы продемонстрируем, как провести тестирование отказоустойчивости кластера. Сначала давайте запомним мастеров.
# redis-cli -h 10.42.0.247 -p 6379 cluster nodes | grep master

Также запомним слейвы Redis.
# redis-cli -h 10.42.0.247 -p 6379 cluster nodes | grep slave

13. Затем давайте остановим службу Redis на одном из мастер-узлов, например, 10.42.0.197, и проверим все мастер-узлы в кластере.
# systemctl stop redis # redis-cli -h 10.42.0.247 -p 6379 cluster nodes | grep master
На следующем скриншоте вы можете видеть, что узел 10.42.0.197:6367 находится в состоянии отказа, и его слейв 10.42.0.21:6379 был повышен до статуса мастера.

14. Теперь давайте снова запустим службу Redis на отказавшем узле и проверим все мастера в кластере.
# systemctl start redis # redis-cli -h 10.42.0.247 -p 6379 cluster nodes | grep master

Также проверим слейвы кластера, чтобы убедиться, что отказавший мастер теперь является слейвом.
# redis-cli -h 10.42.0.247 -p 6379 cluster nodes | grep slave

Шаг 5: Тестирование репликации данных по кластеру Redis
15. Этот последний раздел объясняет, как проверить репликацию данных кластера. Мы создадим ключ и значение на одном из мастеров, затем попробуем прочитать их со всех узлов кластера следующим образом. Используйте переключатель -c
, чтобы включить поддержку кластера в утилите redis-cli и получить доступ к данным в режиме кластера.
# redis-cli -c -h 10.42.0.247 -p 6379 set name 'TecMint.com' # redis-cli -c -h 10.42.0.247 -p 6379 get name # redis-cli -c -h 10.42.0.21 -p 6379 get name # redis-cli -c -h 10.42.0.132 -p 6379 get name # redis-cli -c -h 10.42.0.200 -p 6379 get name # redis-cli -c -h 10.42.0.197 -p 6379 get name # redis-cli -c -h 10.42.0.34 -p 6379 get name

Суть в том, что Кластер Redis предпочтительный способ получения автоматического шардинга, репликации и высокой доступности. В остальной части файла /etc/redis.conf есть множество других хорошо задокументированных параметров конфигурации, более подробную информацию можно найти в официальной документации: Руководство по кластеру Redis и Спецификация кластера Redis.
Это завершает наш трехчастный сериал уроков Redis. Ниже приведена форма обратной связи, которую можно использовать для задания вопросов или комментариев.
Source:
https://www.tecmint.com/setup-redis-cluster-in-centos-8/