Что такое Redis Cluster
Что проверяют
Отличаете ли вы репликацию от настоящего шардирования и знаете ли ограничения, которые кластер накладывает на прикладной код. Для Node.js важна ещё и работа с клиентом: обычное подключение к узлу кластера не годится.
Как отвечать
Redis Cluster это режим, в котором несколько мастер-узлов делят между собой пространство ключей. Имя ключа отображается в один из 16384 слотов по контрольной сумме, слоты распределены по узлам, у мастера могут быть реплики. Клиент держит карту слотов и ходит сразу в нужный узел, а при переезде слота получает ответ MOVED или ASK и карту обновляет.
Что это даёт: памяти и пропускной способности больше, чем у одного процесса, плюс автоматическое повышение реплики при падении мастера.
В коде подключаются кластерным режимом клиента (Redis.Cluster в ioredis, createCluster в node-redis), иначе приложение упрётся в один узел и будет собирать редиректы.
Главное ограничение: операция с несколькими ключами выполняется, только если все ключи попали в один слот, иначе придёт ошибка CROSSSLOT. Лечится хеш-тегом, когда за весь ключ считается часть имени в фигурных скобках:
user:{42}:profile
user:{42}:sessionsЕщё из практики: номеров баз в кластере нет, работает только нулевая, а SCAN обходит каждый мастер отдельно.
Где спотыкаются
Считают кластер страховкой от потери данных. Репликация асинхронная, подтверждённая запись может не доехать до реплики, и переключение её потеряет. Там, где потеря недопустима, нужна база, а не кеш.
Заводят кластер ради одной лишь отказоустойчивости. Пара узлов с Sentinel проще и не ломает многоключевые операции; кластер берут, когда данные или нагрузка перестали помещаться в один узел.
Забывают про адреса. Узлы сообщают клиенту те адреса, которые знают про себя сами, и из контейнера или из-за NAT приезжает карта, по которой подключиться нельзя. Чинится анонсируемым адресом в конфигурации, а не повторными попытками.