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?
źródło
Odpowiedzi:
Przełącz serwer w tryb drenażu za pomocą interfejsu zarządzania przez Internet. Zapewnia to dokładnie taką funkcjonalność, jakiej szukasz.
źródło
stick-table
z wygasaniem, aby zapewnić wytrwałość.Jeśli używasz socat do komunikowania się ze swoimi konfiguracjami haproxy, możesz ustawić serwer w stan drenażu w następujący sposób:
echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock
Więcej poleceń tutaj ! Aby zainstalować socat w Ubuntu, przejdź do tej odpowiedzi
Testuję to w wersji haproxy 1.6.3 :)
źródło
Jeśli twoje serwery zaplecza używają PHP dla aplikacji, możesz użyć Memcache do synchronizacji sesji między nimi.
Również Couchbase-Server może wykonywać replikację memcache po wyjęciu z pudełka.
Oczywiście przesadne jest używanie serwera couchbase-server tylko do replikacji sesji :)
źródło