Вопрос о нескольких memcached серверах - PullRequest
10 голосов
/ 17 января 2011

гипотетически - если у меня есть несколько серверов memcached, как это:

//PHP 
$MEMCACHE_SERVERS = array(
    "10.1.1.1", //web1
    "10.1.1.2", //web2
    "10.1.1.3", //web3 
); 
$memcache = new Memcache();
foreach($MEMCACHE_SERVERS as $server){
    $memcache->addServer ( $server ); 
}

И затем я устанавливаю данные так:

$huge_data_for_frong_page = 'some data blah blah blah';
$memcache->set("huge_data_for_frong_page", $huge_data_for_frong_page);

А затем я получаю данные следующим образом:

$huge_data_for_frong_page = $memcache->get("huge_data_for_frong_page");

Когда я получу эти данные с серверов memcached - как клиент php memcached узнает, какой сервер запрашиватьэти данные? Или клиент memcached собирается запросить все серверы memcached?

Ответы [ 2 ]

13 голосов
/ 18 января 2011

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

Самый распространенный и разумный подход для кэширования - это шардинг.Это означает, что данные размещаются только на одном сервере, и для определения того, какой это сервер, используется какой-то метод.Таким образом, он может быть получен с этого самого сервера и задействован только один сервер.

Это, очевидно, хорошо работает в средах ключ / значение, таких как memcached.

Обычной практикой является использование криптографического хэшаключ.Вычислите число хеш-модов серверов, и в результате вы получите сервер, который будет хранить и извлекать данные.

Эта процедура обеспечивает более или менее равное распределение.

Как это точно сделано в memcached, я не знаю, но какой-то хэш точно.

Но будьте осторожны, эта техника не очень доступна.Таким образом, если один сервер не работает, записи пропадают.Таким образом, вы, очевидно, можете использовать это только для целей кэширования.

Другие методы, где, например, необходима высокая доступность ресурсов, для расчета которых требуется много времени и которые автоматически подогреваются на заднем плане, включают репликацию.

Наиболее распространенной формой в средах кэширования является репликация мастер-мастер с последним разрешением конфликтов с отметками времени.Это означает, что каждый сервер получает данные от каждого сервера, который еще не находится на локальном сервере (это делается с использованием журналов репликации и смещений байтов).Если возникает конфликт, используется последняя версия (незначительное смещение времени между серверами игнорируется).

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

Но эти настройки очень редки, потому что разделение, как описано выше, дает лучшую производительность, а в средах кэширования потеря данных в большинстве случаев допустима.поэтому его также по умолчанию для memcached.

0 голосов
/ 10 марта 2014

Несколько дней назад я искал решение для оптимизации масштабирования наших серверов memcached и нашел этот ответ. Исходя из нашего опыта, описанное решение с генерацией хеш-кода и количества серверов MOD для поиска целевого сервера не является лучшим.

Если вы увеличите или уменьшите число своих серверов, это может привести к тому же сценарию при очистке кэша. Большинство хэшей получают другой сервер, поэтому в первом запросе не будет результата из кэша.

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

Для PHP есть библиотека 'flexihash', которая выполняет согласованное хеширование для вас.

В нашем блоге вы можете найти пример, как использовать его с вашим собственным кеш-клиентом. Статья написана на немецком языке, но исходный код должен быть понятен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...