У меня есть веб-уровень в AWS под управлением Nginx + PHP-fpm, использующий memcache на ElastiCache для сессий. В течение последних 6 месяцев или около того у нас возникла очень странная проблема, при которой иногда узлу ElastiCache нередко, возможно, приходилось 6 недель или около того, не хватало памяти и начиналось удаление ключей, в результате чего некоторые пользователи теряли сеанс, выходили из системы и выходили из нее. Конечно, разочарованы и теряют свое место в приложении.
Я пробовал несколько вещей. Одним из них является использование модуля php-memcached в ini:
session.save_handler = memcached
session.save_path = "<aws elasticache dns:port>"
И да, я проверил, что URL save_path, который я на самом деле использую, является правильным и получает сетевые соединения. Я также проверил через метрики CloudWatch, что узел кеша действительно получает сетевые соединения и данные.
Эта конфигурация не работала, поэтому я заменил ее на менеджер сессий Zend Framework и обработчик сохранения. Я проверил через phpinfo()
тот session.save_handler
был установлен на user
а также проверил, что браузер получает правильный cookie, который я настроил в сеансе Zend.
Тем не менее, у нас возникла та же проблема, что и на следующем снимке экрана CloudWatch:
Вертикальные скачки в памяти, я полагаю, из-за memcache, очищающего устаревшие ключи, который, кажется, происходит каждые 24 часа. Самый последний (крайний справа) всплеск — это то место, где я перезагрузил узел. Странно то, что каждый раз, когда он очищает ключи, он не очищается достаточно. В итоге мы имеем тенденцию к снижению доступной памяти, которая в какой-то момент приводит к исчерпанию памяти и кешу памяти для запуска изгнания ключей.
Я в недоумении относительно того, в чем может быть проблема и что попробовать дальше в попытке отладить. Какие-нибудь мысли? Спасибо!
Это не ошибка, просто то, как Memcached должен работать. По самой природе кеша данные должны быть (относительно) эфемерными. Если у вашего текущего узла недостаточно памяти для поддержки всех значений, которые вы пытаетесь сохранить, у него нет другого выбора, кроме как удалить ключи. Если вы храните только сеансы и заполняете весь экземпляр кэша, лучшим вариантом будет увеличение размера вашего узла кэша (это много сеансов!) Или, в случае AWS, добавление другого узла ,
Если вы также храните другие данные на узле кэша, установите интеллектуальные времена истечения для этих элементов, чтобы они истекали и периодически освобождали место.
Обновление: я также добавлю, если вам удобно использовать cookie-файлы, неплохо заполнить ограниченный по времени cookie-файл для воссоздания пропущенных сеансов. Базовый «Keep my logged» кода должно хватить
Других решений пока нет …