Мы запускаем haproxy в качестве балансировщика нагрузки и для обеспечения функции резервного копирования для нашей службы API.
Наш API - это приложение Java, использующее платформу Джерси, работающую в Apache Tomcat. Некоторое время назад мы столкнулись с проблемой плохой производительности на стороне нашего API, и мы просто не могли понять, что происходит. Глубоко покопавшись, мы обнаружили, что проблема была вызвана параметром httpchk:
option httpchk GET /resource/healthcheck
http-check expect rstatus (2|3)[0-9][0-9]
server server1_8585 x.x.x.x:8585 check inter 1s fastinter 2s fall 2 rise 1 pool-purge-delay 30s
Пакеты, отправленные haproxy, не включали заголовок Host, и из-за этого Tomcat пытается разрешить хост, что приводит к ужасным проблемам с производительностью. Из-за этого мы настроили конфигурацию бэкэнда на следующее:
Конфигурация бэкэнда выглядит так:
backend api_example_com
balance roundrobin
option httpchk GET /resource/healthcheck HTTP/1.1\r\nHost:\ server1.example.com
http-check expect rstatus (2|3)[0-9][0-9]
server server1_8585 x.x.x.x:8585 check inter 10s fastinter 5s fall 2 rise 1 pool-purge-delay 30s
server server2_8585 y.y.y.y:8585 check inter 10s fastinter 5s fall 2 rise 1 pool-purge-delay 30s backup
server server3_8585 z.z.z.z:8585 check inter 10s fastinter 5s fall 2 rise 1 pool-purge-delay 30s backup
Но теперь у нас есть проблема, что API резервного копирования также получают неправильное имя хоста при проверке работоспособности.
Любая идея как настроить отдельную проверку работоспособности для каждого сервера?
Ну, вы можете попробовать создать прокси для каждого резервного сервера и использовать функцию отслеживания.
Но, как писал Джерард, было бы лучше иметь на каждом сервере одно и то же имя хоста. Для tomcat это Псевдонимы имени хоста
Предложение отслеживания HAProxy (непроверенное)
backend track-server2_8585
option httpchk GET /resource/healthcheck HTTP/1.1\r\nHost:\ server2.example.com
http-check expect rstatus (2|3)[0-9][0-9]
server server2_8585 y.y.y.y:8585 check inter 10s fastinter 5s fall 2 rise 1 pool-purge-delay 30s
backend track-server3_8585
option httpchk GET /resource/healthcheck HTTP/1.1\r\nHost:\ server3.example.com
http-check expect rstatus (2|3)[0-9][0-9]
server server3_8585 y.y.y.y:8585 check inter 10s fastinter 5s fall 2 rise 1 pool-purge-delay 30s
backend api_example_com
balance roundrobin
option httpchk GET /resource/healthcheck HTTP/1.1\r\nHost:\ server1.example.com
http-check expect rstatus (2|3)[0-9][0-9]
server server1_8585 x.x.x.x:8585 check inter 10s fastinter 5s fall 2 rise 1 pool-purge-delay 30s
server server2_8585 y.y.y.y:8585 check inter 10s fastinter 5s fall 2 rise 1 pool-purge-delay 30s backup track track-server2_8585/server2_8585
server server3_8585 z.z.z.z:8585 check inter 10s fastinter 5s fall 2 rise 1 pool-purge-delay 30s backup track track-server3_8585/server3_8585