HAProxy 2.0 - URL을 기반으로 일부 요청 재시도

HAProxy 2.0 - URL을 기반으로 일부 요청 재시도

HAProxy 버전 2.0.14가 설치되어 있으며 아직 올바르게 구성하지 못한 독특한 사용 사례를 찾고 있습니다.

기본적으로 포트를 수신하는 프런트엔드와 두 개의 백엔드 서버가 있습니다. 세션이 시작되면 쿠키가 사용되므로 세션은 특정 백엔드 서버에 연결되며 다른 서버와 공유할 수 없습니다. 이를 달성하기 위해 요청에서 필요한 값을 얻기 위해 stick-table및 키워드와 LUA 스크립트를 사용하고 있습니다 .stick on

그러나 첫 번째 요청이 도착했을 때 선택한 백엔드 서버가 제 시간에 응답하지 못하면 쿠키가 아직 설정되지 않았기 때문에 다른 서버로 장애 조치해야 합니다.

지금까지 다음과 같은 구성이 있습니다.

global
   log 127.0.0.1 len 10000 local2 debug
   chroot /var/lib/haproxy
   user haproxy
   group haproxy
   daemon
   lua-load /opt/LUA/myparser.lua

   stats socket /etc/haproxy/haproxysock level admin

defaults
   log global
   option httplog
   option dontlognull
   mode http
   timeout connect 5000
   timeout client 50000
   timeout server 50000
   log-format "Client IP:port = [%ci:%cp], Start Time = [%tr], Frontend Name = [%ft], Backend Name = [%b], Backend Server = [%s], Time to receive full request = [%TR ms], Response time = [%Tr ms], Status Code = [%ST], Bytes Read = [%B]"

frontend chatgw_front
   bind *:8776

   option http-buffer-request
   declare capture request len 40000
   http-request capture req.body id 0
   http-request capture req.hdrs len 2048

   http-request track-sc0 src table my_back
   use_backend my_back

backend my_back
   balance roundrobin

   stick-table type string len 32 size 30k expire 30m
   stick on "lua.parseId" table my_back

   server server1 x.x.x.1:8080 check
   server server2 x.x.x.2.8080 check

이것이 수행하는 작업은 선택한 백엔드 서버가 50초 내에 응답하지 않으면 클라이언트에 HTTP 504 게이트웨이 시간 초과가 발생한다는 것입니다. 대신 필요한 것은 세션의 첫 번째 요청인 경우에만 다른 백엔드 서버로 장애 조치하는 것입니다. URL을 기반으로 하면 이것이 첫 번째 요청임을 알 수 있습니다.

백엔드를 다음과 같이 변경하려고했습니다.

backend my_back
   balance roundrobin

   stick-table type string len 32 size 30k expire 30m
   stick on "lua.parseId" table my_back

# Check if this is "init" request: in this case URL contains "/init"
   acl is_init path_sub /init

# In case of "init" request, enable redispatch to other backend server in case failure
   option redispatch if is_init

# In case of other requests (not "init"), we are already tied to a selected backend server due to session cookie, so disable redispatch
   no option redispatch if !is_init

   server server1 x.x.x.1:8080 check
   server server2 x.x.x.2.8080 check

그러나 나는 똑같은 행동을 보였습니다. 그래서 "재시도"를 추가하려고 했습니다.

backend my_back
   balance roundrobin

   stick-table type string len 32 size 30k expire 30m
   stick on "lua.parseId" table my_back

   acl is_init path_sub /init

   option redispatch if is_init

   no option redispatch if !is_init

   retry-on conn-failure empty-response response-timeout

   server server1 x.x.x.1:8080 check
   server server2 x.x.x.2.8080 check

이제는 달라졌습니다. 동일한 서버에서 초기 요청을 4번 시도한 후 HTTP 504를 반환했습니다. 그런 다음 다음 요청을 받았습니다("초기화"가 아니므로 선택한 백엔드 서버를 고수해서는 안 됩니다). ), 이는 대신 다른 서버로 전송되었습니다.

기본적으로 내 문제는 첫 번째 요청에서만 장애 조치를 구현하는 방법입니다. 다른 요청은 항상 선택한 백엔드 서버에 고정되어야 합니다.

관련 정보