Мы переходим от установки 1 веб-сервера к установке с двумя веб-серверами, и мне нужно начать совместное использование сеансов PHP между двумя компьютерами с балансировкой нагрузки. Мы уже установили ( и запустили ) memcached, и поэтому я был приятно удивлен, что смог выполнить совместное использование сеансов между новыми серверами, изменив только 3 строки в файле ( session.save_handler и session.save_path ):php.ini
Я заменил:
session.save_handler = files
с:
session.save_handler = memcache
Затем на главном веб-сервере я установил session.save_path
указатель на localhost:
session.save_path="tcp://localhost:11211"
и на подчиненном веб-сервере я установил, session.save_path
чтобы указать на мастер:
session.save_path="tcp://192.168.0.1:11211"
Работа выполнена, я проверил, и это работает. Но...
Очевидно, что использование memcache означает, что сеансы находятся в оперативной памяти и будут потеряны в случае перезагрузки компьютера или сбоя демона memcache - меня это немного беспокоит, но меня больше беспокоит сетевой трафик между двумя веб-серверами (особенно в связи с тем, что мы увеличиваем масштаб), потому что всякий раз, когда кто-то балансирует нагрузку на подчиненный веб-сервер, его сеансы будут передаваться по сети с главного веб-сервера. Мне было интересно, смогу ли я определить два, save_paths
чтобы машины смотрели в собственном хранилище сеансов перед использованием сети. Например:
Мастер:
session.save_path="tcp://localhost:11211, tcp://192.168.0.2:11211"
Ведомый:
session.save_path="tcp://localhost:11211, tcp://192.168.0.1:11211"
Будет ли это успешно разделить сеансы на серверах и помочь производительности? т.е. сэкономить сетевой трафик 50% времени. Или эта техника предназначена только для отработки отказа (например, когда один демон memcache недоступен)?
Примечание : я на самом деле не спрашиваю конкретно о репликации memcache - подробнее о том, может ли PHP-клиент memcache работать с пиками внутри каждого демона memcache в пуле, возвращать сеанс, если он находит один, и создавать новый сеанс, только если он не находит его. во всех магазинах. Когда я пишу это, я думаю, что немного спрашиваю из PHP, лол ...
Предположим : нет липких сессий, циклическое распределение нагрузки, серверы LAMP.
Ответы:
Отказ от ответственности: Вы были бы сумасшедшими, чтобы слушать меня, не проводя тонны тестирования и не получая второго мнения от кого-то квалифицированного - я новичок в этой игре .
Идея повышения эффективности, предложенная в этом вопросе, не сработает. Главная ошибка, которую я сделал, заключалась в том, что порядок, в котором хранилища memcached определены в пуле, диктует какой-то приоритет. Это не тот случай . Когда вы определяете пул memached демонов (например, используя
session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"
), вы не можете знать, какое хранилище будет использоваться. Данные распределяются равномерно, это означает, что элемент может быть сохранен в первом, или это может быть последним (или это может быть и то и другое, если клиент memcache настроен для репликации - обратите внимание, что это клиент, который обрабатывает репликацию, сервер memcached делает не делай сам) В любом случае это означает, что использование localhost в качестве первого в пуле не приведет к повышению производительности - 50% -ный шанс попасть в любой магазин.Проведя небольшое тестирование и исследования, я пришел к выводу, что вы МОЖЕТЕ делиться сессиями между серверами, используя memcache, НО вы, вероятно, этого не хотите - он, кажется, не популярен, потому что он не масштабируется, а также использует общий База данных у него не такая надежная. Буду признателен за отзыв, чтобы узнать больше ...
Совет 1: если вы хотите поделиться сессиями между 2 серверами, используя memcache:
Убедитесь, что вы ответили « Да» на « Включить поддержку обработчика сессий memcache? », Когда вы установили PHP-клиент memcache и добавили в свой
/etc/php.d/memcache.ini
файл следующее:На веб-сервере 1 (IP: 192.168.0.1):
На веб-сервере 2 (IP: 192.168.0.2):
Совет 2: Если вы хотите совместно использовать сеансы на 2 серверах, используя memcache И иметь поддержку отработки отказа:
Добавьте следующее в ваш
/etc/php.d/memcache.ini
файл:На веб-сервере 1 (IP: 192.168.0.1):
На веб-сервере 2 (IP: 192.168.0.2):
Заметки:
session.save_path
на всех серверах.Совет 3: Если вы хотите поделиться сеансами, используя memcache И иметь прозрачную поддержку отработки отказа:
То же, что совет 2, но вам нужно добавить следующее в ваш
/etc/php.d/memcache.ini
файл:Заметки:
get's
повторяются на зеркалах. Это будет означать, что пользователи не теряют свою сессию в случае сбоя одного демона memcache.memcache.session_redundancy
предназначен для избыточности сеанса, но есть такжеmemcache.redundancy
опция ini, которая может использоваться вашим кодом PHP-приложения, если вы хотите, чтобы он имел другой уровень избыточности.источник
ext/memcache
версию 3.x. Мы также играем с этой опцией, и я решил просмотреть список серверов и написать ему сам.Re: Совет 3 выше (для всех, кто сталкивался с этим через Google), кажется, что, по крайней мере, в настоящее время, чтобы это работало, вы должны использовать
memcache.session_redundancy = N+1
N серверов в вашем пуле , по крайней мере, это минимальный порог ценность, которая работает. (Протестировано с php 5.3.3 на стабильном Debian, pecl memcache 3.0.6, два сервера memcached. Сбой,session_redundancy=2
как только я выключу первый сервер вsave_path
,session_redundancy=3
работает нормально.)Кажется, это зафиксировано в следующих отчетах об ошибках:
источник
Наряду с настройками php.ini, показанными выше, убедитесь, что установлены следующие параметры:
Тогда вы получите полное аварийное переключение и избыточность на стороне клиента. Предостережение при таком подходе заключается в том, что если memcached отключен на локальном хосте, то всегда будет пропущено чтение, прежде чем клиент php memcache попробует следующий сервер в пуле, указанном в session.save_path.
Помните, что это влияет на глобальные настройки клиента php memcache, работающего на вашем веб-сервере.
источник
consistent
смысл использовать стратегию хеширования, учитывая, чтоsession.save_path
она отличается на каждом веб-сервере?memcached не работает таким образом (поправьте меня, если я ошибаюсь!)
Если вы хотите, чтобы у вашего приложения было избыточное хранилище сеансов, вы должны создать что-то, что изменяет / добавляет / удаляет записи в обоих экземплярах memcached. memcached не справляется с этим, единственное, что он предоставляет, это хранилище ключей. Так что нет репликации, синхронизации, ничего, нада.
Надеюсь, я не ошибаюсь в этом вопросе, но это то, что я знаю о memcached, прошло несколько лет с тех пор, как я его коснулся.
источник
memcached не реплицируется из коробки, но repcached (пропатченный memcached) делает. Однако, если вы уже используете mysql, то почему бы просто не использовать его функции репликации с репликацией master-master и получить преимущество полной репликации данных.
C.
источник