У меня есть три внутренних сервера с балансировкой нагрузки с помощью 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
После множества последующих тестов указанное поведение проявляется только при использовании браузера Google Chrome. Почему Chrome показывает такое поведение, не определено.
Обнаруженное поведение не являлось проблемой HAProxy.
Это поведение неоднократно тестировалось в других браузерах и других клиентах. Окончательным доказательством является работа в режиме реального времени в течение нескольких часов.
Конфигурация HAProxy, описанная выше, работает уже несколько часов и справедливо распределяет трафик между тремя серверами. Об этом свидетельствуют наши записи в БД, которые записывают идентификатор сервера. В течение нескольких часов каждому серверу было назначено одинаковое количество запросов в пределах +- 50 от примерно 4500 запросов
Более того, учитывая исходный вопрос, он также продолжает справедливо распределять трафик в случае отказа одного из серверов, среди двух других. Опять же, это подтверждается нашими записями в БД, которые регистрируют идентификатор сервера. При измерении в течение 15 минут в наших записях БД можно увидеть четкую картину одинаково сбалансированных идентификаторов серверов.
Острое напоминание о том, что нужно спроектировать тестирование, чтобы определить, в чем заключается проблема, прежде чем предполагать, что проблема заключается в той части(ах) решения, которую вы еще не очень хорошо знаете.
Спасибо за многие ответы, которые потребовались для этой реализации до рассвета.