Pytanie Zalecenia dotyczące architektury strony internetowej ASP.NET równoważonej obciążeniem


AKTUALIZACJA 2009-05-21

Testowałem # 2 metodę korzystania z jednego udziału sieciowego. Powoduje to pewne problemy z systemem Windows Server 2003 pod obciążeniem:

http://support.microsoft.com/kb/810886

koniec aktualizacji

Otrzymałem propozycję dla witryny ASP.NET, która działa w następujący sposób:

Sprzętowy load-balancer -> 4 serwery IIS6 -> SQL Server DB z klastrem pracy awaryjnej

Oto problem ...

Wybieramy gdzie przechowywać pliki sieciowe (aspx, html, css, images). Zaproponowano dwie opcje:

1) Utwórz identyczne kopie plików internetowych na każdym z 4 serwerów IIS.

2) Umieść pojedynczą kopię plików internetowych w udziale sieciowym dostępnym dla 4 serwerów WWW. Strony internetowe na 4 serwerach IIS zostaną zmapowane na pojedynczy udział sieciowy.

Które jest lepsze rozwiązanie? Opcja 2 jest oczywiście łatwiejsza do wdrożenia, ponieważ wymaga kopiowania plików tylko do jednej lokalizacji. Zastanawiam się jednak, czy pojawią się problemy z skalowalnością, ponieważ cztery serwery WWW uzyskują dostęp do jednego zestawu plików. Czy IIS będzie przechowywać te pliki lokalnie? Czy trafiłby w udział sieciowy na każde żądanie klienta? Czy dostęp do udziału sieciowego będzie zawsze wolniejszy niż uzyskanie pliku na lokalnym dysku twardym? Czy obciążenie udziału sieciowego staje się znacznie gorsze, jeśli dodanych zostanie więcej serwerów IIS?

Aby dać perspektywę, jest to strona internetowa, która obecnie otrzymuje ~ 20 milionów odsłon miesięcznie. W ostatnim szczycie otrzymywało około 200 trafień na sekundę.

Daj mi znać, jeśli masz szczególne doświadczenie z taką konfiguracją. Dzięki za wejście.

AKTUALIZACJA 2009-03-05

Aby wyjaśnić moją sytuację, "wdrożenia" w tym systemie są znacznie częstsze niż typowa aplikacja internetowa. Strona internetowa jest front end dla CMS back office. Za każdym razem, gdy treść jest publikowana w CMS, nowe strony (aspx, html, itp.) Są automatycznie przesyłane do witryny na żywo. Wdrożenia są w zasadzie "na żądanie". Teoretycznie może to nastąpić kilka razy w ciągu minuty lub dłużej. Nie jestem więc pewien, czy wdrożenie jednego serwera na czas byłoby praktyczne. Myśli?


13
2018-03-05 04:31


pochodzenie




Odpowiedzi:


Podzielę obciążenie między 4 serwery. To nie jest tak wiele.

Nie chcesz tego pojedynczego punktu spornego ani podczas wdrażania, ani tego pojedynczego punktu awarii w produkcji.

Podczas wdrażania możesz zrobić je po jednym na raz. Twoje narzędzia do wdrażania powinny zautomatyzować to, powiadamiając system równoważenia obciążenia, że ​​serwer nie powinien być używany, wdrażając kod, wszelkie potrzebne prace poprzedzające kompilację, a na koniec powiadamiając system równoważenia obciążenia, że ​​serwer jest gotowy.

Zastosowaliśmy tę strategię w farmie serwerów z ponad 200 serwerami sieciowymi i działała ona dobrze podczas wdrażania bez przerwy w świadczeniu usług.


22
2018-03-05 04:51



+1 robimy to samo - weźmy serwer "bez rotacji", wdrażamy, rozgrzewamy, powracamy do rotacji. - Rex M
+1 jedyny sposób na zrobienie tego. Nazwaliśmy to "mieszanką" i "brakiem miksu". - DancesWithBamboo
+1 jest to proces wypróbowany w czasie. Dodano odpowiedź na pytanie, jak radzić sobie z wysoką częstotliwością aktualizacji. - eglasius


Jeśli twoim głównym zmartwieniem jest wydajność, co do której zakładam, że wydajesz wszystkie te pieniądze na sprzęt, to nie ma sensu dzielić sieciowego systemu plików tylko ze względu na wygodę. Nawet jeśli dyski sieciowe są wyjątkowo wydajne, nie będą działać tak dobrze, jak dyski rodzime.

Wdrożenie zasobów sieciowych jest tak czy inaczej zautomatyzowane (prawda?), Więc robienie tego w wielokrotnościach nie jest tak naprawdę niewygodne.

Jeśli jest to bardziej skomplikowane, niż sobie na to pozwalasz, to może coś w rodzaju DeltaCopy byłoby użyteczne, aby te dyski były zsynchronizowane.


6
2018-03-05 04:52



Jeśli chodzi o twój ostatni komentarz, oprogramowanie synchronizujące jest prawdopodobnie dobrym rozwiązaniem. DeltaCopy jest darmowa, istnieją inne, prawdopodobnie bardziej odpowiednie aplikacje, takie jak tgrmn.com/web/file_synchronization.htm i jest wiele takich naprawdę firmowych / drogich. - JeremyWeir
@jayrdub spowodowałoby to odtworzenie asp.netu dla każdej zmiany bez treści, tj. .config, global.asax, dlls. Biorąc pod uwagę wspólny ładunek strony, musisz użyć procesu takiego, jak ten w odpowiedzi Mufaki, aby uzyskać bardziej stabilny proces wdrażania. Dodano odpowiedź na pełną liczbę scenariuszy aktualizacji. - eglasius
@freddy, jeśli zasoby .net to aspnet_compiler-ed, to prawdopodobnie nie będzie zauważalna jazda w domenie appdomain. Zrzucanie sesji byłoby problemem, jeśli są one uruchomione, ale mam nadzieję, że nie, ponieważ są zrównoważone pod względem obciążenia. Jeśli aktualizacje treści są naprawdę częste, przenoszenie serwerów do / z LB może nie być praktyczne - JeremyWeir
jeśli chodzi o kolarstwo w Appdomain, o tym, o czym tu mówimy, może pomóc MaxWaitChangeNotification msdn.microsoft.com/en-us/library/e1f13641.aspx  pomocny: blogs.msdn.com/tess/archive/2006/08/02/... - JeremyWeir


Jednym z powodów, dla którego udział centralny jest zły, jest to, że NIC na serwerze współdzielenia stanowi wąskie gardło dla całej farmy i tworzy pojedynczy punkt awarii.


3
2018-03-05 05:37



Tak, dlatego zwykle używasz podwójnych serwerów NIC, przełączanej sieci gigabitowej w środku, pamięci podręcznej i nadmiarowego klastrowego serwera plików. Brzmi to jak wiele "rzeczy", ale chodzi o to, że wydając 1000 dolarów w sieci, aby uniknąć powtarzania, zbędne zadania administracyjne to dobra inwestycja. - Cheeso


W przypadku usług IIS6 i 7 scenariusz korzystania z pojedynczego udziału sieciowego na dołączonych serwerach serwerów aplikacji / aplikacji jest wyraźnie obsługiwany. MS wykonało masę perfekcyjnych testów, aby upewnić się, że ten scenariusz działa dobrze. Tak, używane jest buforowanie. Dzięki dwóm serwerom NIC, jednemu dla publicznego internetu i jednemu dla sieci prywatnej, osiągniesz naprawdę dobrą wydajność. Wdrożenie jest kuloodporne.

Warto poświęcić trochę czasu, aby to sprawdzić.

Można również ocenić dostawcę wirtualnej ścieżki programu ASP.NET, który umożliwi wdrożenie jednego pliku ZIP dla całej aplikacji. Lub, dzięki CMS, możesz serwować zawartość bezpośrednio z bazy danych zawartości, a nie z systemu plików. Przedstawia kilka naprawdę fajnych opcji do wersjonowania.

VPP Dla ZIP przez #ZipLib.

VPP dla ZIP poprzez DotNetZip.


2
2018-03-28 18:53





W idealnej sytuacji wysokiej dostępności nie powinno być pojedynczego punktu awarii.

Oznacza to, że pojedyncze pudełko ze stronami internetowymi na nim jest nie. Po wykonaniu prac HA dla dużego Telco, początkowo proponuję następujące:

  • Każdy z czterech serwerów ma swoją własną kopię danych.
  • W czasie spokojnym, przenieś dwa serwery w tryb off-line (tj. Zmodyfikuj stabilizator HA, aby je usunąć).
  • Zaktualizuj dwa serwery off-line.
  • Zmodyfikuj układ równoważenia HA, aby rozpocząć korzystanie z dwóch nowych serwerów, a nie dwóch starych serwerów.
  • Sprawdź to, aby zapewnić poprawność.
  • Zaktualizuj dwa pozostałe serwery, a następnie przestaw je w tryb online.

W ten sposób można to zrobić bez dodatkowego sprzętu. W retorycznym świecie Telco, nad którym pracowałem, oto, co byśmy zrobili:

  • Mielibyśmy osiem serwerów (w tamtym czasie mieliśmy więcej pieniędzy, niż mogliśmy włożyć do kija). Gdy nadejdzie czas przejścia, cztery serwery offline zostaną skonfigurowane z nowymi danymi.
  • Następnie moduł równoważenia HA zostałby zmodyfikowany tak, aby korzystać z czterech nowych serwerów i przestał używać starych serwerów. To sprawiło, że przełączenie (i, co ważniejsze, zwrotne, jeśli zapakowaliśmy), było bardzo szybkim i bezbolesnym procesem.
  • Dopiero gdy nowe serwery działały przez jakiś czas, rozważymy następne przełączenie. Do tego czasu cztery stare serwery były przechowywane w trybie off-line, ale na wszelki wypadek.
  • Aby uzyskać ten sam efekt przy mniejszych nakładach finansowych, możesz mieć dodatkowe dyski zamiast całych dodatkowych serwerów. Odzyskiwanie nie byłoby tak szybkie, ponieważ trzeba by wyłączyć serwer, aby przywrócić stary dysk, ale nadal byłby szybszy niż operacja przywracania.

2
2018-04-01 02:28





Byłem odpowiedzialny za rozwój witryny internetowej z grami, która osiągnęła 60 milionów odsłon miesięcznie. Sposób, w jaki to zrobiliśmy, to opcja nr 1. Użytkownik mógł przesyłać obrazy i takie, które zostały umieszczone na serwerze NAS, który był współużytkowany przez serwery. Wyszło całkiem nieźle. Zakładam, że robisz także buforowanie stron i tak dalej, po stronie aplikacji w domu. Wprowadziłbym również na żądanie nowe strony do wszystkich serwerów jednocześnie.


1
2018-03-31 19:53





Co zyskujesz na NLB z 4IIS, tracisz go dzięki BottleNeck z serwerem aplikacji.

Skalowalność zalecam aplikacjom na frontowych serwerach internetowych.

Tutaj w mojej firmie wdrażamy to rozwiązanie. Aplikacja .NET na frontach i serwer aplikacji dla Sharepoint + klaster SQL 2008.

Mam nadzieję, że to pomoże!

pozdrowienia!


0
2018-03-25 18:21





Mamy podobną sytuację, a naszym rozwiązaniem jest wykorzystanie modelu wydawcy / subskrybenta. Nasza aplikacja CMS przechowuje rzeczywiste pliki w bazie danych i powiadamia usługę publikowania, gdy plik został utworzony lub zaktualizowany. Ten wydawca powiadamia następnie wszystkie subskrybujące aplikacje internetowe, a następnie pobiera i pobiera plik z bazy danych i umieszcza go w swoich systemach plików.

Mamy abonentów ustawionych w pliku konfiguracyjnym na wydawcy, ale możesz przejść cały świstek i mieć aplikację internetową, aby sama subskrybować podczas uruchamiania aplikacji, aby jeszcze łatwiej było zarządzać.

Możesz użyć UNC do przechowywania, wybieramy DB dla wygody i przenośności pomiędzy środowiskami produkcyjnymi i testowymi (po prostu kopiujemy DB z powrotem i mamy wszystkie pliki live site oraz dane).


0
2018-03-26 17:31





Bardzo prostą metodą instalacji na wielu serwerach (po prawidłowym skonfigurowaniu węzłów) jest użycie robocopy.

Najlepiej będzie mieć mały serwer pomostowy do testowania, a następnie wykonać "robocopy" na wszystkich serwerach wdrożeniowych (zamiast korzystać z udziału sieciowego).

Robocopy jest zawarty w MS ResourceKit - używaj go za pomocą przełącznika / MIR.


0
2018-03-26 19:58





Aby dać ci coś do myślenia, możesz na coś popatrzeć Microsoft Live Mesh . Nie mówię, że to odpowiedź dla ciebie, ale może to być model przechowywania, którego używa.

Za pomocą Mesh pobierz małą usługę Windows na każdy komputer Windows, który chcesz w swojej Siatce, a następnie wyznacz foldery w systemie, które są częścią siatki. Kiedy kopiujesz plik do folderu Live Mesh - co jest dokładnie tą samą operacją co kopiowanie do dowolnego innego systemu w twoim systemie - usługa dba o synchronizację tego pliku z wszystkimi innymi uczestniczącymi urządzeniami.

Jako przykład przechowuję wszystkie pliki źródłowe kodu w folderze Mesh i synchronizuję je między pracą a domem. Nie muszę nic robić, aby zsynchronizować akcję zapisywania pliku w VS.Net, notatniku lub jakiejkolwiek innej aplikacji inicjującej aktualizację.

Jeśli masz stronę internetową z często zmieniającymi się plikami, które muszą przejść do wielu serwerów i prawdopodobnie zmieniają autorów tych zmian, możesz umieścić usługę Mesh na każdym serwerze sieciowym i jako autorzy dodali, zmienili lub usunęli pliki, które byłyby uaktualnione. pchnął automatycznie. Jeśli chodzi o autorów, to po prostu zapisywali swoje pliki w normalnym starym folderze na swoim komputerze.


0
2018-03-27 08:50



Technologia Live Mesh jest bardziej odpowiednia do synchronizacji danych użytkownika końcowego. Bardziej odpowiednią technologią dla środowiska serwerowego jest coś podobnego do replikacji systemu plików DFS wbudowanego w system Windows Server 2003 R2 i nowszy. - Ryan Bolger
Tak, może, ale znowu, gdybyś miał wielu rozproszonych użytkowników spoza sieci korporacyjnej, którzy musieliby przekazywać aktualizacje, wtedy DFS nie jest dobry. Tak, możesz umieścić VPN dla zdalnych użytkowników, ale moim punktem w LiveMesh jest to, że nie byłoby nic do zrobienia. - sipwiz


Użyj narzędzia do wdrażania, z procesem, który wdraża jeden na raz, a reszta systemu działa (jak powiedział Mufaka). Jest to wypróbowany proces, który będzie działał zarówno z plikami zawartości, jak i dowolną skompilowaną częścią aplikacji (która to implementacja powoduje odtworzenie procesu asp.net).

Dotyczące stawka aktualizacji to jest coś, co możesz kontrolować. Czy aktualizacje przechodzą przez kolejkę i mają jeden proces wdrażania, który kontroluje, kiedy wdrożyć każdy element. Uwaga: nie oznacza to, że każda aktualizacja jest przetwarzana osobno, ponieważ można pobrać bieżące aktualizacje w kolejce i wdrożyć je razem. Kolejne aktualizacje pojawią się w kolejce i zostaną pobrane po zakończeniu obecnego zestawu aktualizacji.

Aktualizacja: O pytania w komentarzu. Jest to niestandardowe rozwiązanie oparte na moim doświadczeniu z ciężkimi / długimi procesami, które wymagają kontrolowania liczby aktualizacji. Nie miałem potrzeby używać tego podejścia do scenariuszy wdrażania, ponieważ dla takiej dynamicznej zawartości zwykle używam kombinacji DB i pamięci podręcznej na różnych poziomach.

Kolejka nie musi zawierać pełnych informacji, wystarczy mieć odpowiednie informacje (identyfikatory / ścieżki), które pozwolą procesowi przekazać informacje do rozpoczęcia procesu publikowania za pomocą zewnętrznego narzędzia. Ponieważ jest to kod niestandardowy, możesz go dołączyć do informacji, które mają zostać opublikowane, więc nie musisz zajmować się tym w procesie / narzędziu publikacji.

Zmiany DB zostaną wykonane podczas procesu publikowania, ponownie musisz tylko wiedzieć, gdzie znajdują się informacje o wymaganych zmianach i pozwolić procesowi / narzędziu publikacji go obsłużyć. Jeśli chodzi o to, czego użyć dla kolejki, główne, których użyłem, to msmq i niestandardowa implementacja z informacjami w serwerze sql. Kolejka jest właśnie po to, aby kontrolować szybkość aktualizacji, więc nie potrzebujesz niczego specjalnie ukierunkowanego na wdrożenia.

Aktualizacja 2: upewnij się, że twoje zmiany DB są kompatybilne wstecznie. Jest to bardzo ważne, gdy przesyłasz zmiany na żywo do różnych serwerów.


0
2018-03-25 19:54



W przypadku rozwiązania opartego na kolejkach - czy kiedykolwiek wdrożyłeś coś takiego? Czy rozwiązanie kolejki obsługuje aktualizacje bazy danych wraz z aktualizacjami plików? Czy możesz podać szczegóły? - frankadelic
@frankadelic dodał aktualizację, krótką odpowiedź: 1) nie dla wdrożeń (różne ciężkie / długie procesy), 2) y, ale dlatego, że nie umieszczasz w nim wszystkich informacji, tylko informacje, które przekazujesz do zewnętrznego proces / narzędzie 3) dodała więcej o tym w aktualizacji. - eglasius