Skocz do zawartości
mix091

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

Polecane posty

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.

Udostępnij ten post


Link to postu
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

Udostępnij ten post


Link to postu
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).

Edytowano przez mariaczi

Udostępnij ten post


Link to postu
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  :)

Udostępnij ten post


Link to postu
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?

Edytowano przez mix091

Udostępnij ten post


Link to postu
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.

 

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dołącz do rozmowy

Możesz pisać i zarejestrować się później. Jeśli masz konto,Zaloguj się teraz, aby publikować na swoim koncie.

Gość
Odpowiedz...

×   Wklejony jako tekst z formatowaniem.   Wklej jako zwykły tekst

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


  • Podobna zawartość

    • Przez cyber73
      Firma Krówka poszukuje osoby do wykonania poniższych usług:

      - aktualizacja php do wersji 7
      - aktualizacja apache2 do najnowszej wersji (obecnie to 2.4.10)
      - sprawdzenie co wywołuje błąd, który pojawił się wczoraj wieczorem: Bug Tracker error caught

      Dane zleceniodawcy:
      Krówka Sp. z o.o.
      Witosa 135
      16-100 Sokółka
      Nip: 545 181 37 94
       
      Tylko faktura vat.
  • Kto przegląda   0 użytkowników

    Brak zalogowanych użytkowników przeglądających tę stronę.

×
×
  • Utwórz nowe...

Ważne informacje

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