Согласованное хэширование Memcache, кластер, PHP-код, Ketama и все об этом
Я весь день пытался понять и код для Memcache с PHP, но я запутываюсь в нескольких точках. Я прошел через много статей и почти все так вопросы, связанные с этим, но не мог найти точные ответы.
1) Каким будет код для создания согласованного Хэшированного ключа в PHP? Какие библиотеки мне нужно установить и что мне действительно нужно сделать? Есть хорошая статья?
2) Предположим, я успешно сохранен Последовательный хэш-ключ, теперь, если мой любой из серверов не работает или добавлен новый сервер, будет ли это иметь значение, даже если я использую последовательный хэш-ключ и т. д.?
3) будет использовать Memcached:: addServers() вместо Memcached:: addServer () в случае последовательного хэширования, как указано в http://ru.php.net/manual/en/memcached.addserver.php если нет, то что это значит?
$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$m->addServers($servers);
4) использует вышеуказанный код достаточно для последовательного хеширования и тогда добавление / удаление серверов не будет иметь никакого значения для ключей?
5) Что такое библиотека Кетама? и зачем его использовать, если Memcached:: DISTRIBUTION_CONSISTENT может работать лучше? следующее http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-_a_consistent_hashing_algo_for_memcache_clients
6) должен ли я каким-то образом хэшировать свои ключи или просто предоставить свой ключ и позволить Memcached обрабатывать остальные?
пожалуйста, ребята, мне нужна ваша реальная поддержка поймите и внедрите его в мою производственную среду как можно скорее. Ваши ответы позволили бы мне понять, что я должен кодировать лучше.
2 ответов
Ну, это много вопросов в один раз позвольте мне попробовать все возможное, чтобы ответить один за другим.
1) Каким будет код для создания согласованного Хэшированного ключа в PHP? Какие библиотеки мне нужно установить и что мне действительно нужно сделать? Есть хорошая статья?
Ну, поскольку вы ставите свой код под сомнение, этого кода достаточно для последовательного хеширования в PHP. Вам просто нужно использовать клиентскую библиотеку LibMemcached для использования согласованного хэширования с 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) Предположим, я успешно сохранил согласованный Хэшированный ключ, теперь, если мой любой из серверов не работает или добавлен новый сервер, он сделает разница, даже если я использую последовательный хэш-ключ и т. д.?
хотя, как сказал lsmooth, всегда будет влияние, когда серверы будут удалены или добавлены, но минимально, как предположим, добавив 1 сервер в 3 сервера, это будет примерно 1/4 = 25% потеря ключей, так как столько серверов, сколько меньше шансов потерять ключи.
3) будет использовать Memcached:: addServers() вместо Memcached:: addServer() в случае последовательного хэширования, как указано в http://ru.php.net/manual/en/memcached.addserver.php если нет, то что это значит?
Как сказал Ismooth. Он прав. Предпочтительно использовать addServers. Обратите внимание, что" addServers () " должен вызываться после установки всех параметров с setOption, иначе параметры не будут применяться к этим серверам.
4) использует вышеуказанный код достаточно для последовательного хеширования, а затем добавление / удаление серверов не будет иметь никакого значения для ключи?
уже ответил на вопрос № 1 ответ.
5) Что такое библиотека Кетама? и зачем его использовать, если Memcached:: DISTRIBUTION_CONSISTENT может работать лучше? http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-_a_consistent_hashing_algo_for_memcache_clients
LibKetama-это библиотека, на которой основан согласованный алгоритм распределения ключей хэширования. Таким образом, использование последовательного хэширования в Memcached означает использование Либкетама, вот что это такое.
6) должен ли я каким-то образом хэшировать свои ключи или просто предоставить свой ключ и позволить Memcached обрабатывать остальные?
сказал Иван как "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 () отправляет вам после этого сбоя". at http://www.dugwood.com/895442.html#dwCmtForm.
последовательное хеширование поддерживается расширением memcached PHP. Вам не нужно ничего делать, кроме как использовать его в своем коде следующим образом:
<?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 не имеет значения для последовательного хэширования. Как указано в документации, вы должны использовать addServers, хотя при добавлении нескольких серверов, чтобы внутренние структуры данных обновлялись только один раз.
PHP реализует последовательное хеширование на основе на libketama он вообще не нуждается в libketama. Расширение заботится о распространении элементов на разные серверы для вас, чтобы оно минимизирует потери кэша. Всегда будет влияние, когда серверы будут удалены или добавлены.