Как использовать тысячи бэкэндов в haproxy? Полезна ли для этого новая функция карты?

Я хочу использовать haproxy в качестве прокси и балансировщика нагрузки для тысяч бэкэндов. Таким образом, запрос должен быть проксирован на правильный бэкэнд в зависимости от имени хоста, а затем сбалансирован по нагрузке внутри бэкэнда. Я использую haproxy-1.5dev21.

файл конфигурации выглядит следующим образом:

frontend public
  bind :80
  mode http
  acl host1 hdr_reg(host) host1.com
  use_backend be_host1 if host1

  acl host4000 hdr_reg(host) host4000.com
  use_backend be_host4000 if host4000

backend be_host[n]
  server hostn_1
  server hostn_2

проблема в том, что я получаю дополнительную задержку 30 МС на запрос, если есть 5000 хостов. И для бэкэндов 20k HAProxy занимает много времени для загрузки, не говоря уже о катастрофе при задержке для каждого запроса.

могу ли я сделать что-то лучше, чем последовательные правила acl? Я не нашел примера для новой функции карты - в примечаниях к выпуску говорится, что ее можно использовать для массовых правил перенаправления. Я попробовал:

use_backend %[hdr(host), map(host_to_backend_map.file)]

что-то явно глупое выше в использовании карт, но любое руководство было бы полезно. Спасибо!

2 ответов


некоторые недостатки были удалены из файла config после ввода expert, и я перечисляю их здесь, Если кто-то еще может найти его полезным.

  1. использовать hdr (хост) вместо hdr_reg(). Это значительно улучшает время, затрачиваемое на оценку ACLs. Еще лучше, избегайте acl и используйте встроенную оценку, например

    use_backend host1 if { req.fhdr(host,1) -m str host1.domain.com }

  2. использовать nbproc>1. В случае параллельных соединений, это помогает. Хотя это затрудняет отладку.

  3. для бэкэндов используйте IP-адрес непосредственно вместо 'server hostn_1 dns_of_server:port_number'

  4. Put'fullconn 1000 в разделе по умолчанию. Это значительно увеличивает время загрузки.

наконец, используйте последнюю проверку HAProxy git и наблюдайте за улучшением во время загрузки. Она значительно снизилась. Его теперь порядок секунд по сравнению с минут до.

кроме того, что касается функции "карта", новая динамическая схема use_backend находится в работах, которые должны удалить необходимость писать столько ACL.


У меня была та же проблема. В настоящее время я экспериментирую с Nginx + Lua со всеми бэкэндами, хранящимися на Redis.

поток запросов выглядит, как показано ниже.

  1. запрос получен в Nginx.
  2. на основе хоста запроса запрашивается Redis. Модуль Lua доступен для Redis.
  3. бэкэнд информация извлекается из Redis и nginx прокси запрос на соответствующий бэкэнд.
  4. Backend(HAProxy), после этого балансирует нагрузку запрос.

мотивация для этого от http://openresty.org/#DynamicRoutingBasedOnRedis

надеюсь, что это помогает.