Redis · Redis 7.4
В 2020 году Ситимобил переводил одиночный Redis на Redis Cluster. Сервисы кэша, сессий и координат водителей были написаны под один инстанс: MGET и MSET по нескольким ключам, SELECT для отдельной базы, SCAN по всем ключам.
В кластере ключи распределены по 16384 слотам, слоты — по нодам. Сервис водителей одной командой читает сессию и последнюю точку водителя: MGET driver:42:session driver:42:geo. В кластере команда возвращает ошибку CROSSSLOT.
Водителей сотни тысяч, сервис дёргает эти ключи на каждом шаге поездки. Нужно переименовать ключи так, чтобы MGET и MULTI по ключам одного водителя работали, а нагрузка расходилась по всем нодам.
В работе: Миграция кода с одиночного Redis на кластер: сессии, корзины, профили, любые ключи, которые читают пачкой.
Источник: кейс Ситимобила: переезд с одиночного Redis на Redis Cluster, 2020. Условие пересказано своими словами.
Какая схема ключей вернёт MGET по одному водителю и не перегрузит одну ноду?
- Hash tag по id водителя: driver:{42}:session и driver:{42}:geo
- Общий тег на всех: drivers:{all}:42:session
- Отдельная база: SELECT 1 для данных водителей
- Обернуть два GET в MULTI/EXEC
- Увеличить число слотов, чтобы ключи разъехались лучше