Использование memcache в качестве хранилища сеансов?

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

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

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

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

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

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

  • Будет ли это решить мою сессию между проблемой сервера?

  • Сохраняются ли хранилища сеансов на всех серверах, когда они созданы, или являются похожими на мастер-сервер memcache?

Я использую схему codeiginiter

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

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

~

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

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

На вопрос две части:

Как обрабатывать запросы на разные серверы?

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

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

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

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

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

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

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

Обработчик сеанса расширений Memcache PECL включен в php.ini:

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

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

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

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

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

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

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

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

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

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

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