Сессии PHP на серверах с автоматическим масштабированием
(Извиняюсь за перекрестную публикацию с SO. Я не был уверен, где это было бы более уместно.)
Я работаю над веб-приложением PHP, развернутым в Amazon Web Services. У нас есть балансировщики нагрузки перед автоматически масштабируемыми серверами приложений.
Проблема, с которой мы сталкиваемся в данный момент, это обработка сессий. В то время как липкие сессии были бы разумным решением, мы хотели бы сохранять сессии в течение достаточно долгого времени (в идеале, недели). Это может ухудшить производительность балансировщика нагрузки с течением времени. Кроме того, использование автоматического масштабирования будет означать, что время от времени мы удаляем сервер и, таким образом, теряем все активные сеансы на нем. Конечно, мы могли бы просто использовать общую базу данных для хранения сеансов, но я немного обеспокоен производительностью, если каждый запрос требует повторного обращения к БД.
Я был бы признателен, если бы вы могли предложить какие-либо решения, которые сработали для вас, или любые идеи, которые мы могли бы попробовать.
Заранее спасибо за помощь, Росс
3 ответа
PHP хранит сессию в виде простых файлов. Вы пытались хранить их в общем хранилище?
Аналогичный вопрос: делиться сессиями PHP в облачной файловой системе
Вот статья об этой конкретной проблеме и различных подходах: http://kevin.vanzonneveld.net/techblog/article/enhance_php_session_management/
IME, есть небольшие издержки между использованием файловых сессий и сеансов базы данных (в прошлый раз, когда я смотрел на это более подробно, я использовал репликацию master/master на 3 узлах mysql), но последний чаще влечет за собой дополнительное сетевое отключение по сравнению с первым (при доступе к локальному экземпляру mysql разница не будет ощутима по сравнению с локальной файловой системой). Кроме того, намного проще масштабировать хранилище на основе базы данных в совместно используемые репозитории, и, поскольку это простая методология ключ / значение, ее легко реализовать на базе данных nosql - которая масштабируется даже легче, чем реляционные базы данных.
Это уже упоминалось в статьях, на которые ссылаются другие, но стоит повторить отдельно: Memcache - очень полезная опция. Это невероятно быстро, легко масштабируется до нескольких серверов / экземпляров Memcache и очень легко реализуется без больших накладных расходов или нагрузки на базу данных. Я успешно реализовал это с минимальными усилиями на сайте с миллионами посещений в день, и это дало гораздо больше возможностей для роста на существующем оборудовании.
Это также позволяет использовать собственную политику устаревания Memcache вместо запуска сборщика мусора в сеансе PHP.