Używamy Nginx jako load-balancer dla naszej aplikacji websocket. Każdy serwer zaplecza przechowuje informacje o sesji, więc każde żądanie klienta musi zostać przekazane na tym samym serwerze. Więc używamy dyrektywy ip_hash
do osiągnięcia tego celu:Nginx, równoważenie obciążenia za pomocą algorytmów lepkich i najmniejszych połączeń jednocześnie.
upstream app {
ip_hash;
server 1;
}
Problem pojawia się, gdy chcemy dodać kolejny serwer backend:
upstream app {
ip_hash;
server 1;
server 2;
}
Nowe połączenia przejść do serwera 1 i serwer 2 - ale to nie to, co jest potrzebujemy w tej sytuacji, ponieważ obciążenie na serwerze 1 wciąż rośnie - wciąż potrzebujemy lepkich sesji, ale też włączono algorytm least_conn
- więc nasze dwa serwery otrzymują w przybliżeniu jednakowe obciążenie.
Rozważaliśmy także użycie Nginx-sticky-module
, ale dokumentacja mówi, że jeśli nie będzie dostępny żaden lepki plik cookie, to powróci on do domyślnego algorytmu Nginx, tak więc nie rozwiązuje problemu.
Pytanie więc, czy możemy połączyć lepszą i najmniejszą logikę połączeń za pomocą Nginx? Czy wiesz, które inne moduły równoważenia obciążenia rozwiązują ten problem?
Być może to powinno zostać przeniesione do serverfault, aby uzyskać odpowiedź? – Collector
Interesujące pytanie brzmi: "obciążenie serwera 1 wzrasta" - czy większość użytkowników może korzystać z tego samego lub kilku adresów NAT? W tym przypadku hashing na źródłowym IP jest po prostu nieefektywny i możesz rozważyć użycie bardziej wyrafinowanego klucza za pośrednictwem 'hash' dyrekty w przeciwieństwie do' ip_hash '. Na przykład możesz chcieć dodać część klucza URI użytkownika do danego klucza ... – wick
Przydatne odpowiedzi, ale nie jestem pewien, czy odpowiedzieli na pierwotnie zadane pytanie. Alex? –