Memcached - Как бороться с добавлением / развертыванием серверов

StackOverflow https://stackoverflow.com/questions/2924388

Вопрос

Как вы обрабатываете замену / добавление / удаление узлов MeMCached в ваших производственных приложениях? У меня будет ряд приложений, которые являются клонированными и настроены из-за каждого клиента, нуждаются в работе на одном и том же WebServer, поэтому я думаю, что будет один день, когда некоторые из узлов будут изменены.

Вот как Memcached заполнен нормальным:

$m = new Memcached();

$servers = array(
    array('mem1.domain.com', 11211, 33),
    array('mem2.domain.com', 11211, 67)
);
$m->addServers($servers);

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

Как вы думаете?

Это было полезно?

Решение

Всегда лучше определить такие вещи в источнике. Предоставлено, вы могли бы использовать parse_ini_file() Или что-то в этом роде, чтобы прочитать файл конфигурации. Действительно, он принадлежит к источнику. Но если определено в INI-файле, не так много проблем безопасности, таких как инъекция кода, а также такие лайки, в отличие от определения ваших записей в PHP.

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

Другие советы

Используйте файл конфигурации - будь то из PARSE_INI_FILE или какой-либо другой схеме анализа конфигурации. Если вы беспокоитесь о времени разбора, вы можете поставить эти конфиги в пути нагрузки PHP INI http://brian.moonspot.net/using-ini-files-for-php-aplication-settings. - Это предварительное анализ все варианты, которые вам нужны, но вам нужно перезапустить Apache, чтобы загрузить любые изменения.

Как только файлы будут достаточно прочитаны (до тех пор, пока у вас нет слишком много взрывов на вашу машину), файл конфигурации в любом случае будет в памяти накапливаться в Cache, так что он будет действительно быстр. Вы можете оптимизировать, используя сериализованную форму PHP, которая быстро загружается и даже оптимизация, используя пользовательский кеш APC.

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

В зависимости от ваших требований, я бы использовал список, который поддерживает автоматическое выселение после некоторого TTL (Passive Mode) или какой-то шаблон слушателя, если вы хотите, чтобы это было обновлено немедленно (активный режим). Везде, где вы держите свой основной источник (файл свойств, базы данных и т. Д.) На самом деле не важно, пока он доступен при необходимости, и ваш TTL достаточно большой (как вы упомянули в своем комментарии).

Для пассивного подхода вы можете использовать повторное использование некоторой другой локальной библиотеки кэширования, которая поддерживает TTL (например, EHCACHE в Java), поместив свой список серверов в кеш под известным ключом. Для активного подхода, например, Java имеет java.util.EventListener. Отказ Это (ООН) к счастью, много лет с тех пор, как я сделал что-нибудь в PHP, поэтому не может посоветовать об этом.

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

Вы могли бы также захотеть взглянуть на Как Last.fm использует последовательный алгоритм хеширования Для возможности добавления / удаления серверов в / из пула Memcached, не вызывая полного перенаправления всех клавиш.

Что касается I UDNERSTOOD, главная забота здесь - как кэшировать конфигурацию, сохраняя ее в основном актуальную, когда она меняется.

Ну, лучший вариант здесь, очевидно, хранят его в базе данных и освежающуюся от DB, скажем, каждые 15 секунд. Имея большую нагрузку на приложение, запрашивая БД один раз в 15 секунд ничего не изменится. Загрузка данных из сама БД довольно быстро, поскольку вам нужно всего несколько полей.

Другой вариант, который может работать здесь - использовать отдельный MEMCACHED :) Серьезно, просто кэшируйте конфигурацию, загруженную из БД, очистив эту клавишу кэша в обновлении конфигурации.

Подводя итог: любой срок годности на основе времени будет работать. Самое простое решение - поддерживайте его самостоятельно (храните время в последнем обновлении и проверьте его на каждом вызове функций); немного более продвинутый - используйте что-то вроде memcached.

Обновить: DB - лучшее решение, поскольку он весы довольно хорошо: вам не нужно копировать конфиги по 20 серверам на каждом обновлении конфигурации.

  • Используйте сервисный локатор, как - https://www.consul.io/. Отказ Добавьте или удалите услуги и потребители получают информацию о обслуживании от консула в реальном времени.
  • Если консул делает больше накладных расходов на управление новым штуком программного обеспечения, переместите информацию в централизованном конфиге. Об обновлении Перезагрузите события обновления конфигурации или триггера. Потребители слушают события и обновляют информацию.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top