Использование memcache в качестве хранилища сессий? - PullRequest
12 голосов
/ 07 октября 2010

У меня сейчас огромная проблема.Два дня назад мой сайт, работающий на одном сервере, был слишком загружен, поэтому я купил еще два и сгруппировал их (rsync и балансировка нагрузки).

Затем я начинаю замечать, что пользователь нажимает на сервер-1 и затемследующий запрос коснулся server3, но их сеанс все еще был на сервере server1 вместо server3, и они больше не входили в систему.

Мне было рекомендовано использовать memcache для хранилищ сеансов.

Мой скрипт уже использует $_SESSION.

  • Можем ли мы установить memcache и включить поддержку обработчика сеансов и установить session.save_handler = "memcache", чтобы заставить php использовать memcache?

  • Требуется ли какое-либо прикладное программирование для использования memcache?

  • Это решит мою проблему между серверами?

  • Хранятся ли хранилища сессий на всех серверах при их создании или они похожи на главный сервер memcache?

Я использую каркас кодигинитера

Ответы [ 7 ]

14 голосов
/ 02 марта 2012

Вопрос состоит из двух частей:

Как обрабатывать запросы, поступающие на разные серверы?

Это зависит от вашего балансировщика нагрузки / обратного прокси. Обычно клиенты привязываются к одному серверу, обычно по IP-адресу или прозрачному cookie, установленному прокси-сервером. Однако нет необходимости иметь клиентскую привязанность ради сеансов, если у вас есть распределенное хранилище сеансов, что приводит нас к memcache.

Как использовать memcache для хранения сессии на нескольких серверах?

memcache имеет правильную распределенную архитектуру без разделения ресурсов, поэтому большая часть интеллекта находится на стороне клиента. Итак, что вам нужно сделать, это пойти дальше и использовать хранилище сессии memcache, но вместо того, чтобы указывать на один сервер, укажите его на ALL из них. Это покрыто в документах . В вашем php.ini вы должны установить session.save_path для списка серверов memcached, например server1:11211, server2:11211.

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

Из-за того, как работает memcache, вам все равно, где хранятся данные вашего сеанса - он позаботится о вас.

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

5 голосов
/ 07 октября 2010

Оба основных расширения memcache PHP PECL имеют обработчики сеансов. Любой из них потребует установки модуля PECL перед использованием.

Обработчик сеанса расширения PECL Memcache включен в php.ini со следующим:

session.save_handler = "memcache"
session.save_path = "tcp://memcacheServerAddressHere:11211?persistent=1&weight=2&timeout=2&retry_interval=10"

Обработчик сеанса расширения PECL Memcached включен в php.ini со следующим:

session.save_handler = "memcached"
session.save_path = "memcacheServerAddressHere:11211"

Обратите внимание, что расширение Memcache, по-видимому, позволяет больше конфигурировать среду Memcache.

2 голосов
/ 07 октября 2010

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

Кроме соответствующей настройки memcache и указания PHP использовать его в качестве обработчика сеанса, вам не нужно вносить какие-либо изменения в ваш код.

~

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

Разработчики memcache на самом деле даже не рекомендуют использовать memcache для хранения данных сеанса, потому что они не являются постоянными, и, таким образом, если вам придется перезапускать memcache (или что-то происходит), то все ваши пользователи будут отключены .

1 голос
/ 07 октября 2010

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

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

0 голосов
/ 05 сентября 2014

Вы также можете синхронизировать файловые сессии. Я делаю это на моих двух серверах с балансировкой нагрузки. В Ubuntu и ряде других Linux сеансы хранятся в /var/lib/php5.

Я выполнил шаги здесь, на Superuser , монтируя папку сеанса PHP с одного сервера на другой.

0 голосов
/ 04 июля 2014

Вы также можете записывать свои сессии в базу данных SQL. Это также даст вам постоянные сессии на разных серверах. См. Учебник ниже: http://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/

Если вы настаиваете на запуске сеансов в memcached (для того, чтобы иметь лучшую производительность, но меньшую согласованность), вы можете просто переписать его код в нескольких местах

0 голосов
/ 26 февраля 2014

лучше использовать memcachedb в качестве постоянного хранилища для самой memcache или даже использовать более умный redis, который я настоятельно рекомендую в вашем случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...