Вопрос с собеседования · System design

Какую задачу решает consistent hashing по сравнению с обычным hash(key) % N?

MiddleМасштабирование
Ещё спрашивают так:
  • Почему hash % N плох при добавлении сервера?
Коротко

При hash % N смена N переносит почти все ключи; на кольце consistent hashing переезжает только ~1/N — ключи с дуги нового или ушедшего узла.

  • Для кэша % N = массовый промах и удар по базе; для хранилища — перенос почти всех данных
  • Ключ принадлежит первому узлу по часовой стрелке
  • Виртуальные узлы выравнивают нагрузку и раздают ключи упавшего узла всем

А ещё Альтернативы: фиксированные слоты (Redis Cluster), rendezvous и jump hash

Попробуйте сами

Consistent hashing и виртуальные узлы

Подробно

При взятии остатка изменение числа узлов меняет знаменатель, и почти все ключи меняют владельца — для кэша это означает массовый промах и удар по базе, для хранилища — переливку почти всех данных. На кольце ключ принадлежит ближайшему по часовой стрелке узлу, поэтому уход или приход узла затрагивает лишь его соседний участок. Важное дополнение, которое отличает полный ответ: базовая схема распределяет нагрузку неравномерно, потому что случайные позиции узлов делят кольцо неодинаково, — поэтому каждый физический узел размещают на кольце многократно в виде виртуальных узлов, что и выравнивает распределение и заодно сглаживает перераспределение при отказе.

Что хотят услышать

  • Почему % N перетасовывает ключи и оценка доли переезда.
  • Устройство кольца и правило «первый по часовой».
  • Неравномерность без виртуальных узлов и их роль.

Частые ошибки

  • Забывать про виртуальные узлы и считать распределение равномерным само по себе.
  • Применять взятие остатка в распределённом кэше с меняющимся числом узлов.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓При смене числа узлов переезжает малая доля ключей, а не почти все
  • ✗Гарантирует идеально равномерное распределение ключей без виртуальных узлов и других приёмов
  • ✗Заметно ускоряет вычисление самой хеш-функции на каждом запросе к хранилищу
  • ✗Позволяет обойтись без репликации данных, так как ключи не теряются при отказе

Что спросят дальше

  • Зачем нужны виртуальные узлы?
  • Что произойдёт с кэшем при перезапуске узла без consistent hashing?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования