Настройка Redis Cluster для масштабирования

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Настройка Redis Cluster для масштабирования
Сложная
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Настройка Redis Cluster для масштабирования

Одиночный Redis ограничен RAM одного сервера и пропускной способностью одного CPU ядра (Redis однопоточный для операций над данными). Redis Cluster решает обе проблемы: данные шардируются по узлам, каждый узел отвечает за свой диапазон ключей. 6 узлов (3 master + 3 replica) — минимальная конфигурация кластера.

Как работает шардирование

Redis Cluster делит пространство ключей на 16 384 хэш-слота. Каждый мастер-узел отвечает за диапазон слотов. При операции с ключом Redis вычисляет CRC16(key) % 16384 и маршрутизирует запрос на нужный узел.

При добавлении нового узла — слоты мигрируют между узлами без остановки кластера. Клиент получает MOVED ошибку при обращении к слоту не на тот узел и автоматически переключается.

Установка 6-узлового кластера

Конфигурация 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

# Репликация
replica-lazy-flush no
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no

# Производительность
tcp-backlog 511
hz 10
aof-rewrite-incremental-fsync yes

Запуск 6 инстансов (порты 7001–7006):

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-replicas 1 — одна реплика на каждый мастер. Redis автоматически распределяет: 3 мастера (7001, 7002, 7003) и 3 реплики (7004, 7005, 7006).

Docker Compose для разработки

version: '3'
services:
  redis-cluster:
    image: grokzen/redis-cluster:7.0.10
    ports:
      - "7001-7006:7001-7006"
    environment:
      IP: 127.0.0.1
      INITIAL_PORT: 7001
      MASTERS: 3
      SLAVES_PER_MASTER: 1
      MAX_MEMORY: 256mb
      MAX_MEMORY_POLICY: allkeys-lru

Ограничения Cluster: хэш-теги

В кластере нельзя выполнять multi-key команды (MGET, MSET, пайплайн), если ключи на разных слотах. Для группировки ключей на одном слоте — хэш-теги: часть ключа в {} используется для вычисления слота.

# Эти ключи попадут на разные слоты — MGET не работает
MGET user:1:profile user:2:profile

# С хэш-тегом {user:1} — оба на одном слоте
SET {user:1}:profile "..."
SET {user:1}:settings "..."
MGET {user:1}:profile {user:1}:settings  # OK

В Laravel — настройка хэш-тегов для транзакций:

// Убедиться что ключи с {user:1} сегментом попадут на один слот
Cache::tags(["user:{$userId}"])->put("profile", $data, 3600);
Cache::tags(["user:{$userId}"])->put("settings", $data, 3600);
Cache::tags(["user:{$userId}"])->flush();

Подключение клиентов к кластеру

PHP с phpredis:

$redis = new RedisCluster(null, [
    '127.0.0.1:7001',
    '127.0.0.1:7002',
    '127.0.0.1:7003',
], 1.5, 1.5, true, 'ClusterPassword123');

// phpredis автоматически маршрутизирует по слотам
$redis->set('key', 'value');
$redis->get('key');

Predis:

use Predis\Client;

$client = new Client(
    [
        'tcp://127.0.0.1:7001?password=ClusterPassword123',
        'tcp://127.0.0.1:7002?password=ClusterPassword123',
        'tcp://127.0.0.1:7003?password=ClusterPassword123',
    ],
    ['cluster' => 'redis']
);

Laravel config/database.php:

'redis' => [
    'client' => 'phpredis',
    'options' => [
        'cluster' => 'redis',
        'prefix' => '',
        'parameters' => ['password' => env('REDIS_PASSWORD')],
    ],
    'clusters' => [
        'default' => [
            ['host' => '127.0.0.1', 'port' => 7001, 'password' => env('REDIS_PASSWORD')],
            ['host' => '127.0.0.1', 'port' => 7002, 'password' => env('REDIS_PASSWORD')],
            ['host' => '127.0.0.1', 'port' => 7003, 'password' => env('REDIS_PASSWORD')],
        ],
    ],
],

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

# Статус кластера
redis-cli -c -p 7001 -a ClusterPassword123 cluster info

# Узлы и их роли
redis-cli -c -p 7001 -a ClusterPassword123 cluster nodes

# Проверка распределения слотов
redis-cli --cluster check 127.0.0.1:7001 -a ClusterPassword123

# Добавление нового мастер-узла
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 -a ClusterPassword123

# Перераспределение слотов на новый узел
redis-cli --cluster reshard 127.0.0.1:7001 -a ClusterPassword123

# Добавление реплики к новому узлу
redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 \
  --cluster-slave --cluster-master-id <master-node-id> \
  -a ClusterPassword123

Failover

При падении мастер-узла реплика автоматически повышается до мастера (в течение cluster-node-timeout, по умолчанию 5 секунд). Приложение получает CLUSTERDOWN ошибку в течение этого времени — нужно предусмотреть retry логику.

// Retry при CLUSTERDOWN
$attempts = 0;
while ($attempts < 3) {
    try {
        $result = $redis->get($key);
        break;
    } catch (\RedisClusterException $e) {
        if (++$attempts >= 3) throw $e;
        usleep(500000); // 500ms
    }
}

Мониторинг

# Метрики каждого узла
for port in 7001 7002 7003 7004 7005 7006; do
    echo "=== Node $port ==="
    redis-cli -p $port -a ClusterPassword123 INFO replication | grep -E "role|master_host|connected_slaves"
done

Prometheus redis_exporter умеет собирать метрики кластера — указывать только один из узлов, он сам обойдёт остальные через cluster nodes.

Сроки

Развёртывание Redis Cluster из 6 узлов с настройкой, тестированием failover и мониторингом — 2–3 рабочих дня. Адаптация существующего приложения под cluster (хэш-теги, кластерный клиент, обработка MOVED/ASK ошибок) — 1–2 дня в зависимости от сложности использования Redis в коде.