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

haproxy не балансирует нагрузку, когда один сервер в ферме не работает

У меня есть три внутренних сервера с балансировкой нагрузки с помощью HAProxy.

Когда все 3 из них работают, я вижу каждый идентификатор сервера (1,2,3) последовательно в ответе HTTPS. IE 1,2,3,1,2,3. Как и ожидалось.

Однако, если я отключу один внутренний сервер, я буду постоянно видеть только один идентификатор сервера.

Т.е. если я отключаю сервер 1, я вижу только идентификатор сервера 2 (2,2,2,2 ...), когда я должен видеть идентификатор сервера 2,3 (2,3,2,3,2,3 ... ..)

Я пробовал балансировать как с минимальным подключением, так и с циклическим перебором, и оба демонстрируют одинаковое поведение

Почему HAProxy так себя ведет? Как изменить конфигурацию HAProxy для балансировки нагрузки между оставшимися живыми внутренними серверами?

Версия прокси HA - 1.6.9. Сервер для прокси HA - ubuntu 14.04.

Обслуживаемый HTTP - это API, который возвращает некоторый JSON через HTTPS. Это спокойный API, поэтому постоянство сеанса не требуется или не требуется.

Конфигурация для haproxy приведена ниже.

 global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon
    maxconn 3072
    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private
    # Default ciphers to use on SSL-enabled listening sockets.
    # For more information, see ciphers(1SSL). This list is from:
    #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
    ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4-SHA:!kEDH$
    ssl-default-bind-options no-sslv3
defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    option dontlog-normal
    option redispatch
    retries 3
    maxconn 3072
    timeout connect 5000
    timeout client  10000
    timeout server  10000

frontend apis-frontend
    bind x.x.x.x:443 ssl verify none crt /etc/haproxy/xxx
    mode http
    option forwardfor
    default_backend apis

backend apis
    balance leastconn
    mode http
    option httpchk GET /
    server 1 x.x.x.x:443 ssl verify none check
    server 2 x.x.x.x:443 ssl verify none check
    server 3 x.x.x.x:443 ssl verify none check

listen stats
    bind *:8181
    mode http
    stats enable
    stats uri /
    stats realm Haproxy\ Statistics
    stats auth xx

Изменить: добавлена ​​статистика.

pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,comp_in,comp_out,comp_byp,comp_rsp,lastsess,last_chk,last_agt,qtime,ctime,rtime,ttime,
apis-frontend,FRONTEND,,,0,2,3072,24,9118,10021,0,0,19,,,,,OPEN,,,,,,,,,1,2,0,,,,0,0,0,4,,,,0,24,0,19,0,0,,0,6,43,,,0,0,0,0,,,,,,,,
apis,mt-wol-vlx-vps-01,0,0,0,1,,12,4863,3240,,0,,0,0,0,0,UP,1,1,0,1,0,12097,0,,1,3,1,,12,,2,0,,2,L7OK,200,36,0,12,0,0,0,0,0,,,,0,0,,,,,39,OK,,0,1,1,29,
apis,mt-lon-vlx-vps-01,0,0,0,1,,12,4255,3228,,0,,0,0,0,0,UP,1,1,0,0,0,12097,0,,1,3,2,,12,,2,0,,2,L7OK,200,23,0,12,0,0,0,0,0,,,,0,0,,,,,39,OK,,0,1,1,5,
apis,mt-cov-uks-vps-01,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,1,1,12094,12094,,1,3,3,,0,,2,0,,0,L4TOUT,,2001,0,0,0,0,0,0,0,,,,0,0,,,,,-1,,,0,0,0,0,
apis,BACKEND,0,0,0,1,308,24,9118,6468,0,0,,0,0,0,0,UP,2,2,0,,0,12097,0,,1,3,0,,24,,1,0,,3,,,,0,24,0,0,0,0,,,,,0,0,0,0,0,0,39,,,0,1,1,33,
stats,FRONTEND,,,1,4,3072,10,3811,169181,0,0,5,,,,,OPEN,,,,,,,,,1,4,0,,,,0,1,0,4,,,,0,9,0,5,0,0,,1,3,15,,,0,0,0,0,,,,,,,,
stats,BACKEND,0,0,0,0,308,0,3811,169181,0,0,,0,0,0,0,UP,0,0,0,,0,12097,0,,1,4,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0,0,0,0,0,0,,,0,0,0,18,

изменить: поведение балансировки нагрузки в разных браузерах

После запроса на тест с другого ip. Я заметил, что нагрузка на второй ip сбалансирована, как и ожидалось. Затем я попробовал с первого IP-адреса, но использовал разные браузеры Edge и firefox. Как и ожидалось, балансировка нагрузки edge и firefox.

Однако исходный хром браузера по-прежнему привязан к одному внутреннему серверу. Даже после закрытия всех хромированных окон и перезапуска хрома

После продолжительного тестирования указанное поведение появляется только при использовании браузера Google Chrome. Почему хром показывает такое поведение, неизвестно.

Наблюдаемое поведение не было проблемой HAProxy.

Это проверено несколько раз с другими браузерами и другими клиентами. Окончательное доказательство - это прямая трансляция в течение нескольких часов.

Приведенная выше конфигурация HAProxy работает уже несколько часов и справедливо распределяет трафик между тремя серверами. Об этом свидетельствуют записи нашей БД, в которых записан идентификатор сервера. В течение нескольких часов каждому серверу было назначено одинаковое количество запросов в пределах + - 50 из примерно 4500 запросов.

Что еще более важно, учитывая исходный вопрос, он также продолжает справедливое распределение в случае отказа одного из серверов среди двух других. Это снова подтверждается записями нашей БД, в которых записан идентификатор сервера. При измерении в течение 15 минут в наших записях БД можно увидеть четкую картину одинаково сбалансированных идентификаторов серверов.

Осторожное напоминание о необходимости тестирования дизайна, чтобы определить, в чем заключается проблема, прежде чем предположить, что проблема связана с частью (-ами) решения, которую вы еще не очень хорошо знаете.

Спасибо за множество ответов, которые потребовались для этого осознания.