Haproxy에서 수천 개의 백엔드를 사용하는 방법은 무엇입니까?새로운지도 기능이 이것에 유용한 것입니까?
-
21-12-2019 - |
문제
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)]
.
지도를 사용하는 것에 분명히 어리 석다. 그러나 어떤 지침도 도움이 될 것입니다. 감사합니다!
해결책
일부 단점은 전문가 입력 후 구성 파일에서 제거되었으며 다른 사람이 유용 할 수있는 경우를 대비하여 여기에 나열합니다.
-
hdr_reg () 대신 hdr (호스트) 을 사용하십시오. 이것은 ACL을 평가하기 위해 소비되는 시간을 크게 향상시킵니다. 더 나아지고 ACL을 피하고 인라인 평가를 사용하십시오.
use_backend host1 if { req.fhdr(host,1) -m str host1.domain.com }
-
nbproc> 1 을 사용하십시오. 동시 연결이 발생하면이 도움이됩니다. 디버그하기가 어려워 지지만
-
백엔드의 경우 '서버 hostn_1 dns_of_server : port_number'
대신 IP 주소를 직접 사용하십시오.
-
기본값 섹션에 ' fullconn 1000 '을 넣으십시오. 이로 인해로드 시간이 엄청나게 향상됩니다.
마지막으로 최신 Haproxy Git Checkout을 사용하고로드 시간의 향상을 관찰하십시오. 그것은 상당히 내려 왔습니다. 이전의 순으로 몇 분 정도의 순으로 비해.
또한 '맵'기능에 대해 새로운 동적 use_backend 체계가 많은 ACL을 작성 해야하는 필요성을 제거 해야하는 작업에 있습니다.
다른 팁
동일한 문제가있었습니다.Redis에 저장된 모든 백엔드가있는 NGINX + LUA를 사용하여 현재 NGINX + LUA를 실험하고 있습니다.
요청 흐름은 아래와 같습니다.
- 요청은 NGINX에서 수신됩니다.
- 요청 호스트에 따라 Redis가 쿼리됩니다.Redis에서 Lua 모듈을 사용할 수 있습니다.
- 백엔드 정보는 REDIS 및 NGINX 프록시에서 적절한 백엔드에 대한 요청을 검색합니다.
- 백엔드 (HAPRooxy),로드 균형이 요구됩니다.
동기 부여는 http://openresty.org/#dynamicroutingbasedonredis
이것은 도움이되기를 바랍니다.