Что такое консистентное хеширование и какую проблему оно решает?

Ответ

Консистентное хеширование — это алгоритм, который используется в распределённых системах для минимизации перемещения данных при добавлении или удалении серверов (узлов).

Проблема, которую решает

Представьте, у вас есть 4 сервера и вы распределяете данные по ключу, используя простую формулу hash(key) % 4. Если вы добавите пятый сервер (N=5), то формула изменится на hash(key) % 5. В результате почти все ключи поменяют свое местоположение, и придется переместить огромное количество данных. Консистентное хеширование решает эту проблему.

Как это работает (принцип "хеш-кольца")

  1. Создается кольцо: Представьте себе абстрактное числовое кольцо (например, от 0 до 2^32 - 1).
  2. Размещаются серверы: Каждый сервер хешируется и помещается в соответствующую точку на этом кольце.
  3. Размещаются ключи: Каждый ключ данных также хешируется и помещается на это же кольцо.
  4. Определяется владелец: Чтобы найти, на каком сервере хранить ключ, мы движемся от точки ключа по часовой стрелке до тех пор, пока не встретим первый сервер. Этот сервер и будет хранить данные.
Consistent Hashing

Ключевые преимущества

  • Минимальное перераспределение: При добавлении нового сервера на кольцо, только ключи, находящиеся между ним и предыдущим сервером, меняют своего «владельца». То же самое при удалении. Это главное преимущество.
  • Горизонтальное масштабирование: Легко и с минимальными издержками добавлять и удалять узлы.
  • Сглаживание нагрузки: Для более равномерного распределения данных используются «виртуальные узлы» (virtual nodes) — один физический сервер может быть представлен несколькими точками на кольце.

Где используется

  • Базы данных: Cassandra, Riak, DynamoDB.
  • Кеширование: Memcached, Redis Cluster.
  • Балансировщики нагрузки и сети доставки контента (CDN).