До недавнего времени наша установка состояла из 4 веб-серверов, разделяющих сеансы на один сервер, на котором запущен кэш памяти. Мы размещены в облаке Amazon и два дня подряд вылетали при пиковой нагрузке. Проблема заключалась в том, что сервис 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 будет более-менее равномерно распределена. Но это не так!
Если я посмотрю на «Макс. Выход сети (байты)» в CloudWatch, то я вижу, что нагрузка составляет примерно соотношение 10: 5: 1. Другими словами, с точки зрения пропускной способности входящей и исходящей сети первый сервер загружен в 10 раз больше, чем третий. А второй сервер в 5 раз загружен, чем третий.
Любые идеи?
Изменение порядка IP-адресов 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