Відзначимо: коли 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. Звертайтеся — допоможемо масштабувати ваш кеш.







