Мы запускаем haproxy в качестве балансировщика нагрузки и обеспечиваем функцию резервного копирования для нашей службы API.
Наш API - это приложение Java, использующее платформу Jersey, работающую в 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 резервного копирования также получают неправильное имя хоста при проверке работоспособности.
Есть идеи, как настроить отдельную проверку работоспособности для каждого сервера?
Что ж, вы можете попробовать создать прокси для каждого резервного сервера и использовать трек характерная черта.
Но, как писал Джерард, было бы лучше иметь на каждом сервере одно и то же имя хоста. Для кота это Псевдонимы имени хоста
Предложение отслеживания 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