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

Как настроить mod_proxy_balancer для корректного выхода из строя при высокой нагрузке

У нас есть система, в которой один экземпляр Apache находится перед несколькими котами. Затем эти коты подключаются к различным базам данных. Мы балансируем нагрузку на кота с помощью mod_proxy_balancer.

В настоящее время мы получаем 100 запросов в секунду, нагрузка на сервер Apache довольно низкая, но из-за тяжелых операций с базой данных на котах нагрузка составляет примерно 25% (от того, что, по моим оценкам, они могут справиться).

Через несколько недель произойдет событие, и, по нашим оценкам, количество запросов значительно возрастет, может быть, в 10 раз.

Я делаю все, что в моих силах, чтобы уменьшить нагрузку на наших котов, но я знаю, что у нас закончится емкость, поэтому я хотел бы изящно проиграть. Под этим я подразумеваю, что вместо того, чтобы пытаться иметь дело со слишком большим количеством подключений, которые имеют тайм-аут, я хотел бы, чтобы Apache каким-то образом отслеживал среднее время отклика, и как только время отклика на Tomcat становится выше некоторого порога, мне нужна страница с ошибкой отображается.

Это означает, что удачливые пользователи все равно быстро отрисовывают страницу, а те, кому не повезло, быстро получают страницу с ошибкой. Вместо того, чтобы все слишком долго ждали своей страницы, и, в конечном итоге, у всех истекло время ожидания, а база данных была завалена запросами, которые никогда не использовались.

Надеюсь, это имеет смысл, поэтому я искал предложения, как мне этого добиться.

Спасибо

Я называю это «Сервер сожаления». Если вы используете Apache 2.2, вы можете добавить еще один хост в свой пул LB в качестве «горячего» резерва, и когда фактические серверы приложений достигнут емкости, ваш балансировщик будет направлять запросы на «Извините сервер», пока серверы приложений снова не станут доступными. Вот примерная идея:

<Proxy balancer://yourapp>
    BalancerMember http://10.0.0.1:8080 retry=5 max=50
    BalancerMember http://10.0.0.2:8080 retry=5 max=50
    BalancerMember http://10.0.0.3:8080 retry=5 max=50
    BalancerMember http://10.0.0.4:8080 retry=5 max=50
    # the hot standby on server2
    BalancerMember http://10.0.0.5:80 status=+H
</Proxy>
<Location /app>
    ProxyPass           balancer://yourapp
</Location>

На самом деле, вы также можете настроить дополнительный виртуальный хост на своем компьютере с балансировщиком нагрузки и заставить его обслуживать саму страницу «Извините сервер». Надеюсь, это поможет :)

Пара замечаний:

Параметр "max" устанавливает максимальное количество подключений. на дочерний процесс, который, в зависимости от используемого MPM, не создает жесткого максимума одновременных подключений. Например, префорк MPM для этого будет практически бесполезен.

Вместо этого я бы установил его, используя параметр «тайм-аут» и настроенную страницу ошибки 503. Установите для тайм-аута какое-то разумное значение, сверх которого вы не хотите, чтобы ваши пользователи ждали, и поместите какое-нибудь значимое сообщение на страницу ошибки 503.

Так:

ErrorDocument 503 /sitebusy.html

<Proxy balancer://yourapp>
    BalancerMember http://10.0.0.1:8080 timeout=15 retry=5
    BalancerMember http://10.0.0.2:8080 timeout=15 retry=5
    BalancerMember http://10.0.0.3:8080 timeout=15 retry=5
    BalancerMember http://10.0.0.4:8080 timeout=15 retry=5
</Proxy>

ProxyPass /app balancer://yourapp timeout=5

При такой настройке каждый рабочий будет переведен в состояние отказа, если его ответ превысит 15 секунд, и будет возвращен в пул через 5 секунд. Балансировщик будет ждать 5 секунд свободного рабочего.