Согласованность хеш-алгоритма

алгоритм

Если у вас есть веб-сайт, вам нужно использовать Redis для хранения изображений, имя изображения является ключом, а адрес изображения — значением.На данный момент у вас есть 4 сервера Redis для хранения этих изображений.

пользователь для доступаflowers.pngкартинки, но не знаюflowers.pngВ каком из 4-х наборов находится адрес?Обходить однозначно ненаучно.Здесь нужен алгоритм распределенного хеширования(Distributed Hash).

Преобразуйте имя изображения в хеш-значение, а затем найдите сервер Redis, взяв значение по модулю.

redis 服务器号 = hash(文件名) % 服务器台数

WeWork Helper20190806114529

По расчету можно сразу перейти кReadis 1номер сервера найденflowers.pngАдрес изображения.

если в это времяReadis 1Сервер дает сбой, и метод получения по модулю значения Hash в настоящее время недействителен.Hash(flowers.png)%3Он точно не равен 1. В это время все хранящиеся данные можно только пересчитать и выделить, а затем передатьHash(flowers.png)%3Найдите соответствующий сервер.

Если вы добавите серверReadis 4, который также пересчитывает все сохраненные данные.

Из этого можно сделать вывод, что изменение количества услуг приведет к: 1) Неверному методу расчета сервера позиционирования. 2) Все сохраненные данные необходимо пересчитать для распределения.

Используйте алгоритм консенсуса Hash для решения этой проблемы.

Алгоритм согласованности хэшей (Consistent Hasing)

Вместо нумерации сервера создайте угол (0~2π) из информации о сервере и расположите сервер на круге. Поскольку серверов меньше, несколько узлов можно виртуализировать вне сервера, чтобы сделать распределение по кругу более равномерным.RedisAПрактически из пяти узловRedisA1,RedisA2,RedisA3,RedisA4,RedisA5оба представляютRedisA

WeWork Helper20190806040058

Как показано вышеflowers.pngРассчитайте положение маленькой черной точки, тогда вы сможете найти ее по часовой стрелке.RedisA4.

еслиRedisAРулевой механизм теперьflowers.pngперейдет к следующему узлуRedisC2, такflowers.pngМетод расчета позицииRedisAПервый узел связан по часовой стрелке, остальные узлы остаются без изменений.

WeWork Helper20190806041937

Если вы добавитеRedisEШерстяная ткань? а такжеRedisAРулевой механизм аналогичный,flowers.pngПоложение узла остается неизменным, указывая на ближайший к нему узел по часовой стрелке, то есть вновь добавленный узел будет пересчитывать распределение только с первым связанным с ним узлом по часовой стрелке, а остальные узлы остаются неизменными.

WeWork Helper20190806045947

Reference