haproxy: zachowaj istniejące sesje pod dużym obciążeniem, serwuj „503” nowo przybyłym

12

Próbując zrobić to, co napisano w tytule: zachowaj istniejące sesje pod dużym obciążeniem i przekaż 503 wiadomości nowo przybyłym użytkownikom.

Problem: działa, ale sesje nie trwają dłużej niż około 90 sekund.

Obecne wyniki sprawiają, że zastanawiam się, czy brakuje mi limitu czasu.

Cel, powód

Próbuję uzyskać haproxy do:

  • wysyłać żądania nowych sesji do zaplecza-001, gdy łączna liczba sesji w interfejsie jest poniżej określonego progu.
  • podawać błąd 503 do nowych sesji, gdy łączna liczba sesji w interfejsie przekracza ten próg
  • zezwalaj na żądania dotyczące istniejących sesji, nawet jeśli liczba sesji przekroczy próg

W ten sposób odwiedzający, którzy są w trakcie wypełniania wieloetapowego formularza, nie będą zaskoczeni błędem 503, a nowi odwiedzający mogą otrzymać polecenie „wróć później, ponieważ jesteśmy teraz bardzo zajęci”.

Ustawiać

Konfiguracja jest następująca:

            {visitors}
                ↓ 
            [haproxy]
                ↓ 
[rails app on unicorn served by nginx]   (right now just one 
                                            backend: 'backend-001')

obecne podejście

Aby osiągnąć powyższe, używam poniższej konfiguracji.

Ten jest przeznaczony do testowania, z bardzo niskim limitem (10 połączeń na froncie (fe_conn gt 10)), aby ułatwić testowanie.

Aby obciążyć serwer, używam httperf w następujący sposób:

httperf --hog --server staging.machine.tld --uri / do_some_things --wsess = 500,10,30 - stopa 2

global
    daemon
    maxconn 10000

defaults
    mode        http
    timeout connect 6s
    timeout client  60s
    timeout server  60s
    balance roundrobin
    option http-server-close

frontend http-in
    bind [PUBLIC_IP]:80

    default_backend backend-001

    acl too_many fe_conn gt 10
    use_backend b_too_many if too_many

backend backend-001
    fullconn 10
    appsession _session_id len 128 timeout 7200s

    cookie SERVERID insert maxidle 7200s
    server Server1 127.0.10.1:80 cookie backend-001 check

backend b_too_many
    errorfile 503 /var/www/50x.html

problem

Jak wspomniano powyżej, problem polega na tym, że: prawie działa, ale sesje nie trwają dłużej niż około 90 sekund.

Jeśli będziesz klikać, możesz kontynuować sesję, nawet jeśli jest 10 zajętych sesji.

Próba otwarcia strony na serwerze z inną instancją przeglądarki powoduje błąd 503.

Wygląda na to, że już prawie jestem. Czy ktoś ma pojęcie, co może powodować krótkie czasy sesji?

A szczególnie jak to naprawić :)

(edytuj: usunięto „weight 1 maxconn 10” z linii „server”, nie dotyczy i może się mylić) (edytuj drugą: poprawioną „10 sesji w interfejsie” do „10 połączeń w interfejsie”)

Apenootje
źródło
Może to być głupie pytanie - jakie jest ustawienie keep_alive w Nginx? Wygląda na to, że domyślnie są to lata 75. - czy to może być problem?
Aidan Kane

Odpowiedzi:

4

Niestety wydaje się, że całkowicie mylisz połączenia z sesjami na poziomie aplikacji. Użytkownik odwiedzający stronę może mieć plik cookie, który sprawia, że ​​myślisz, że jest właścicielem połączenia, choć niekoniecznie tak jest. Może otworzyć tyle połączeń, ile potrzeba, aby pobrać obiekty i poruszać się po stronach.

90 sekund, które obserwujesz, to z pewnością czas oczekiwania przeglądarki na bezczynne połączenia.

Możliwe jest osiągnięcie tego, co chcesz, ale jest to nieco bardziej skomplikowane, ponieważ musisz również wziąć pod uwagę obecność cookie trwałego w żądaniu, aby dowiedzieć się, czy użytkownik jest nowy, czy nie.

Również ogólnie bardziej efektywne jest poleganie na średniej liczbie połączeń na serwer niż na liczbie połączeń interfejsu użytkownika. Powodem jest to, że kiedy serwer umiera, musisz ponownie ustawić ten numer. Najskuteczniejszym sposobem na to jest skonfigurowanie wartości maxconn serwera, aby umożliwić kolejkowanie, oraz użycie avg_queue, aby limit dotyczył średniej liczby żądań w kolejce na serwerach. Pozwala to poprawnie obsługiwać znanych użytkowników, a jednocześnie przenosić nowych użytkowników do innego zaplecza, gdy obciążenie wzrasta z powodu istniejących użytkowników.

Willy Tarreau
źródło
1
Dziękuję dziękuję! To wiele wyjaśniło. Teraz działam (między innymi) sprawdzając plik cookie zaplecza za pomocą hdr_sub (Więc „hdr_sub (cookie) SERVERID = backend-001”). Po zakończeniu opublikuję działającą konfigurację.
Apenootje