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를 반환했습니다. 그런 다음 다음 요청을 받았습니다("초기화"가 아니므로 선택한 백엔드 서버를 고수해서는 안 됩니다). ), 이는 대신 다른 서버로 전송되었습니다.
기본적으로 내 문제는 첫 번째 요청에서만 장애 조치를 구현하는 방법입니다. 다른 요청은 항상 선택한 백엔드 서버에 고정되어야 합니다.