Puncte:1

HAProxy 2.0 - reîncercarea unor solicitări bazate pe URL

drapel jp

Am HAProxy versiunea 2.0.14 instalată și caut un caz de utilizare deosebit pe care încă nu am reușit să îl configurez corect.

Practic, am un frontend care ascultă pe un port și două servere backend. Odată ce o sesiune este pornită, cookie-urile sunt folosite, astfel încât o sesiune este legată de un anumit server de backend și nu poate fi partajată la un alt server. Pentru a realiza asta folosesc stick-masa și stai pe cuvinte cheie și un script LUA pentru a obține valoarea necesară din solicitări.

Cu toate acestea, când sosește prima solicitare, dacă serverul backend selectat nu răspunde la timp, ar trebui să trecem la celălalt, deoarece în acel moment cookie-ul nu este încă setat.

Pana acum am urmatoarea configuratie:

global
   log 127.0.0.1 len 10000 local2 depanare
   chroot /var/lib/haproxy
   utilizator haproxy
   haproxy de grup
   demonul
   lua-load /opt/LUA/myparser.lua

   socket statistici /etc/haproxy/haproxysock nivel admin

implicite
   jurnal global
   opțiunea httplog
   opțiunea dontlognull
   modul http
   timeout connect 5000
   timeout client 50000
   server timeout 50000
   format de jurnal „IP client:port = [%ci:%cp], Ora de pornire = [%tr], Nume front-end = [%ft], Nume backend = [%b], Server back-end = [%s], Ora pentru a primi cererea completă = [%TR ms], Timp de răspuns = [%Tr ms], Cod de stare = [%ST], Bytes Read = [%B]"

frontend chatgw_front
   lega*:8776

   opțiunea http-buffer-request
   declara cererea de capturare 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
   echilibru roundrobin

   stick-masa tip string len 32 dimensiune 30k expira 30m
   rămâneți pe tabelul „lua.parseId” my_back

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

Ceea ce face aceasta este dacă serverul backend selectat nu răspunde în 50 de secunde, acesta trimite clientului un HTTP 504 Gateway Timeout. Ceea ce mi-ar trebui în schimb este, dacă aceasta este prima solicitare dintr-o sesiune, atunci (și numai apoi) trecerea la un alt server backend. Putem spune că aceasta este prima solicitare pe baza adresei URL.

Am încercat să schimb backend-ul astfel:

backend my_back
   echilibru roundrobin

   stick-masa tip string len 32 dimensiune 30k expira 30m
   rămâneți pe tabelul „lua.parseId” my_back

# Verificați dacă aceasta este cererea „init”: în acest caz, adresa URL conține „/init”
   acl is_init calea_sub /init

# În cazul solicitării „init”, activați redistribuirea către alt server backend în caz de eșec
   opțiunea redispatch if is_init

# În cazul altor solicitări (nu „init”), suntem deja legați de un server backend selectat din cauza cookie-ului de sesiune, așa că dezactivați redistribuirea
   nicio opțiune redispatch dacă !is_init

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

Totuși am avut exact același comportament. Așa că am încercat să adaug „retry-on”:

backend my_back
   echilibru roundrobin

   stick-masa tip string len 32 dimensiune 30k expira 30m
   rămâneți pe tabelul „lua.parseId” my_back

   acl is_init calea_sub /init

   opțiunea redispatch if is_init

   nicio opțiune redispatch dacă !is_init

   reîncercați conn-failure răspuns gol-timeout

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

Acum, este diferit: a încercat cererea inițială de 4 ori pe același server și apoi a returnat HTTP 504. Apoi a primit următoarea solicitare (care nu este „init”, așa că nu ar trebui să se lipească de serverul backend selectat ), iar acesta a fost trimis pe celălalt server.

Practic, problema mea este: cum să implementez failover-ul numai la prima solicitare? Orice altă solicitare trebuie să se lipească întotdeauna de serverul backend selectat.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.