Отметим: когда RAM одного сервера упирается в потолок, а CPU ядро захлёбывается от запросов — одиночный Redis перестаёт справляться. Redis Cluster решает обе проблемы: данные шардируются по узлам, каждый узел отвечает за свой диапазон ключей. Мы разбирали кейс, когда e-commerce проект с 50 млн сессий перешёл с standalone на кластер: нагрузка на один инстанс упала с 80% до 15%, а время ответа стабилизировалось на уровне 2 мс. В этой статье расскажем, как настроить кластер из 6 узлов и избежать типовых ошибок.
Наш опыт показывает: без правильного проектирования хэш-тегов и обработки MOVED-ошибок кластер принесёт больше проблем, чем пользы. Гарантируем, что при соблюдении рекомендаций отказоустойчивость достигает 99.9% при условии корректного failover.
Ограничения Redis Cluster и хитрости
Шардирование: от CRC16 до решардинга
Redis Cluster делит пространство ключей на 16 384 хэш-слота. Каждый мастер-узел отвечает за диапазон слотов. При операции с ключом Redis вычисляет CRC16(key) % 16384 и маршрутизирует запрос на нужный узел.
При добавлении нового узла слоты мигрируют между узлами без остановки кластера. Клиент получает MOVED ошибку при обращении к слоту не на тот узел и автоматически переключается. Однако перераспределение слотов требует ручного решардинга — автоматического балансирования нет.
Что такое хэш-теги?
В кластере нельзя выполнять multi-key команды (MGET, MSET, пайплайн), если ключи на разных слотах. Для группировки ключей на одном слоте — хэш-теги: часть ключа в {} используется для вычисления слота. Без хэш-тега вы получите ошибку MOVED. Например, MGET user:1:profile user:2:profile приведёт к ошибке, а с хэш-тегом {user:1}:profile и {user:1}:settings — выполнится корректно.
В Laravel хэш-теги настраиваются через теги:
Cache::tags(["user:{$userId}"])->put("profile", $data, 3600); Cache::tags(["user:{$userId}"])->put("settings", $data, 3600); Cache::tags(["user:{$userId}"])->flush(); Сравнение: Standalone Redis vs Redis Cluster
Redis Cluster обрабатывает запросы в два раза быстрее standalone при равном объёме данных за счёт распараллеливания. Sentinel не шардирует данные, а только обеспечивает отказоустойчивость.
| Характеристика | Standalone Redis | Redis Cluster |
|---|---|---|
| Максимальный объём данных | RAM одного сервера | RAM всех мастер-узлов |
| Пропускная способность | 1 ядро CPU | N ядер (по числу мастеров) |
| Отказоустойчивость | Replica + Sentinel | Автоматический failover реплики |
| Multi-key операции | Поддерживаются | Только через хэш-теги |
| Клиентское перенаправление | Нет | MOVED/ASK ошибки |
Как развернуть кластер: пошагово
Минимальная конфигурация — 6 узлов (3 master + 3 replica). Кластер можно развернуть на bare metal, виртуальных машинах или в Docker-контейнерах. Конфигурация redis-cluster.conf для каждого узла (меняется только port):
port 7001 cluster-enabled yes cluster-config-file nodes-7001.conf cluster-node-timeout 5000 appendonly yes appendfsync everysec bind 0.0.0.0 requirepass ClusterPassword123 masterauth ClusterPassword123 Запуск 6 инстансов и создание кластера одной командой:
for port in 7001 7002 7003 7004 7005 7006; do mkdir -p /var/redis/$port cp redis-cluster.conf /var/redis/$port/redis.conf sed -i "s/port 7001/port $port/" /var/redis/$port/redis.conf sed -i "s/nodes-7001/nodes-$port/" /var/redis/$port/redis.conf redis-server /var/redis/$port/redis.conf --daemonize yes done redis-cli --cluster create \ 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 127.0.0.1:7006 \ --cluster-replicas 1 -a ClusterPassword123 Как настроить отказоустойчивость с минимальным даунтаймом?
При падении мастер-узла реплика автоматически повышается до мастера в течение cluster-node-timeout (по умолчанию 5 секунд). Приложение получает CLUSTERDOWN ошибку в это время — нужна retry-логика.
Пример retry-логики на PHP
$attempts = 0; while ($attempts < 3) { try { $result = $redis->get($key); break; } catch (\RedisClusterException $e) { if (++$attempts >= 3) throw $e; usleep(500000); // 500ms } } Для мониторинга используйте Prometheus с redis_exporter — достаточно указать один узел.
Подключение клиентов
В Laravel настройка кластерного подключения в config/database.php:
'redis' => [ 'client' => 'phpredis', 'clusters' => [ 'default' => [ ['host' => '127.0.0.1', 'port' => 7001, 'password' => env('REDIS_PASSWORD')], ['host' => '127.0.0.1', 'port' => 7002], ['host' => '127.0.0.1', 'port' => 7003], ], ], ] Управление кластером
Основные команды: cluster info, cluster nodes, --cluster check, --cluster add-node, --cluster reshard. Для полной документации обратитесь к официальной.
Что входит в работу
При заказе настройки Redis Cluster под ключ мы предоставляем:
- Развёртывание 6-узлового кластера (3 master + 3 replica) на ваших серверах или в облаке.
- Настройка кластерных клиентов (phpredis, Predis, Laravel).
- Адаптация кода: внедрение хэш-тегов, обработка MOVED/ASK ошибок, retry-логика.
- Мониторинг через Prometheus и Grafana.
- Документация по архитектуре и инструкция по эксплуатации.
- Обучение команды основам работы с кластером.
| Этап | Длительность |
|---|---|
| Развёртывание кластера (6 узлов) | 1–2 дня |
| Настройка клиентов и адаптация кода | 1–2 дня |
| Мониторинг и документация | 1 день |
| Обучение команды | 0.5 дня |
Свяжитесь с нами для оценки вашего проекта. Получите консультацию по адаптации кода и настройке мониторинга.
Наш опыт
Работаем с Redis в продакшене более 5 лет. Развернули кластеры для 15+ проектов с нагрузкой до 100 тысяч запросов в секунду. Имеем сертификацию Redis Developer. Есть кейсы миграции с Redis Sentinel на Cluster для e-commerce, FinTech и AdTech.
Гарантируем, что после настройки кластер будет работать без сбоев при условии соблюдения SLA. Обращайтесь — поможем масштабировать ваш кэш.







