Haproxy에서 수천 개의 백엔드를 사용하는 방법은 무엇입니까?새로운지도 기능이 이것에 유용한 것입니까?

StackOverflow https://stackoverflow.com//questions/22025412

문제

HAPRooxy를 프록시로 사용하고 수천 개의 백엔드를위한로드 밸런서를 사용하고자합니다.따라서 호스트 이름에 따라 요청을 올바른 백엔드에 프록시 한 다음 백엔드 내에서로드 밸런싱해야합니다.나는 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
.

문제는 5000 개의 호스트가있는 경우 요청 당 90ms의 대기 시간을 추가하는 것입니다.그리고 20K 백엔드의 경우 Haproxy는 요청 당 대기 시간에 대한 재앙은 언급하지 않고 하중에 오래 걸리지 않습니다.

순차적 ACL 규칙보다 뭔가를 더 잘 수행 할 수 있습니까? 새로운지도 기능에 대한 예제가 발견되지 않았습니다. 릴리스 정보는 대규모 리디렉션 규칙에 사용할 수 있습니다. 나는 이것을 시도했다 :

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

지도를 사용하는 것에 분명히 어리 석다. 그러나 어떤 지침도 도움이 될 것입니다. 감사합니다!

도움이 되었습니까?

해결책

일부 단점은 전문가 입력 후 구성 파일에서 제거되었으며 다른 사람이 유용 할 수있는 경우를 대비하여 여기에 나열합니다.

  1. hdr_reg () 대신 hdr (호스트) 을 사용하십시오. 이것은 ACL을 평가하기 위해 소비되는 시간을 크게 향상시킵니다. 더 나아지고 ACL을 피하고 인라인 평가를 사용하십시오.

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

  2. nbproc> 1 을 사용하십시오. 동시 연결이 발생하면이 도움이됩니다. 디버그하기가 어려워 지지만

  3. 백엔드의 경우 '서버 hostn_1 dns_of_server : port_number'

  4. 대신 IP 주소를 직접 사용하십시오.

  5. 기본값 섹션에 ' fullconn 1000 '을 넣으십시오. 이로 인해로드 시간이 엄청나게 향상됩니다.

  6. 마지막으로 최신 Haproxy Git Checkout을 사용하고로드 시간의 향상을 관찰하십시오. 그것은 상당히 내려 왔습니다. 이전의 순으로 몇 분 정도의 순으로 비해.

    또한 '맵'기능에 대해 새로운 동적 use_backend 체계가 많은 ACL을 작성 해야하는 필요성을 제거 해야하는 작업에 있습니다.

다른 팁

동일한 문제가있었습니다.Redis에 저장된 모든 백엔드가있는 NGINX + LUA를 사용하여 현재 NGINX + LUA를 실험하고 있습니다.

요청 흐름은 아래와 같습니다.

  1. 요청은 NGINX에서 수신됩니다.
  2. 요청 호스트에 따라 Redis가 쿼리됩니다.Redis에서 Lua 모듈을 사용할 수 있습니다.
  3. 백엔드 정보는 REDIS 및 NGINX 프록시에서 적절한 백엔드에 대한 요청을 검색합니다.
  4. 백엔드 (HAPRooxy),로드 균형이 요구됩니다.
  5. 동기 부여는 http://openresty.org/#dynamicroutingbasedonredis

    이것은 도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top