В настоящее время я тестирую haproxy для балансировки нагрузки нашего информационного бюллетеня. Мы создаем индивидуальную рассылку новостей для наших клиентов.
Для этого мы используем два веб-сервера (идентичные машины) и один «почтовый движок». Почтовый движок обращается к веб-серверам, которые затем возвращают персонализированный информационный бюллетень в формате html.
Теперь проблема в том, что у одного веб-сервера загрузка процессора около 75%, а на другом - только 15%. Если посмотреть на «Скорость сеанса» при тестировании, на обоих серверах «Скорость сеанса -> Cur» все время находится между 3 и 4.
Но если посмотреть на «Сеансы», то здесь «Сеансы -> Cur» имеют всего 10, веб-сервер 1 имеет «Cur» 8, а другой веб-сервер имеет значение от 0 до 2.
Почему на первом веб-сервере будет 8 сеансов, а на другом 0–2?
Вот мой конфиг:
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
timeout connect 5000
timeout client 50000
timeout server 50000
listen mailgenerator 10.46.70.75:80
mode http
stats enable
balance roundrobin
option httpclose
option forwardfor
option httpchk HEAD /robots.txt
server mail1 192.168.70.11:80 check weight 100
server mail2 192.168.70.12:80 check weight 100
Если вы используете циклический перебор, то соединения будут распределяться равномерно по мере их поступления, независимо от нагрузки. Поэтому, если у вас более медленный сервер или медленный процесс, он может создать очередь на одном, в то время как другой будет свободен.
Вы можете получить гораздо более равномерное распределение, если используете балансировку с наименьшим количеством соединений и установите низкое значение maxconn для каждого сервера, чтобы соединения помещались в очередь в haproxy, а не на каждом сервере.
Для http текущие сеансы мало что значат. Сеансы Total и LbTot лучше отражают балансировку серверов. Если эти числа достаточно четные, это может быть что-то на одном сервере, заставляющее его обрабатывать свои запросы медленнее, что приводит к увеличению нагрузки.