Równoważenie obciążenia serwera UDP

10

Mam serwer udp, jest to centralna część mojego procesu biznesowego. aby obsłużyć obciążenia, których oczekuję w środowisku produkcyjnym, prawdopodobnie potrzebuję 2 lub 3 instancji serwera. Serwer jest prawie całkowicie bezstanowy, głównie gromadzi dane, a warstwa nad nim wie, jak obsługiwać minimalną ilość przestarzałych danych, które mogą powstać z wielu instancji serwera.

Moje pytanie brzmi: w jaki sposób mogę wdrożyć równoważenie obciążenia między serwerami? Wolałbym rozdzielić żądania tak równo, jak to możliwe między serwerami. Chciałbym również zachować pewną wierność, tzn. Jeśli klient X zostałby przekierowany na serwer y, to chcę, aby wszystkie kolejne żądania X trafiły na serwer Y, o ile jest to rozsądne i nie powoduje przeciążenia Y.

Nawiasem mówiąc, jest to system .NET ... co byś polecił?


stan jest wewnętrzny w obrębie serwerów, a nie jakaś transakcja. stan to niektóre dane, które serwery agregują z danych, które otrzymują, i można je przywołać za pomocą prostej usługi WCF WebService. Aplikacja oparta jest na UDP i chociaż nie zgadzam się z decyzją, jej „powyżej mojej kategorii płac”

Obecnie wypróbowuję NLB MS, działa ok, robi to z wiernością, ale generuje hałas w całej sieci ...

Również brak DNS ... Och, to jest całkowicie kostiumowy protokół.

Hellfrost
źródło
Tylko uwaga na przyszłość - w wielu przypadkach moderatorzy i użytkownicy o wysokiej reputacji mogą przenosić pytania między stronami stosu wymiany. Pomaga to zachować wszelkie odpowiedzi, które już zostały umieszczone, więc zwykle jest to lepsze niż samodzielne ponowne publikowanie (chyba że nie ma odpowiedzi, w takim przypadku usuń stare pytanie, aby nikt przypadkowo nie odpowiedział). Jeśli zgadzasz się z propozycją przeniesienia, po prostu dodaj komentarz do tego efektu i (jeśli to możliwe) oflaguj swój post, aby zwrócić uwagę moderatora, a post powinien ostatecznie zostać przeniesiony.
bdonlan

Odpowiedzi:

4

Mam serwer udp, [...] serwer jest prawie całkowicie bezstanowy [...] ma pewną wierność, to znaczy jeśli klient X został przekierowany na serwer y, to chcę, aby wszystkie kolejne żądania X trafiły na serwer Y, ponieważ o ile jest to rozsądne i nie przeciąża Y.

Używasz niejawnego protokołu aplikacji, który utrzymuje pewien stan aplikacji i działa na zasadzie UDP? Trochę podążasz w trudnym kierunku. UDP nie jest niezawodnym transportem danych, o to właśnie chodzi - aby uzyskać niezawodny transport danych, zobacz popularnego przyjaciela TCP. Jedynym sposobem na uzyskanie „wierności” jest posiadanie serwera proxy równoważącego obciążenie, który rozumie protokół warstwy aplikacji i który wie, jaki jest obecny stan aplikacji i może działać odpowiednio.

Widzę 3 podejścia, które są bliskie dostarczenia tego, czego szukasz:

  • Statycznie rozkładane połączenia przychodzące na 3 adresy IP na podstawie adresu IP źródłowego (użytkownika końcowego). W ten sposób dany użytkownik będzie zawsze kierowany na ten sam serwer. Większość profesjonalnych zapór ogniowych może to zrobić za Ciebie. Być może będziesz musiał sam uczynić 3 serwery wysoce dostępnymi, ponieważ większość zapór ogniowych nie wykona dla ciebie sprawdzeń kondycji wewnętrznej.

  • Użyj DNS i DNS Round Robin, jak już sugerował Matt Simmons.

  • Użyj wbudowanego w Windows równoważenia obciążenia sieciowego (NLB) . Szczerze mówiąc, nie wiem, w jaki sposób scenariusz przełączania awaryjnego zadziałałby z NLB i twoją półstanową usługą opartą na UDP - musiałbyś sam to zbadać, na podstawie tego, jak aplikacja obsługuje stan. Plusem jest to, że NLB jest bardzo łatwy w konfiguracji, bezpłatny z licencją Windows, dojrzały i dobrze działający.

Jesper M.
źródło
zredagowałem moje pytanie
Hellfrost,
6

Linux Virtual Server to wysoce skalowalny i wysoce dostępny serwer zbudowany na klastrze prawdziwych serwerów. Obsługiwany przez LVS protokół UDP i algorytm skrótu źródłowego (jest używany, gdy chcesz, aby klient zawsze pojawiał się na tym samym serwerze rzeczywistym).

Używam LVM do równoważenia DNS (rr), SIP (sh).

alvosu
źródło
4

Ciekawy. Większość oprogramowania proxy, które widziałem, jest oparte na protokole TCP.

Większość funkcji równoważenia obciążenia specyficznych dla UDP, które widziałem w moich skromnych doświadczeniach, opiera się na DNS (tj. Serwery czasu, serwery DNS itp.). Czy istnieje sposób na zapewnienie wielu rekordów A? Gdyby to zadziałało, normalny Round Robin DNS zapewniłby uczciwą dystrybucję żądań (prawdopodobnie wystarczająco uczciwą), a buforowanie klientów zapewniłoby zachowanie wierności (zakładając, że używasz platformy opartej na pamięci podręcznej po stronie klienta).

Matt Simmons
źródło
w ogóle nie ma DNS.
Hellfrost
2

Aby to zrobić, możesz użyć dowolnego modułu równoważenia obciążenia, zarówno sprzętowego, jak i programowego. Możesz wybierać spośród różnych modułów równoważących obciążenie w zależności od potrzeb.

Moduł równoważenia obciążenia poziomu 3: będzie ładował równowagę tylko na podstawie przychodzących adresów IP i dostępnych adresów IP zaplecza, ten rodzaj modułu równoważenia obciążenia zapewni lepkość, zawsze wysyłając ten sam przychodzący adres IP do tego samego zaplecza, chociaż taka strategia może przeciążać jeden backendów, jeśli wielu klientów korzysta z tego samego adresu IP (czy to proxy, czy bramy korporacyjnej)

Moduł równoważenia obciążenia na poziomie 7 : Moduł równoważenia obciążenia na poziomie 7 nie tylko równoważy się jako moduł równoważenia poziomu 3, ale także analizuje zawartość pakietu, co zapewnia znacznie większą elastyczność w zakresie zasad równoważenia.

Biorąc pod uwagę, że używasz UDP, oba moduły równoważące powinny dawać dobrą wydajność, również głęboka kontrola pakietów w UDP jest nieco bardziej ograniczona niż w przypadku TCP (tylko ze względu na protokół).

W zależności od budżetu możesz zacząć od oprogramowania równoważącego obciążenie (na przykład Linux + IPVS), a następnie zacząć przechodzić do sprzętowych modułów równoważących obciążenie, takich jak oferowane przez Cisco lub Netapp

Lynxman
źródło
-1 dla części L7. Warstwa / Poziom 7 równoważenia obciążenia działa w warstwie aplikacji - ale ponieważ OP używa UDP, nie używa zwykły stary HTTP, a nie ujawniła się, która aplikacja jest używana. Nie wiemy, czy istnieje moduł równoważenia obciążenia L7 dla używanego protokołu operacyjnego.
Jesper M
1
Właśnie komentowałem jego opcje w modułach równoważenia obciążenia i nie wiemy, czego on używa w UDP, myślę, że zbyt ciasno ci to;)
lynxman 31.01.11
Jest coś pomiędzy NLB / linux a Cisco / netapp: loadbalancery KEMP. Możesz zdobyć jego wirtualną edycję, która nie kosztuje mnóstwo pieniędzy, korzystamy z niej i jesteśmy bardzo szczęśliwi.
pauska
2

NGINX typu open source i platforma dostarczania aplikacji, NGINX Plus, teraz obsługują równoważenie obciążenia UDP. Nowa funkcja opiera się na naszych istniejących możliwościach TCP i HTTP, dzięki czemu NGINX jest potężnym, łatwym w użyciu i spójnym frontendem dla jeszcze szerszej gamy aplikacji i urządzeń internetowych.

Dostępne w wersji nginx-1.9.13

anish
źródło