Согласованное хэширование 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. Расширение заботится о распространении элементов на разные серверы для вас, чтобы оно минимизирует потери кэша. Всегда будет влияние, когда серверы будут удалены или добавлены.