Ответ
Консистентное хеширование — это алгоритм, который используется в распределённых системах для минимизации перемещения данных при добавлении или удалении серверов (узлов).
Проблема, которую решает
Представьте, у вас есть 4 сервера и вы распределяете данные по ключу, используя простую формулу hash(key) % 4. Если вы добавите пятый сервер (N=5), то формула изменится на hash(key) % 5. В результате почти все ключи поменяют свое местоположение, и придется переместить огромное количество данных. Консистентное хеширование решает эту проблему.
Как это работает (принцип "хеш-кольца")
- Создается кольцо: Представьте себе абстрактное числовое кольцо (например, от 0 до 2^32 - 1).
- Размещаются серверы: Каждый сервер хешируется и помещается в соответствующую точку на этом кольце.
- Размещаются ключи: Каждый ключ данных также хешируется и помещается на это же кольцо.
- Определяется владелец: Чтобы найти, на каком сервере хранить ключ, мы движемся от точки ключа по часовой стрелке до тех пор, пока не встретим первый сервер. Этот сервер и будет хранить данные.

Ключевые преимущества
- Минимальное перераспределение: При добавлении нового сервера на кольцо, только ключи, находящиеся между ним и предыдущим сервером, меняют своего «владельца». То же самое при удалении. Это главное преимущество.
- Горизонтальное масштабирование: Легко и с минимальными издержками добавлять и удалять узлы.
- Сглаживание нагрузки: Для более равномерного распределения данных используются «виртуальные узлы» (virtual nodes) — один физический сервер может быть представлен несколькими точками на кольце.
Где используется
- Базы данных: Cassandra, Riak, DynamoDB.
- Кеширование: Memcached, Redis Cluster.
- Балансировщики нагрузки и сети доставки контента (CDN).
Ответ 18+ 🔞
А, слушай, вот эта штука — консистентное хеширование, ну такая, блядь, хитрая жопа, которую придумали, чтобы не ебать мозг при масштабировании.
Смотри, в чём прикол. Представь, у тебя есть четыре сервера, и ты тупо кидаешь на них данные по формуле hash(key) % 4. Всё вроде ок, пока не приспичило добавить пятый. Ты меняешь формулу на hash(key) % 5, и тут начинается пиздец — почти все ключи вдруг оказываются не на своих серверах! Надо всё перекладывать, овердохуища работы, сервис лег, все орут. Кошмар, да?
Вот чтобы такого не было, умные дядьки и придумали консистентное хеширование. Работает оно на принципе «хеш-кольца», ёпта.
- Кольцо, блядь. Берём числовое кольцо, допустим, от 0 до 2^32 - 1. Просто абстрактный круг, понимаешь?
- Сервера на кольце. Каждый сервер (его IP или имя) пропускаем через хеш-функцию и получаем число. Ставим сервер в эту точку на кольце. Получается типа циферблат, где вместо цифр — наши серваки.
- Ключи туда же. Каждый ключ данных (например,
user:123) тоже хешируем и кидаем на это же кольцо. - Кто главный? А теперь самое вкусное. Чтобы понять, куда положить ключ, идём от его точки на кольце по часовой стрелке, пока не наткнёмся на первый попавшийся сервер. Вот этот сервер — его новый дом! Всё, приехали.

И в чём же, сука, магия? Да в том, что когда ты добавляешь новый сервер, он просто вклинивается в кольцо. И переезжают только те ключи, которые попали на отрезок между ним и предыдущим сервером! Остальные нихуя не двигаются. Удалил сервер — та же история, только наоборот. Перемещение данных — минимальное, волнение ебать нулевое.
А ещё есть фишка — виртуальные узлы. Это когда один физический сервер представляется на кольце не одной точкой, а несколькими (как клоны, блядь). Это нужно, чтобы распределение было равномернее, а то вдруг так повезёт, что все ключи свалятся на один сервер, и он ляжет, бедолага.
Где эту дичь применяют? Да везде, где нужно не обосраться при росте:
- Базы: Cassandra, DynamoDB — там без этого никуда.
- Кеши: Memcached, Redis Cluster — чтобы при падении одного узла не пересчитывать весь кеш.
- Балансировщики и CDN — чтобы маршрутизировать запросы умно, а не как попало.
Вот и вся наука. Не такая уж и страшная, если разобраться, правда? Главное — не пытаться сделать hash(key) % N в продакшене, а то потом будешь, как Герасим, мучиться с совестью, перекладывая петабайты данных.