> Что такое Redis Cluster (JavaScript)

Уровень: junior · Роль: backend · Язык: JavaScript · Категория: Технические вопросы

Компании: ЭНИРАН

Стек: Node.js, Redis, JavaScript

> Пример ответа

Короткий ответ

Redis Cluster - это распределённая реализация Redis, которая автоматически шардирует данные между несколькими нодами. Он обеспечивает горизонтальное масштабирование и высокую доступность за счёт репликации и автоматического переключения при сбоях. В кластере данные разбиваются на 16384 хэш-слота, каждый из которых закреплён за определённой мастер-нодой. Клиент может обращаться к любому узлу, а при необходимости получает перенаправление на нужную ноду.

Подробное объяснение

Redis Cluster решает проблему ограничения памяти одного сервера Redis - данные распределяются по нескольким машинам. Ключевые механизмы:

  • Шардирование: все ключи хэшируются (CRC16) и попадают в один из 16384 слотов. Каждая мастер-нода отвечает за подмножество слотов.
  • Репликация: каждая мастер-нода может иметь одну или несколько реплик (слейвов), которые синхронизируются асинхронно. При падении мастера реплика становится новой мастер-нодой.
  • Обнаружение сбоев: ноды обмениваются gossip-сообщениями, чтобы определить недоступность узла. Если большинство мастеров согласны, нода помечается как PFAIL, затем FAIL.
  • Перенаправление клиента: если клиент отправляет запрос на ноду, не владеющую слотом для данного ключа, нода возвращает ошибку MOVED с адресом правильной ноды. Клиенты должны обрабатывать такие перенаправления.
  • Минимальная конфигурация: для работы кластера нужно минимум 3 мастер-ноды (рекомендуется 6 - 3 мастера + 3 реплики).

На практике

В Node.js для работы с Redis Cluster используется пакет ioredis. Он поддерживает кластер из коробки: автоматически обрабатывает MOVED-перенаправления, переподключается при сбоях и распределяет запросы по слотам.

Пример настройки:

JAVASCRIPT
const Redis = require('ioredis');
const cluster = new Redis.Cluster([
{ host: '127.0.0.1', port: 7000 },
{ host: '127.0.0.1', port: 7001 },
{ host: '127.0.0.1', port: 7002 }
]);

Важные моменты:

  • Не все команды работают в кластере (например, KEYS, MGET с ключами из разных слотов). Для cross-slot операций используйте хэш-теги {...}.
  • При падении мастера кластер перестраивается за несколько секунд, но запросы к упавшей ноде временно теряются.
  • Для мониторинга используйте CLUSTER INFO, CLUSTER NODES или внешние инструменты (RedisInsight, Prometheus).

Пример кода

JAVASCRIPT
const Redis = require('ioredis');
// Подключение к кластеру
const cluster = new Redis.Cluster([
{ host: 'localhost', port: 7000 },
{ host: 'localhost', port: 7001 },
{ host: 'localhost', port: 7002 }
], {
redisOptions: {
password: 'my-password', // если нужна аутентификация
enableReadyCheck: true
}
});
// Обычные операции
await cluster.set('user:123', JSON.stringify({ name: 'Alice' }));
const user = await cluster.get('user:123');
// Использование хэш-тегов для cross-slot операций
await cluster.mset(
'{cart:42}:item1', 'apple',
'{cart:42}:item2', 'banana'
);
const items = await cluster.mget('{cart:42}:item1', '{cart:42}:item2');
// Обработка ошибок
cluster.on('error', (err) => {
console.error('Cluster error:', err);
});
// Закрытие соединения
await cluster.quit();

Как отвечать на собеседовании

Начни с определения: Redis Cluster - это распределённая база данных в памяти, которая шардирует данные по нескольким нодам. Подчеркни, что он решает проблему ограничения памяти одного сервера и обеспечивает отказоустойчивость. Упомяни про 16384 слота и хэширование ключей. Если спросят про отличия от Sentinel, скажи: Sentinel - это только HA (high availability) для одного мастера, а Cluster - и шардирование, и HA. Для junior достаточно базового понимания: как подключаться, что такое MOVED, зачем нужны хэш-теги.

Что проверяет интервьюер

  • Понимание распределённых систем: шардирование, репликация, консенсус (gossip).
  • Умение работать с Redis Cluster в Node.js: настройка ioredis, обработка ошибок.
  • Знание ограничений: cross-slot операции, неполная поддержка команд.
  • Практический опыт: как деплоить, мониторить, восстанавливать после сбоев.

Типичные ошибки

  • Путать Redis Cluster с Redis Sentinel (Sentinel не шардирует данные).
  • Думать, что все команды Redis работают в кластере (например, KEYS, FLUSHALL не поддерживаются).
  • Игнорировать MOVED-перенаправления - клиент должен их обрабатывать, а не просто падать.
  • Использовать ключи без хэш-тегов для multi-key операций - это вызовет ошибку CROSSSLOT.
  • Не настраивать реплики - без них кластер не обеспечит высокой доступности.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью