Jak dobrze nginx i memcached współpracują ze sobą?

14

Mamy aplikację internetową opartą na Java EE działającą w klastrze serwerów aplikacji Glassfish . Przychodzący ruch będzie głównie żądaniami RESTful dotyczącymi reprezentacji opartych na XML zasobów naszych aplikacji, ale być może 5% ruchu może dotyczyć reprezentacji opartych na JSON lub XHTML / CSS.

Obecnie badamy rozwiązania równoważenia obciążenia w celu rozdzielenia ruchu przychodzącego między instancjami Glassfish w klastrze. Szukamy również sposobu na rozładowanie klastra za pomocą memcached, rozproszonej w pamięci mapy mieszającej, której kluczami byłyby nazwy zasobów REST (np. „/ User / bob”, „/ group / jazzlovers”) i których wartości to odpowiednie reprezentacje XML.

Jednym z podejść, które brzmi obiecująco, jest zabicie obu ptaków jednym kamieniem i użycie lekkiego, szybkiego serwera HTTP / odwrotnego proxy nginx . Nginx obsługiwałby każde przychodzące żądanie, najpierw sprawdzając swój identyfikator URI w memcached, aby sprawdzić, czy istnieje już nieaktualna reprezentacja XML. Jeśli nie, nginx wysyła żądanie do jednej z instancji Glassfish. Moduł memcached nginx został opisany w tym krótkim piśmie .

Jakie jest twoje ogólne wrażenie z użyciem nginx i memcached w ten sposób, jak bardzo jesteś z nich zadowolony? Jakie zasoby były dla Ciebie najbardziej pomocne w poznawaniu ich? Jeśli spróbowałeś ich, a one nie pasowały do ​​twoich celów, dlaczego nie i czego użyłeś zamiast tego?

Uwaga: oto powiązane pytanie . Zanim dowiedziałem się o ServerFault, zapytałem o to na StackOverflow .

Edycja: Wszystkie dotychczasowe odpowiedzi były bardzo pomocne, chociaż nie było bezpośredniego doświadczenia. Ta odpowiedź ostatecznie pojawiła się na StackOverflow i była dość uparta w konfiguracji nginx / memcached.

Jim Ferrans
źródło
Fajnie, zrobi. Prawdopodobnie będziemy eksperymentować z tym w ciągu najbliższego miesiąca
Jim Ferrans

Odpowiedzi:

6

Naprawdę powinieneś użyć serwera pamięci podręcznej przed serwerami WWW. Polecam pamięć podręczną lakieru. Używamy go w pracy z największą i najbardziej ruchliwą stroną internetową w Skandynawii. Zastąpiliśmy 13 mocno obciążonych skrzynek kalmarów 1 skrzynią lakierniczą i 1 zapasową.

Zredagowałem prostą aplikację na mojej prywatnej stronie i zmieniła się ona z 9 żądań na sekundę na ponad 2000.

Ty decydujesz, jak długo utrzymuje to w pamięci, możesz zrobić do końca czasu, a następnie po prostu wysłać żądanie czyszczenia HTTP do serwera pamięci podręcznej, gdy dane się zmienią.

Trausti Thor
źródło
1
Ale pamięć podręczna nginx jest wyraźnie szybsza niż Varnish .
VBart
4

Z mojego osobistego doświadczenia wynika, że ​​jeśli używasz modułu równoważenia obciążenia, chcesz całkowicie ograniczyć to pole do funkcji równoważenia obciążenia. Posiadanie przez moduł równoważenia obciążenia treści, nawet z pamięci podręcznej, obniża funkcjonalność równoważenia obciążenia w sytuacjach dużego obciążenia (więcej połączeń pozostaje aktywnych dłużej, zmniejszając ogólną pojemność i przepustowość).

Radzę, aby sama aplikacja przeprowadziła wyszukiwanie i udostępniła buforowaną zawartość i pozwoliła modułowi równoważenia obciążenia wykonać swoją pracę. Powiedziawszy to, nginx nie jest idealny, jeśli chodzi o równoważenie obciążenia - oferuje tylko bardzo podstawowy algorytm round-robin. Zamiast tego poleciłbym haproxy. Jeśli potrzebujesz usług deszyfrowania SSL z przodu, nginx działa dobrze, siedząc przed haproxy, z mojego doświadczenia.

Chris
źródło
1

Myślę, że przejdziesz w ślepy zaułek na wypadek, gdybyś potrzebował takich rzeczy jak równoważenie obciążenia, wysoka dostępność itp.

Weź również pod uwagę taką sytuację: gdy użytkownik jest autoryzowany, strona wygląda inaczej, a dodatkowe funkcje są dostępne i zindywidualizowane dla każdego użytkownika. Adresy URL są takie same dla wygody linkowania itp. Na przykład strona, na której użytkownik nie musi wpisywać swojego imienia / captcha w celu skomentowania lub witryna wyświetla twoją nazwę użytkownika na górze, gdy jesteś zalogowany (jak błąd serwera). W takich przypadkach nginx będzie bezużyteczny, ponieważ nie można odróżnić użytkownika automatycznie od nieautoryzowanego.

Jeśli nie potrzebujesz SSL, sugeruję uruchomienie Varnish. Został zaprojektowany jako akcelerator HTTP, a nie jako serwer WWW lub proxy. Jeśli potrzebujesz SSL, uruchom nginx na górze jako akcelerator SSL i lakieruj jako zwykły akcelerator HTTP, ponieważ Varnish nie radzi sobie z SSL.

Myślę, że wybór serwera buforującego zależy od aplikacji i nie można na ten temat uogólniać komentarzy bez dogłębnej analizy aplikacji.

Kristaps
źródło
1

mój wybór to haproksy. Bardzo mały i bardzo szybki odwrotny serwer proxy, ale nie jest to serwer proxy pamięci podręcznej! Używam dla mojego systemu pamięci podręcznej „Squid Web Proxy”

CACHE /squid/ -> Load-balancing /Haproxy/ -> WEB I /lighttpd/
                                          -> WEB II /lighttpd/
                                          -> WEB III /lighttpd/

Działa idealnie dla mojego systemu internetowego

Yordan
źródło