Problem
Używam haproxy do równoważenia obciążenia serwerów sieciowych. Używam trwałości sesji z dodatkowymi plikami cookie, ponieważ niektóre aplikacje używają plików sesji i nie są one synchronizowane między serwerami.
Chcę wyłączyć serwer w celu konserwacji, ale bez przerywania sesji. Chciałbym więc zezwolić istniejącym klientom na kontynuowanie sesji aplikacji, ale nie przyjmować nowych klientów.
zachowanie haproksy
- Ustawiłem serwer na „przejście do konserwacji”
- jeśli klient ma ustawiony plik cookie, użyj serwera, nawet jeśli jest oznaczony jako „przejście do konserwacji”
- jeśli pojawi się nowy klient (bez plików cookie), jest on kierowany na inny serwer
- po tym, jak wszyscy klienci zakończą sesje aplikacji, żaden klient nie będzie miał ustawionego pliku cookie na tym konkretnym serwerze i dobrze byłoby go zamknąć bez zakłóceń dla użytkownika.
Czy uważasz, że można to osiągnąć przy pewnej konfiguracji haproxy? Czy jest na to sprytny sposób?
Inaczej
Niewyczerpująca lista innych sposobów spełnienia tej potrzeby:
- synchronizuj pliki sesji między serwerami (wymaga sposobu synchronizacji plików między kilkoma serwerami lub wspólnego jednego punktu montowania)
- używać bazy danych do przechowywania informacji o sesji (musi zmienić zachowanie aplikacji)
Więcej szczegółów
Używam tego rodzaju konfiguracji:
frontend https-in
bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
reqadd X-Forwarded-Proto:\ https
acl APP1 hdr(host) -i APP1.atac.local
use_backend APP1 if APP1
default_backend _default
backend APP1
redirect scheme https if !{ ssl_fc }
mode http
balance roundrobin
cookie HAPROXY_SESSION insert indirect
option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
server SRV1 SRV1_IP:PORT cookie SRV1 check
server SRV2 SRV2_IP:PORT cookie SRV2 check
Jeśli po prostu wyłączę SRV1 (za pomocą polecenia haproxy cli), myślę, że wszystkie sesje aplikacji otwarte na SRV1 ulegną awarii po zakończeniu bieżącej „sesji” HTTP. Czy to prawda?