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

HAProxy проверяет имя хоста

Мы запускаем 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