haproxy: jak przygotować konserwację serwera bez uruchamiania sesji aplikacji?

13

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?

Christophe Drevet-Droguet
źródło
Czy Twój serwer działa w trybie HTTP lub TCP?
austriacki
1
@austinian; Prawdopodobnie tryb HTTP widzi, jak mówi o równoważeniu i utrzymywaniu na podstawie plików cookie (tryb TCP nie oferuje takich funkcji).
GregL
@Christophe, czy rzeczywiście wypróbowałeś konfigurację opisaną w sekcji „Zachowanie haproxy”, ponieważ powinna ona działać.
GregL
@GregL, właśnie tak myślę. Jeśli używa trybu HTTP i po prostu ustawia serwer w tryb konserwacji, przestanie on akceptować nowe sesje, ale utrzyma prawidłowe sesje, dopóki nie wygasną. Nadal możesz mieć pliki cookie itp. W trybie TCP, ale to nie będzie miało znaczenia dla HAProxy.
austriacki
@Christophe, czy próbujesz użyć „bardziej sprytnego sposobu”, aby skrócić czas konserwacji, czy po prostu szukasz sposobu, aby sesje zakończyły się z wdziękiem podczas oczekiwania na konserwację?
austriacki

Odpowiedzi:

6

Przełącz serwer w tryb drenażu za pomocą interfejsu zarządzania przez Internet. Zapewnia to dokładnie taką funkcjonalność, jakiej szukasz.

austinian
źródło
3
Jeśli ustawisz go Maint, że zamierza zaprzestać wysyłania żadnego ruchu do niego, jak opisano tutaj . Raczej chciałby przełączyć go w tryb Drenu i użyć stick-tablez wygasaniem, aby zapewnić wytrwałość.
GregL
@GregL, ups, naprawiam teraz
austin
Dzięki za odpowiedź, austinian i @GredL. Spróbuję tego. Myślę, że trudna część będzie przy stole do kija. Będę musiał znaleźć sposób na przechowywanie każdego klienta z plikiem cookie ustawionym na serwerze trybu drenażu w tej tabeli.
Christophe Drevet-Droguet
Cóż, wydaje się, że tryb drenażu jest wystarczający w moim przypadku, sesje, które mają już ustawiony plik cookie, nadal używają opróżnionego serwera, a nowe sesje są kierowane na inne serwery.
Christophe Drevet-Droguet
1
Jak zmieniasz tryby w interfejsie internetowym? Wygląda to tylko informacyjnie.
kagronick
9

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 :)

Jhonatan Alarcon
źródło
1

Inaczej

synchronizuj pliki sesji między serwerami (wymaga sposobu synchronizacji plików między kilkoma serwerami lub wspólnego jednego punktu montowania)

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 :)

Cha0s
źródło
Chociaż byłby to lepszy sposób, myślę, że wymaga zmian w kodzie. Więc użyję austinian i GregL, odpowiadając na nasze obecne aplikacje, które nie synchronizują sesji.
Christophe Drevet-Droguet
Jeśli twój kod nie ustawia niestandardowego modułu obsługi sesji, nie musisz zmieniać żadnego kodu, aby PHP używał memcache do sesji. Wszystko jest skonfigurowane w php.ini, a nie w kodzie.
Cha0s,
OK, Cha0s, popatrzę na to.
Christophe Drevet-Droguet