Как работает согласованное хеширование в модуле PHP memcached?

Я не смог ответить на несколько вопросов о memcached, хотя я много искал в Интернете.

  1. Какой алгоритм согласованного хэша используется модулем PHP memcached?
  2. Каковы его настройки (то есть сколько раз он добавляет сервер на ринге?)
  3. Кэшируется ли массив согласованных хэшей (непрерывное кольцо) или он пересчитывается при каждом выполнении скрипта? Если это последнее, это вызовет проблемы с производительностью / тратой вычислительной мощности?

Спасибо

1

Решение

  1. Какой алгоритм хеширования используется модулем PHP memcached?

Есть разные в зависимости от ваших потребностей. Смотрите эту страницу для вариантов: http://php.net/manual/en/memcached.constants.php Вы можете использовать стандартную операцию по модулю для подсчета количества экземпляров в пуле (DISTRIBUTION_MODULA) или согласованный алгоритм распределения ключей хеширования (DISTRIBUTION_CONSISTENT). Есть также опции для алгоритма хеширования на самих ключах элементов, если это необходимо (HASH_).

Если вы собираетесь часто сбрасывать экземпляры в пул и из него, вам следует обратить внимание на согласованный подход хэширования. На самом деле я никогда не использовал его, и, вероятно, следовало бы, так как это могло бы смягчить последствия отказов серверов, без ощутимого снижения производительности при прохождении этого пути … кажется, нет ничего сложного в ретроспективе. Думая, что расширение memcached должно изменить значение по умолчанию на это. Я читал, что при последовательном хешировании вы можете ожидать потерю 10-25% ваших ключей (или меньше при большем количестве серверов в пуле), где при подходе по умолчанию это может быть ближе к потере 100%.

Чтобы быть более конкретным, последовательный алгоритм основан на libketama. В этом файле readme содержится хорошая информация о том, почему он возник и как он работает.

  1. Каковы его настройки (то есть сколько раз он добавляет сервер на ринге?)

Я не уверен, что понимаю, что вы спрашиваете здесь. Сколько «галочек» добавлено в континуум с каждым новым сервером? Думаю, нам нужно больше взглянуть на библиотеку ketama — догадываясь, что она пытается найти баланс между производительностью и меньшим количеством промахов.

  1. Кэшируется ли массив хэш-памяти (континуальное кольцо) или он пересчитывается при каждом выполнении скрипта? Если это последнее, это вызовет проблемы с производительностью / тратой вычислительной мощности?

Не уверен на 100% честно. Хотя это может быть бесполезным вычислением, все еще кажется достаточно тривиальным — алгоритм md5 и некоторая арифметика. Все, что я могу сказать, это то, что Memcached очень быстр. Если вам нужна высокая доступность, постоянное распределенное хранилище, вы можете посмотреть что-то еще, например couchDB. Memcached очень хорош в том, что он делает … в памяти ключей / значений для «маленьких» значений.

Вам могут понравиться эти статьи:

2

Другие решения

Других решений пока нет …