Назад | Перейти на главную страницу

Распределение нагрузки php-сессии на массив memcache

До недавнего времени наша установка состояла из 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