Skocz do zawartości
  • Cześć!

    Witaj na forum RootNode - aby pisać u nas musisz się zarejestrować, a następnie zalogować. Posty pisane z kont niezarejestrowanych nie są widoczne publicznie.

Przekierowanie ruchu na serwer "oczekujący", w przypadku przeciążenia głównego.


mix091

Rekomendowane odpowiedzi

Cześć wszystkim,

 

Poszukuje rozwiązania, które będzie w stanie pokierować ruchem HTTP w taki sposób, że jeżeli główny serwer www osiągnie np. 100 aktywnych userów, to 101 osoba zostanie przekierowana na serwer ze statyczną stroną informującą, że serwery są przeciążone i proszę spróbować za chwile. Jak się domyślam coś takiego, jest pewnie do osiągnięcia, wystawiając swego rodzaju load-balancer na front przed serwer aplikacyjny. Czy możecie podpowiedzieć mi, czy istnieją takie rozwiązania i jeżeli tak to gdzie ich szukać? Może źle szukam i wcale nie trzeba tutaj żadnego load-balancera, tylko wystarczy jakiś mod do apache2, który będzie zarządzał połączeniami w taki sposób na samym serwerze aplikacyjnym? 

 

Pozdrawiam mix091.

Odnośnik do komentarza
Udostępnij na innych stronach

Klasyczny request HTTP otwiera połączenie z serwerem  i zamyka po udzieleniu odpowiedzi do klienta,  więc tym świetle patrząc  nie ma czegoś takiego jak "aktywni userzy online" .
Podobnie jest z połączenie do bazy danych w skryptach PHP przeważnie jest zamykane "na koniec skryptu" .

 

Ilość osób online przeważnie określa się zapisując do bazy czas ostatniego wejścia/przeładowania strony z danego IP i zliczając ilość rekordów o określonym czasie życia. Zamiast zapisu do bazy bazy danych można w tym celu wykorzystać np REDIS'a jako bazę pamięciowa dodając do niej IP z określonym czasie życia np 1 minuta i podobnie jak w wypadku bazy danych zliczając ilość rekordów. 

 

Składając to w całość w skrypcie PHP (lub innym w zależności od wykorzystanego języka) w głównym kontrolerze lub middlewarze sprawdzane było by  ile jest userów online i jeśli ilość jest większa niż te (n) 100, blokowane sa dalsze akcje skryptu komunikatem np: "Wykorzystano liczbę dostępnych zasobów" ... W wypadku zastosowania redisa zliczanie userów online było by operacja relatywnie tanią.

 

 IMHO Load balancera rozkładają ruch na (n) serwerów, ale nie maja informacji o tym ilu zostaje na nich "online".

 

 

  • Lubię 1
Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem, czy nie dało by się tego czasem zrobić za pomocą HAProxy z ustawieniem możliwej ilości połączeń wraz z określeniem co ma się otworzyć "w przypadku błędu" (czyt. ilość dozwolonych połączeń zostanie osiągnięta).

Edytowane przez mariaczi
Odnośnik do komentarza
Udostępnij na innych stronach

39 minut temu, mariaczi napisał:

"w przypadku błędu" (czyt. ilość dozwolonych połączeń zostanie osiągnięta).

Ale HProxy nie ma informacji o stanie docelowego serwera innych niż co określony czas odpytanie ( próbkowanie)o statu HTTP 200.  W wypadku braku odpowiedzi HProxy lub inny loadbalancer taki serwer wykluczy. Zatem takie rozwiązanie by zablokowało ruch,  wymagało/dopuszczało by do wywalenie serwera aplikacji po przez przeciążenie i HTTP != 200 . 

Chyba, że HPorxy lub inny load balancer ma mechanizm zliczanie requestów  i w wypadku osiągnięcia (n) w ciągu określonego czau kolejne żądania kieruje na następny w kolejności serwer  :)

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki Wam za odpowiedzi.

Jeżeli chodzi o apache, to myślałem bardziej o czymś takim, żeby wykorzystać np. mpm eventa, który bazuje na workerze, ale daje nam możliwość ustawienia keepalive, do podtrzymania połączeń http. Można wtedy ustawić timeout takich połączeń np. na 30 sekund, co by chyba skutkowało tym że 100 userów miałoby 100 połączeń established do serwera i w jednym połączaniu tcp przepychaliby wszystkie requesty. Wtedy wystarczyłoby tylko przekierować w jakiś sposób ten "101" request. Czy takie coś ma sens, czy w ogóle mam złe wyobrażenie o tym jak to działa?

Edytowane przez mix091
Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem czy w tym wypadku by zadziałała kombinacja KeepAlive  z  MaxKeepAliveRequests

http://httpd.apache.org/docs/2.2/mod/core.html#maxkeepaliverequests

Wtedy jak by serwer wywalił błąd pewnie 500 trzeba by obsłużyć domyślna stronę błędu Apche informacyjną o przekroczeniu puli klientów na serwerze.

 

IMHO zliczanie userów online wydaje mi się rozwiązaniem tego typu problemu. Gdyż ci co już weszli do puli IP do 100 są obsługiwani, a następni dopiero mogą wejść jak ktoś z tej puli wypadnie po przez przekroczenie czasu bezczynności  (n) sekund.

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Korzystając z forum, wyrażasz zgodę na: Warunki użytkowania, Regulamin, Polityka prywatności.