Открыть сервис

Redis Cluster

Redis Cluster — это распределённая реализация СУБД Redis, обеспечивающая автоматическое шардирование данных, высокую доступность и горизонтальное масштабирование за счёт децентрализованной архитектуры без единой точки отказа. В отличие от классического одноузлового Redis, кластер позволяет хранить объёмы данных, превышающие оперативную память одного сервера, и обрабатывать запросы при отказе отдельных узлов.

Архитектура и принципы работы

Redis Cluster построен на основе децентрализованной топологии «каждый с каждым» (full mesh). Все узлы кластера обмениваются информацией через протокол gossip, что исключает необходимость в центральном координаторе. Кластер использует следующие ключевые механизмы:

Шардирование данных

Данные распределяются по 16384 хеш-слотам (hash slots). Каждому ключу ставится в соответствие один из слотов на основе CRC16-хеша от имени ключа, по модулю 16384. Слоты равномерно распределяются между мастер-узлами кластера. Например, в кластере из трёх мастеров каждый может обслуживать примерно по 5461 слоту.

При добавлении или удалении узла слоты перераспределяются между ними. Этот процесс называется решардингом (resharding) и может выполняться без остановки обслуживания. Клиентские библиотеки перенаправляют запросы на новые узлы автоматически.

Высокая доступность

Для обеспечения отказоустойчивости каждый мастер-узел может иметь от одного до нескольких реплик (replica nodes). Реплики являются точными копиями мастера и синхронизируются асинхронно. Если мастер становится недоступным (потеря связи, выход из строя), реплика автоматически повышается до мастера по решению кластерного консенсуса.

Процесс выбора нового мастера (failover) инициируется, когда большинство мастеров в кластере подтверждают недоступность узла. Реплика с наилучшим состоянием данных (наибольший replication offset) становится новым мастером. Время переключения обычно составляет несколько секунд.

Gossip-протокол

Узлы кластера постоянно обмениваются сообщениями о своём состоянии (ping/pong) через порт, смещённый на 10000 от порта данных (например, 16379 для порта данных 6379). Gossip-протокол позволяет каждому узлу знать топологию кластера, состояние других узлов и распределение слотов. Это обеспечивает децентрализованное обнаружение отказов и обновление конфигурации.

Классификация узлов

В Redis Cluster выделяют несколько ролей узлов:

  • Мастер (master) — основной узел, обслуживающий запросы на чтение и запись для своего набора слотов. Каждый слот обслуживается ровно одним мастером.
  • Реплика (replica) — резервный узел, синхронизирующий данные с мастером. Может обслуживать запросы на чтение (если настроено), но не участвует в записи.
  • Наблюдатель (sentinel) — в контексте Redis Cluster не используется; Sentinel — отдельный компонент для мониторинга и отказоустойчивости классического Redis. В кластере роль Sentinel выполняет сам кластер.

Установка и конфигурация

Для развёртывания Redis Cluster требуется не менее трёх мастер-узлов (минимальная конфигурация для отказоустойчивости). Каждый узел запускается с включённым режимом кластера в конфигурационном файле:

`` cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 ``

После запуска всех узлов кластер инициализируется с помощью утилиты redis-cli --cluster create или через API команд CLUSTER MEET, CLUSTER ADDSLOTS. Пример создания кластера из трёх мастеров и трёх реплик:

``bash redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 \ --cluster-replicas 1 ``

Клиентская поддержка

Клиентские библиотеки для работы с Redis Cluster должны реализовывать протокол перенаправления запросов. Основные механизмы:

  • MOVED — постоянное перенаправление: клиент получает сообщение, что слот переехал на другой узел. Клиент кеширует новую карту слотов.
  • ASK — временное перенаправление: используется во время миграции слотов. Клиент должен повторить запрос на указанном узле с флагом ASKING.
  • CLUSTER SLOTS — команда для получения полной карты распределения слотов от любого узла.

Популярные клиенты (redis-py, ioredis, Jedis) поддерживают кластерный режим автоматически.

Применение

Redis Cluster применяется в системах, требующих высокой пропускной способности и отказоустойчивости:

  • Кеширование — распределение данных между узлами позволяет кешировать объёмы, превышающие память одного сервера.
  • Сессии пользователей — кластер обеспечивает доступность сессий при отказе отдельных узлов.
  • Очереди сообщений — использование списков (list) и потоков (stream) в распределённом режиме.
  • Реальные приложения — игровые лидерборды, аналитика в реальном времени, рекомендательные системы.

Ограничения и особенности

  • Транзакции — поддерживаются только в пределах одного слота (ключа). Мультиключевые транзакции с ключами из разных слотов не выполняются.
  • Lua-скрипты — аналогично, скрипты могут работать только с ключами, принадлежащими одному слоту.
  • Асинхронная репликация — возможна потеря данных при отказе мастера до синхронизации с репликой (окно потери — несколько миллисекунд).
  • Сложность управления — требуется мониторинг состояния слотов, решардинг, настройка времени таймаута.
  • Не поддерживает — команды MIGRATE, SORT (в некоторых режимах), KEYS (сканирование всех ключей неэффективно).

Интересные факты

  • Размер хеш-слота (16384) выбран как компромисс между производительностью вычисления CRC16 и количеством узлов в кластере (рекомендуется до 1000 узлов).
  • Redis Cluster не использует распределённый консенсус (Raft, Paxos) — failover основан на gossip-протоколе и голосовании мастеров.
  • Первая стабильная версия Redis Cluster появилась в версии 3.0 (2015 год).
  • Для миграции данных между кластерами используется утилита redis-cli --cluster import.

Источники

  • Официальная документация Redis Cluster (redis.io/docs/latest/operate/oss_and_stack/management/scaling/)
  • Redis in Action (Josiah L. Carlson, 2013)
  • Redis Cluster Specification (antirez.com/news/49)
  • Документация Redis 7.0 (redis.io/docs/latest/)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →