Am două containere docker fiecare cu o aplicație care rulează pe portul 8080. Această aplicație are un punct final REST „/status” care poate semnala dacă aplicația mai are resurse pentru a accepta o altă solicitare a unui utilizator. O cerere de utilizator va fi transmisă și echilibrată către cele două containere de un proxy Apache de echilibrare a încărcăturii.
Ce vreau sa realizez:
- Dacă aplicația dintr-un container semnalează că nu dorește să primească mai multe solicitări, echilibratorul nu va trimite cereri către acest container
- Dacă fiecare rulează semnale de server de aplicații pentru a nu primi nicio solicitare, unul dintre acele servere ar trebui să primească oricum solicitările.
Ce am configurat:
<VirtualHost *:80>
ProxyRequests off
ProxyPreserveHost On
ProxyHCExpr status_ok {hc('body') ~ /Status: ok/}
<Proxy balancer://application-cluster>
BalancerMember http://application1:8080 route=worker1 hcexpr=status_ok hcmethod=get hcuri=/status
BalancerMember http://application2:8080 route=worker2 hcexpr=status_ok hcmethod=get hcuri=/status
BalancerMember http://application1:8080 route=standby status=+H
ProxySet lbmethod=byrequests
</Proxy>
<Location /balancer-manager>
SetHandler balancer-manager
</Location>
ProxyPass /balancer-manager !
ProxyPass / balancer://application-cluster/
ProxyPassReverse / balancer://application-cluster/
</VirtualHost>
După cum puteți vedea aici, aplicația1 este definită ca un standby la cald și ar trebui să fie „victima” pentru a gestiona solicitările dacă toți ceilalți membri Balance sunt „offline” pentru cereri noi
Ce funcționează:
- Solicitările sunt echilibrate de încărcare pentru ambii BalancerMembers.
- application1 și application2 pot semnala să nu primească nicio solicitare. În acest caz, ambii BalancerMembers arată starea așteptată „Init HcFl” pe pagina Balancer Manager.
Ce nu merge:
- application1 nu apare ca standby fierbinte pe pagina Balance Manager
- Prin urmare, cererile nu vor fi transmise aplicației1
Ce este posibil dar nu vreau să fac:
- Dacă configurez hot standby pentru a redirecționa către alt port pe application1, va apărea și va trimite cererile către acest port.
Se pare că Apache elimină doar un BalancerMember dacă gazda și portul sunt egale cu un alt BalancerMember. Îmi lipsește ceva sau există o altă modalitate de a realiza ceea ce îmi doresc?