Наша инфраструктура состоит из балансировщиков нагрузки, работающих под управлением HAProxy и Apache, которые перенаправляют трафик на наши серверы приложений, на которых работает только Apache. В последние несколько дней мы наблюдали наводнения соединений, которые балансировщики нагрузки успешно проходят, но соединения быстро перегружают наши серверы приложений. Они перестают отвечать, и наша единственная тактика смягчения последствий - запустить больше серверов приложений, чтобы выдержать наводнение. Сначала мы не могли определить, почему эти серверы выйдут из строя, потому что на балансировщиках нагрузки не было реальных скачков трафика, но после некоторого расследования мы видим, что количество подключений Apache зашкаливает.
Прилагаю некоторые графики, которые, кажется, являются единственными индикаторами наводнения. Я снизил HAProxy maxconn
для каждого внутреннего сервера на более разумное число (предыдущее значение по умолчанию было 255), но я беспокоюсь, что новые легитимные соединения будут отложены до тех пор, пока поток не утихнет. Служба будет доступна для пользователей с существующими подключениями, но она будет отображаться для новых подключений и внешних служб мониторинга, поскольку HAProxy ограничивает скорость без учета хоста.
Есть ли что-нибудь еще, что мы можем сделать на нашей стороне (HAProxy или Apache), чтобы помочь нам выдержать нагрузку, или нам следует подумать о ее фильтрации за пределами нашей сети? Поскольку это такой небольшой объем трафика, я чувствую, что мы можем сделать еще кое-что, но я не очень хорошо знаком со всеми возможностями HAProxy. Мне также интересно узнать, может ли HAProxy ограничивать скорость на основе IP, но я ничего не нашел.
РЕДАКТИРОВАТЬ: Мы проверили журнал доступа для одного из балансировщиков нагрузки, и количество запросов для верхних IP-адресов выглядит следующим образом:
1070 69.64.*.*
1227 1.9.*.*
1235 64.71.*.*
1376 69.64.*.*
1459 12.189.*.*
1572 1.9.*.*
1678 208.106.*.*
1982 5.15.*.*
2630 23.22.*.*
3300 76.125.*.* (our office)
3543 216.38.*.*
Таким образом, мы могли динамически блокировать IP-адреса, которые устанавливают слишком много сеансов в небольшом окне, но мы не могли блокировать на основе общего количества запросов, так как это тоже могло бы нас поймать. Имеет ли смысл этот маршрут? Должны ли мы сделать это на уровне iptables в балансировщиках нагрузки?
Любой совет очень ценится!
Спасибо,
Крис
Во-первых, если вы получаете "просто" наводнение соединения, установки maxconn на серверах будет достаточно, потому что haproxy будет передавать только действительные запросы на серверы, а не простые соединения без запроса. Кроме того, меньшее значение maxconn делает ваши серверы быстрее и в целом быстрее обслуживает вашего пользователя (при условии, что вы не заходите слишком низко, сохраняйте как минимум в 2-3 раза больше ядер ЦП на машинах apache).
Если вы получаете наводнение запросов, вам нужны более эффективные меры противодействия. У Haproxy 1.5-dev есть несколько из них: он может заносить в черный список некоторые IP-адреса, которые выполняют слишком много запросов, слишком высокую скорость соединения, слишком много одновременных соединений или испытывают слишком много ошибок.
Здесь есть отличное объяснение http://blog.exceliance.fr/2012/02/27/use-a-load-balancer-as-a-first-row-of-defense-against-ddos/ о том, как это настроить.
Надеюсь, это поможет!