Memcached - Как бороться с добавлением / развертыванием серверов
-
05-10-2019 - |
Вопрос
Как вы обрабатываете замену / добавление / удаление узлов 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/. Отказ Добавьте или удалите услуги и потребители получают информацию о обслуживании от консула в реальном времени.
- Если консул делает больше накладных расходов на управление новым штуком программного обеспечения, переместите информацию в централизованном конфиге. Об обновлении Перезагрузите события обновления конфигурации или триггера. Потребители слушают события и обновляют информацию.