Распределение нагрузки php-сессии на массив memcache
До недавнего времени наша установка состояла из 4 сеансов обмена веб-серверами с одним сервером, на котором запущен memcache. Мы размещаемся в облаке Amazon и терпим крах при пиковой нагрузке 2 дня подряд. Проблема заключалась в том, что произошел сбой службы memcache (нагрузка на наш сайт неуклонно росла).
Итак, мы приняли следующие меры:
1) Добавлены еще 2 сервера для хранения сессий
2) Установите следующие переменные в php ini-файле на всех веб-серверах.
session.save_handler = memcache
session.save_path = tcp://ip1.port, tcp://ip2.port, tcp://ip3:port
memcache.hash_strategy = consistent
memcache.allow_failover = 1
Вещи работают в порядке сейчас. Чтобы обеспечить доступность, мы попытались выполнить тестирование, случайно убив один из наших серверов сеансов, и сайт продолжает работать (некоторые пользователи вышли из системы, что на данный момент приемлемо для бизнеса).
Но есть одна большая проблема. Я ожидал, что нагрузка на серверы memcache будет более или менее равномерно распределена. Но это не так!
Если я посмотрю на "Max Network Out (Bytes)" в CloudWatch, то я вижу, что нагрузка примерно в соотношении 10:5:1. Другими словами, с точки зрения пропускной способности сети In и Out, первый сервер загружается в 10 раз чаще, чем третий. И второй сервер загружен в 5 раз больше, чем третий.
Есть идеи?
1 ответ
Изменение порядка адресов memcache для session.save_path
параметры могут изменить коэффициент распределения сеансов по серверам memcache. Например на 1-м веб-сервере:
session.save_path = tcp://ip1.port, tcp://ip2.port, tcp://ip3:port
на 2-м веб-сервере:
session.save_path = tcp://ip2.port, tcp://ip3.port, tcp://ip1:port
на 3-м веб-сервере:
session.save_path = tcp://ip3.port, tcp://ip1.port, tcp://ip2:port
на 4-м веб-сервере:
session.save_path = tcp://ip1.port, tcp://ip3.port, tcp://ip2:port