Вопрос нескольких серверов memcached

гипотетически-если у меня есть несколько серверов 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 ответов


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

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

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

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

эта процедура производит более или менее равномерного распределения.

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

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

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

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

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

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


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

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

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

для PHP существует библиотека под названием "flexihash", которая выполняет последовательное хеширование для вы.

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