2011-01-17 2 views
10

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

+0

Спасибо, что спросили об этом. Итак, в целом, похоже, что больше писать/читать повсюду - это цель, а не избыточность? Я ищу избыточность и, по крайней мере, подтверждаю то, что думал. – Till

+0

[Этот вопрос] (http://stackoverflow.com/questions/4038094/using-multiple-memcache-servers-in-a-pool/4038108#4038108) не совсем то же самое, но мой ответ там должен ответить на ваш вопрос вопрос. –

+0

спасибо ... Знаете ли вы, если клиент memcached балансирует запросы на запись автоматически? или он переходит на первый сервер, пока он не заполнится, а затем на второй, пока второй не заполнится, а третий и т. д. – Stann

ответ

13

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

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

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

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

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

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

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

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

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

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

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

+0

Я искал ответ на этот вопрос на некоторое время. Спасибо за такой отличный ответ. Отвечала все мои опасения. –

0

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

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

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

Для PHP есть библиотека под названием «flexihash», которая делает последовательное хеширование для вас.

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

Смежные вопросы