Масштабирование Redis: Руководство по настройке кластера Redis

Узнайте, как настроить и управлять кластером Redis для обеспечения высокой доступности и горизонтального масштабирования. Это пошаговое руководство охватывает установку, настройку нескольких узлов Redis, создание кластера с использованием redis-trib.rb, добавление реплик для отказоустойчивости и основные команды управления. Обязательно к прочтению для масштабирования вашего развертывания Redis.

Масштабирование Redis: Руководство по настройке кластера Redis

Кластер Redis помогает, когда одного экземпляра Redis больше не достаточно для вашего объема данных, трафика или требований к доступности. Он шардирует ключи между несколькими первичными узлами и может повышать реплики при сбое первичного узла.

Это руководство показывает текущий рабочий процесс redis-cli --cluster, пример с шестью локальными узлами и команды управления, которые вам понадобятся после запуска кластера.

Понимание концепций кластера Redis

Кластер Redis построен на нескольких практических идеях:

  • Шардирование: Кластер Redis делит пространство ключей на 16 384 хэш-слота. Каждый первичный узел владеет диапазоном слотов, а клиенты, поддерживающие кластер, направляют команды на узел, который владеет слотом ключа.
  • Репликация: Каждый первичный узел может иметь одну или несколько реплик. Если первичный узел выходит из строя и кластер все еще может достичь кворума, реплика может быть повышена.
  • Кластерная шина: Узлы общаются друг с другом через клиентский порт и порт кластерной шины, обычно клиентский порт плюс 10000. Для порта 7000 это означает порт шины 17000.
  • Поддержка клиентов: Ваш клиент приложения должен поддерживать перенаправления кластера Redis, такие как MOVED и ASK. Клиент, не поддерживающий кластер, будет работать некорректно, когда ключи находятся на разных узлах.

Предварительные требования

Для кластера производственного уровня запланируйте как минимум шесть узлов Redis: три первичных и по одной реплике для каждого первичного. Вы можете запустить приведенный ниже пример на одной машине для практики, но производственные узлы должны быть распределены по хостам или зонам доступности.

Вам также понадобится установленный Redis, доступный redis-cli и сетевая доступность между всеми узлами как по клиентским портам Redis, так и по портам кластерной шины. По возможности используйте текущую поддерживаемую версию Redis.

Пошаговая настройка кластера Redis

В этом примере используются шесть локальных процессов Redis на портах с 7000 по 7005.

1. Установка Redis

В Debian или Ubuntu установка пакета выглядит так:

sudo apt update
sudo apt install redis-server

Версии пакетов различаются в зависимости от дистрибутива. Если вам нужна более новая версия Redis, используйте официальные пакеты Redis или управляемый сервис Redis вашей платформы.

2. Настройка экземпляров Redis для режима кластера

Создайте один каталог и один файл конфигурации для каждого процесса Redis:

mkdir cluster
cd cluster

for port in 7000 7001 7002 7003 7004 7005; do
  mkdir "$port"
  cp /etc/redis/redis.conf "$port/redis.conf"
done

Отредактируйте каждый redis.conf и установите значения, специфичные для порта. Для 7000/redis.conf используйте:

port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
bind 127.0.0.1

Повторите тот же шаблон для портов с 7001 по 7005, изменив как port, так и cluster-config-file. Файл nodes-7000.conf управляется Redis. Не редактируйте его вручную.

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

3. Запуск экземпляров Redis

Запустите каждый экземпляр с его собственной конфигурацией:

for port in 7000 7001 7002 7003 7004 7005; do
  redis-server "$port/redis.conf"
done

Если ваш менеджер пакетов уже запускает службу Redis по умолчанию на порту 6379, держите ее отдельно от этого тестового кластера или остановите на время экспериментов.

4. Создание кластера с помощью redis-cli --cluster

Используйте redis-cli --cluster create для назначения слотов и реплик:

redis-cli --cluster create \
  127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
  127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
  --cluster-replicas 1

Redis покажет предлагаемую раскладку слотов и запросит подтверждение. Введите yes, если размещение первичных узлов и реплик выглядит правильно.

5. Проверка кластера

Проверьте кластер с любого узла:

redis-cli -c -p 7000 CLUSTER INFO
redis-cli -c -p 7000 CLUSTER NODES
redis-cli --cluster check 127.0.0.1:7000

CLUSTER INFO должно показывать cluster_state:ok. Флаг -c указывает redis-cli следовать перенаправлениям кластера, что полезно при тестировании команд для ключей, принадлежащих другому узлу.

Попробуйте базовую запись и чтение:

redis-cli -c -p 7000 SET user:1 "Ада"
redis-cli -c -p 7001 GET user:1

Даже если ключ принадлежит слоту, обслуживаемому другим узлом, клиент, поддерживающий кластер, может следовать перенаправлению.

Добавление реплик в существующий кластер

Если у вас уже есть кластер и вы хотите добавить новую реплику, запустите новый экземпляр Redis с включенным режимом кластера. Затем найдите ID первичного узла:

redis-cli -p 7000 CLUSTER NODES

Добавьте новый узел как реплику этого первичного узла:

redis-cli --cluster add-node \
  127.0.0.1:7006 127.0.0.1:7000 \
  --cluster-slave \
  --cluster-master-id <id_первичного_узла>

Первый адрес — это новый узел. Второй адрес — любой доступный узел в существующем кластере. Замените <id_первичного_узла> на ID из CLUSTER NODES.

Управление кластером

Обычные задачи управления включают:

  • Проверка здоровья: redis-cli --cluster check 127.0.0.1:7000
  • Добавление первичного узла: redis-cli --cluster add-node <новый_хост:порт> <существующий_хост:порт>
  • Перераспределение слотов: redis-cli --cluster reshard <существующий_хост:порт>
  • Удаление узла: сначала переместите слоты с узла, если это первичный узел, затем выполните redis-cli --cluster del-node <существующий_хост:порт> <id_узла>
  • Тест ручного переключения при сбое: выполните CLUSTER FAILOVER с реплики, а не с первичного узла

Избегайте ручного перемещения слотов с помощью низкоуровневых команд, если вы не знаете полную последовательность миграции. Помощники redis-cli --cluster снижают вероятность оставления слотов в несогласованном состоянии.

Лучшие практики для кластера Redis

  • Используйте как минимум шесть узлов: Три первичных узла и три реплики дают кластеру возможность пережить сбой первичного узла.
  • Распределяйте реплики по доменам сбоев: Не размещайте первичный узел и его реплику на одном хосте или в одной зоне доступности, если это возможно.
  • Обеспечьте безопасность Redis: Не подвергайте Redis прямому воздействию ненадежных сетей. Используйте частные сети, правила брандмауэра, аутентификацию и TLS, где это возможно.
  • Планируйте память на первичный узел: Кластер Redis шардирует ключи, но каждый первичный узел все еще нуждается в достаточном объеме памяти для своих назначенных данных, накладных расходов и роста.
  • Используйте клиенты, поддерживающие кластер: Убедитесь, что ваша клиентская библиотека поддерживает кластер Redis, прежде чем переключать трафик.
  • Мониторьте переключение при сбое и баланс слотов: Отслеживайте память, задержки, отклоненные соединения, отставание репликации и состояние кластера.

Вывод

Для практического кластера Redis начните как минимум с трех первичных узлов и одной реплики на каждый первичный узел, создайте кластер с помощью redis-cli --cluster create и проверьте его с помощью CLUSTER INFO и redis-cli --cluster check. После этого ваша повседневная работа будет заключаться в мониторинге памяти, баланса слотов, поведения при переключении на сбой и совместимости клиентов.