Memcache Consistent Hashing, Cluster, PHP-код, Ketama и все об этом

Я пытаюсь целый день понять и кодировать Memcache с PHP, но я немного смущен в нескольких точках. Я просмотрел много статей, и почти все вопросы, связанные с SO, касались этого, но не смогли найти точные ответы.

1) Каким будет код для создания Consistent Hashed Key в PHP? Какие библиотеки мне нужно установить и что мне действительно нужно делать? Любая хорошая статья, чтобы пройти?

2) Предположим, что я успешно сохранил Consistent Hashed Key, теперь, если мой сервер остановлен или добавлен новый сервер, это будет иметь значение, даже если я использую Consistent Hashed Key и т.д.?

3) Будет использовать Memcached:: addServers() вместо Memcached:: addServer(), чтобы сделать разницу в случае Consistent Hashing, как указано в http://ru.php.net/manual/en/memcached.addserver.php если нет, то что означает?

$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$m->addServers($servers);

4) Используется ли вышеприведенный код для Consistent Hashing, а затем добавление/удаление серверов не будет иметь никакого значения для ключей?

5) Что такое библиотека Ketama? и почему его использовать, если Memcached:: DISTRIBUTION_CONSISTENT может работать лучше? после http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-_a_consistent_hashing_algo_for_memcache_clients

6) Нужно ли мне каким-то образом хэшировать мои ключи или просто предоставить свой ключ и позволить остальному дескриптору Memcached?

Пожалуйста, ребята, мне нужна ваша реальная поддержка, чтобы как можно скорее понять и реализовать ее в моей рабочей среде. Ваши ответы позволят мне понять, что мне лучше кодировать.

Ответы

Ответ 1

Хорошо, что у меня много вопросов, позвольте мне попытаться изо всех сил ответить один за другим.

1) Каким будет код для создания Consistent Hashed Key в PHP? Какие библиотеки мне нужно установить и что мне действительно нужно делать? Любая хорошая статья, чтобы пройти?

Хорошо, поскольку вы ставите свой код под вопросом, этого кода достаточно для последовательного хеширования в PHP. Вам просто нужно использовать библиотеку LibMemcached Client для использования Consistent Hashing с Memcached. Просто добавьте следующую строку под своим кодом.

$m->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);

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

Хотя лучший aproach может быть для более высокой производительности, установив глобально в php.ini(я еще не тестировал.)

memcache.hash_strategy = consistent;

как предлагается в http://blog.fedecarg.com/2008/12/24/memcached-consistent-hashing-mechanism/, тогда вам не нужно указывать индивидуально в каждом вызове memcached. Значение по умолчанию - стандартное, и используется расчет модуля, который не будет полезен при добавлении или удалении серверов.

2) Предположим, что я успешно сохранил Consistent Hashed Key, теперь, если мой какой-либо сервер опущен или добавлен новый сервер, будет ли он иметь какое-либо значение, даже если я использую Consistent Hashed Key и т.д.

Хотя, как сказал lsmooth, всегда будет удаваться, когда серверы будут удалены или добавлены, но минимальные, так как предположим, что добавление 1 сервера на 3 сервера приведет к потере ключей на 1/4 = 25%, так как многие серверы будут меньше шансов потери ключей.

3) Будет использовать Memcached:: addServers() вместо Memcached:: addServer() внести изменения в случае Consistent Hashing, как указано в http://ru.php.net/manual/en/memcached.addserver.php если нет, то что означает?

Как сказал Иштут. Он прав. Он предпочитает использовать addServers. Обратите внимание, что "addServers()" необходимо вызвать после того, как все параметры заданы с помощью setOption, иначе параметры не будут применяться к этим серверам.

4) Используется ли вышеприведенный код для Consistent Hashing, а затем добавление/удаление серверов не будет иметь никакого значения для ключей?

Уже ответили на вопрос № 1.

5) Что такое библиотека Ketama? и почему его использовать, если Memcached:: DISTRIBUTION_CONSISTENT может работать лучше? http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-_a_consistent_hashing_algo_for_memcache_clients

LibKetama - это библиотека, на которой основан алгоритм распределения согласования Хейшинга. Таким образом, использование Consistent Hashing в Memcached означает использование LibKetama и что это такое.

6) Нужно ли мне каким-то образом хэшировать мои ключи или просто предоставить мой ключ и оставить обработчик Memcached остальным?

Сказал Yvan, что "клиент Memcached автоматически запустит ваши ключи. Скажем, у вас есть 3 сервера, A, B и C и 3 клавиши" K1 "на" K9 ". Например, алгоритм хеш-клиента будет храниться следующим образом: K1/K2/K3, хранящиеся на A, K4/K5/K6, хранящиеся на B, K7/K8/K9, сохраненные на C. Если ваш сервер B опускается, его клавиши (K4/K5/K6) будут храниться равномерно на 2 оставшихся серверов (A и C). Например, K4 перейдет к A, а K5/K6 перейдет на сервер C.

Это просто пример, а не настоящий алгоритм. Вы можете узнать, какой ключ находится на сервере с функцией $memcached- > getServerByKey ('K4'). Затем запустите один сервер и посмотрите, что получит после этого сбой getServerByKey() в http://www.dugwood.com/895442.html#dwCmtForm.

Ответ 2

Согласованное хеширование поддерживается расширением PHP memcached. Вам не нужно ничего делать, кроме как использовать его в своем коде следующим образом:

<?php
  $servers = array(
    array('memcache1.example.com', 11211),
    array('memcache2.example.com', 11211)
    );
  $m = new Memcached();
  $m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
  $m->addServers($servers);
?>

Когда вы начинаете добавлять элементы в кэш, расширение автоматически распределяет их на серверах, чтобы минимизировать потери кэша, если вы добавляете сервер (ы). В случае, если он не может получить элемент с сервера, на котором он должен быть, потому что сервер не работает, например, вам придется обрабатывать это в своем php-коде самостоятельно.

Использование addServers вместо addServer не имеет значения для Consistent Hashing. Как указано в документации, вы должны использовать addServers, хотя при добавлении нескольких серверов, чтобы внутренние структуры данных обновлялись только один раз.

Реализация PHP Consistent Hashing на основе на libketama вообще не нуждается в libketama. Расширение заботится о распределении элементов на разных серверах для вас, чтобы минимизировать потери кэша. При удалении или добавлении серверов всегда будет иметь значение.