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.

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

1
задан 2 October 2016 в 15:06
1 ответ

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

Обнаруженное поведение не являлось проблемой HAProxy.

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

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

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

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

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

0
ответ дан 4 December 2019 в 05:48

Теги

Похожие вопросы