Czy podczas korzystania z równoważenia obciążenia TCP z HAProxy cały ruch wychodzący przepływa przez LB?

19

Konfiguruję aplikację, która ma być hostowana za pomocą maszyn wirtualnych (prawdopodobnie Amazon, ale nie jest to osadzone w kamieniu), które będą wymagały zarówno równoważenia obciążenia HTTP, jak i równoważenia obciążenia dużej liczby (około 50 000, jeśli to możliwe) trwałych połączeń TCP. Ilość danych nie jest aż tak wysoka, ale aktualizacje są częste.

Obecnie oceniam moduły równoważenia obciążenia i jestem trochę zdezorientowany co do architektury HAProxy. Jeśli użyję HAProxy do zrównoważenia połączeń TCP, czy cały wynikowy ruch będzie musiał przepłynąć przez moduł równoważenia obciążenia? Jeśli tak, czy inne rozwiązanie (takie jak LVS, a nawet nginx_tcp_proxy_module) byłoby lepszym rozwiązaniem?

użytkownik122875
źródło

Odpowiedzi:

33

HAProxy (podobnie jak wiele modułów równoważących obciążenie) zazwyczaj utrzymuje dwie rozmowy. Serwer proxy ma sesję (w tym przypadku tcp) z klientem i kolejną sesję z serwerem. Dlatego w przypadku serwerów proxy widzisz 2x połączenia w module równoważenia obciążenia. Dlatego cały ruch przepływa przez moduł równoważenia obciążenia.

Jeśli chodzi o skalowanie w wielu modułach równoważenia obciążenia, nie sądzę, że musisz. Ale praktycznym i dość łatwym sposobem na to jest użycie czegoś takiego jak keepalived z dwoma zmiennymi adresami IP i okrągłym DNS robin pomiędzy tymi dwoma adresami IP. Dzięki Keepalived, jeśli jeden z równoważników obciążenia ulegnie awarii, drugi utrzyma oba adresy IP, dzięki czemu uzyskasz wysoką dostępność w ten sposób. To powiedziawszy, myślę, że będzie dobrze z jednym aktywnym wystąpieniem haproxy z obciążeniem.

HAProxy skaluje się bardzo dobrze. Przykładem sieci Stack Exchange są gniazda sieciowe, które utrzymują otwarte połączenia TCP. Podczas, gdy to piszę, mamy 143 000 ustalonych gniazd TCP na maszynie wirtualnej VMware bez żadnych problemów. Zużycie procesora na maszynie wirtualnej wynosi około 7%.

Przy takiej konfiguracji z HAProxy upewnij się, że ustawiłeś maxconnwystarczająco wysoką wartość . Oto kilka przykładów konfiguracji HAProxy na początek:

frontend fe_websockets
        bind 123.123.123.123:80
        mode tcp
        log global
        option tcplog
        timeout client 3600s
        backlog 4096
        maxconn 50000
        default_backend be_nywebsockets

backend be_nywebsockets
        mode  tcp
        option log-health-checks
        option redispatch
        option tcplog
        balance roundrobin
        server web1 10.0.0.1:1234
        server web2 10.0.0.2:1234
        timeout connect 1s
        timeout queue 5s
        timeout server 3600s
Kyle Brandt
źródło
143 000 - czy to wciąż mówi o gniazdach sieciowych? czy to też inne rzeczy?
Marc Gravell
@MarcGravell: praktycznie wszystkie gniazda sieciowe. Należy pamiętać, że jest to 2x, jak powiedziałem we wstępie, więc serwery gniazd sieciowych zobaczyłyby w sumie ~ 70 tys.
Kyle Brandt
@Kyle - Jakie są powody, dla których potrzebujesz gniazd sieciowych i trwałych połączeń TCP? Ta witryna nie wydaje się mieć żadnych funkcji w czasie rzeczywistym, które tego wymagałyby.
Kontynuacja
@ Kontynuacja: Dostępnych jest wiele funkcji w czasie rzeczywistym, w tym powiadomienia w skrzynce odbiorczej, głosy, zmiany, nowe komentarze / odpowiedzi / pytania. Nie jestem pewien, czy są one włączone tylko dla użytkowników z pewnym ograniczeniem liczby powtórzeń, jeśli ich nie widzisz, możesz zapytać na meta.stackoverflow.com
Kyle Brandt
1
@KyleBrandt czy to działa również w trybie TCP?
elslooo,
2

Tak, cały ruch powinien zwykle przechodzić przez moduł równoważenia obciążenia. Żądania są odbierane przez moduł równoważenia obciążenia, a odpowiedzi są wysyłane z powrotem do modułu równoważenia obciążenia, który odsyła je z powrotem do klientów.

Przy wyborze odpowiedniego narzędzia nie mam dużego doświadczenia w zakresie innych opcji. Używam haproxy i jest naprawdę dobry i stabilny i może obsłużyć duży ruch. Ponadto jego możliwości ACL są świetne.

Khaled
źródło
2

Istnieje możliwość użycia i skonfigurowania DSR (Direct Server Return), ale nie ma to nic wspólnego z Loadbalancer, ale jest skonfigurowane na stosie tcp (tabele routingu). Używaliśmy tego w dużym portalu do przesyłania strumieniowego wideo. Chociaż działa, spowoduje znaczny ból głowy związany z koniecznością złożoności routingu.

Dlatego nie zalecałbym używania tej techniki bez bardzo dokładnego rozważenia zastosowania i wad.

Być może są jakieś wskazówki, aby zacząć:

Baw się dobrze!

Andreas Balg
źródło