Подтвердить что ты не робот

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

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

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

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

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

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

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

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

  • Сохраняются ли хранилища сеансов на всех серверах при их создании или один из них является сервером master memcache?

Я использую рамки codeiginiter

4b9b3361

Ответ 1

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

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

~

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

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

Оба основных расширения 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.

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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