Какую задачу решает consistent hashing по сравнению с обычным hash(key) % N?
- Почему hash % N плох при добавлении сервера?
При hash % N смена N переносит почти все ключи; на кольце consistent hashing переезжает только ~1/N — ключи с дуги нового или ушедшего узла.
- Для кэша
% N= массовый промах и удар по базе; для хранилища — перенос почти всех данных - Ключ принадлежит первому узлу по часовой стрелке
- Виртуальные узлы выравнивают нагрузку и раздают ключи упавшего узла всем
А ещё Альтернативы: фиксированные слоты (Redis Cluster), rendezvous и jump hash
Подробно
При взятии остатка изменение числа узлов меняет знаменатель, и почти все ключи меняют владельца — для кэша это означает массовый промах и удар по базе, для хранилища — переливку почти всех данных. На кольце ключ принадлежит ближайшему по часовой стрелке узлу, поэтому уход или приход узла затрагивает лишь его соседний участок. Важное дополнение, которое отличает полный ответ: базовая схема распределяет нагрузку неравномерно, потому что случайные позиции узлов делят кольцо неодинаково, — поэтому каждый физический узел размещают на кольце многократно в виде виртуальных узлов, что и выравнивает распределение и заодно сглаживает перераспределение при отказе.
Что хотят услышать
- Почему
% Nперетасовывает ключи и оценка доли переезда. - Устройство кольца и правило «первый по часовой».
- Неравномерность без виртуальных узлов и их роль.
Частые ошибки
- Забывать про виртуальные узлы и считать распределение равномерным само по себе.
- Применять взятие остатка в распределённом кэше с меняющимся числом узлов.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓При смене числа узлов переезжает малая доля ключей, а не почти все
- ✗Гарантирует идеально равномерное распределение ключей без виртуальных узлов и других приёмов
- ✗Заметно ускоряет вычисление самой хеш-функции на каждом запросе к хранилищу
- ✗Позволяет обойтись без репликации данных, так как ключи не теряются при отказе
Что спросят дальше
- Зачем нужны виртуальные узлы?
- Что произойдёт с кэшем при перезапуске узла без consistent hashing?
Разбор темы
- Масштабирование
Что именно упирается, вертикальный и горизонтальный рост, stateless и балансировка, шардинг и consistent hashing, реплики на чтение и лаг, автоскейл и поиск настоящего узкого места.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.