Jak radzić sobie z wysokim obciążeniem serwera

  1. OPTYMALIZACJA PRACY Z BAZY DANYCH
  2. OPTYMALIZACJA OGÓLNEGO WNIOSKU OGÓLNEGO
  3. PRO HIPSTERS I SILVER BULLET
  4. NIE KICK

Rozmawialiśmy już o tym, co jest siano i jak to jest, a teraz chciałbym poruszyć raczej bolesny temat - czy warto przygotować się na młode firmy, które dopiero zaczynają rozwijać swój produkt. A jeśli tak, to na jakim etapie rozwoju.

Oczywiste jest, że wszyscy programiści, jako ludzie techniczni, chcą ciekawych i złożonych zadań i architektur, ale na początku ważna jest równowaga technologii i funkcji klienta produktu. Z jednej strony konieczne jest wprowadzenie nowej funkcjonalności tak szybko, jak to możliwe, z drugiej - aby nie być w momencie, w którym nic nie działa z powodu trudnych obciążeń i nic nie można zrobić.

Bez względu na to, jak brzmiało to odważnie - w ciągu pięciu lat pracy prawie nie widzieliśmy, by firma była w takiej sytuacji, że nie można było nic zrobić (z rzadkimi wyjątkami). Z drugiej strony, widzieli wiele przypadków, w których firmy poświęcały czas na przygotowanie się na straszną frekwencję, na którą ostatecznie nie doczekały się banalne.

Jak mawiał dziadek Cnut, przedwczesna optymalizacja jest źródłem wszelkiego zła. W tym artykule chcemy przejść przez trzy typy, które najczęściej widzimy w tworzeniu stron internetowych. To jest:

• przedwczesna optymalizacja pracy z bazą danych;

• przedwczesna optymalizacja całej aplikacji;

• nadmierna fascynacja technologiami hipster w nadziei na znalezienie srebrnej kuli.

OPTYMALIZACJA PRACY Z BAZY DANYCH

Często widzimy, jak startupy oczekują, że od pierwszego dnia głównym obciążeniem będzie baza danych, która nie będzie w stanie poradzić sobie z rosnącą liczbą wniosków i umieści projekt.

W jednej przyjaznej dla nas firmie, której niestety już nie ma, deweloperzy przystąpili do tego, że na początku będzie ogromna ilość danych. Rozwój projektu rozpoczął się od planowania architektury, która umożliwiłaby łatwe i praktyczne zrównoważenie danych między dowolną liczbą serwerów. W tym przypadku schemat uwzględnił możliwość dodania nowych fragmentów bazy danych w locie.

Deweloperzy powrócili do tego podsystemu kilka razy w ciągu dwóch lat - nie był on całkowicie gotowy, a programiści związani z częścią produktu regularnie zmieniali schemat bazy danych. W rezultacie projekt został zamknięty, a siły, które mogły zostać rzucone na ulepszenie części produktu, zostały przeznaczone na stworzenie podsystemu, który nigdy nie był używany.

Faktycznie sharding jest konieczny jako rozwiązanie dwóch problemów:

1. Operacje na bazie danych w ogromnej ilości danych.

2. Skalowanie obciążenia zapisu na dysku.

Osobno chciałbym zauważyć: w 99 na 100 przypadków (oraz w warunkach powszechnej dostępności dysków SSD) problem rejestrowania skalowania nie pojawia się od razu. Aby utworzyć zawartość, użytkownik musi być zainteresowany. Jednocześnie duże ilości danych w twoim systemie również nie pojawią się nagle i natychmiast - prawie na pewno będziesz miał czas na modyfikację architektury podczas działania systemu, aby mógł skalować się na rekord.

Co może temu zapobiec i co naprawdę warto robić na początku? Mówimy zwodniczą rzecz: musisz być bardzo ostrożny w korzystaniu z abstrakcji dostępu do baz danych. Tak, ORM jest fajny i wygodny, ale jeśli chodzi o fakt, że żądanie musi być rozproszone w dwóch różnych miejscach, będziesz musiał dotrzeć do głębi używanego ORM, aby dowiedzieć się, jak go wdrożyć. Często widzimy, jak pozornie proste zadanie modyfikowania warunków generowania zapytań SQL zamienia się w prawdziwe piekło.

Drugą optymalizacją z punktu widzenia programisty, którą można zrobić, jest przewidzenie, że może istnieć kilka serwerów, aw momencie wybierania danych zakłada się, że zapytanie SQL może być wykonane na jednym z kilku serwerów. To znaczy: masz obiekt dostępu do bazy danych i masz zapytanie SQL, które chcesz wykonać. W miły sposób, w miejscu, w którym wysyłasz żądanie do serwera, powinieneś być w stanie bezpośrednio wybrać serwer, do którego uzyskasz dostęp.

I trochę więcej na temat ORM: w warunkach wysokiego obciążenia nie może nastąpić normalne rozdzielenie stref wpływów - programy programistyczne i administrator bazy danych zarządzają bazą danych. W rzeczywistości praca programisty powinna już wynikać ze specyfiki pracy z bazą danych, ponieważ nawet niewielkie modyfikacje (wymuszanie użycia indeksów, zmiana zapytania na specyfikację optymalizatora bazy danych) mogą dać ogromny wzrost wydajności.

Prostota i dostępność ORM oddziela wszystkie te szczegóły od programisty i daje szansę wygenerowania szalonego żądania, które będzie wyglądało całkiem normalnie dla programisty.

Podczas jednego z projektów, strony z pytaniami i odpowiedziami napisanej w jang, zobaczyliśmy, jak lista pytań dotyczących pewnej ilości kodu była ograniczona do wielu kryteriów, zanim została ona otrzymana. Z punktu widzenia programisty wszystko wyglądało mniej więcej OK - od czasu do czasu do obiektu listy dodawano nowe kryterium. W rezultacie ORM jungi wygenerował żądanie dla grupy 25 według, która wykładniczo utworzyła obciążenie bazy w miarę wzrostu ilości przetwarzanych danych. A jeśli żądanie było w postaci prostego SQL, nadal istniała szansa na zastanowienie się, jak zoptymalizować procedurę, ale w tym przypadku wszystko było bardzo skomplikowane.

A jeśli żądanie było w postaci prostego SQL, nadal istniała szansa na zastanowienie się, jak zoptymalizować procedurę, ale w tym przypadku wszystko było bardzo skomplikowane

Wreszcie o części z optymalizacją bazy danych. Jak już powiedzieliśmy, częściej widzimy obciążenie czytania niż pisania. Zorganizowanie dużego obciążenia na płycie jest osobnym sukcesem :). Obciążenie odczytu może być w ogóle zrównoważone bez żadnych specjalnych zmian w części kodu. Jeśli jesteśmy gotowi na fakt, że podczas wykonywania żądania możemy wybrać serwer, to jeśli musimy zrównoważyć odczyt, możemy po prostu utworzyć n-ty numer serwerów podrzędnych. A po wybraniu wybierz losowo jeden z serwerów, na których już musisz wykonać ten wybór. I nagrywaj tylko w jednym oddzielnym urządzeniu.

OPTYMALIZACJA OGÓLNEGO WNIOSKU OGÓLNEGO

Ta historia zaczyna się w ten sam sposób: niektórzy z naszych przyjaciół oczekiwali stu milionów użytkowników. Wysłuchaliśmy raportu o tym, jak rzeczy są ułożone w Yandex, i chcieli zrobić to samo. Zdecydowaliśmy, że nginx będzie składał strony internetowe zgodnie z szablonami w XSLT / XML, które opisują ogólną strukturę komponentów na stronie. Podczas żądania pliku nginx parsit, widzi, które komponenty są używane, a dla każdego komponentu odnosi się do backendu

dla jego renderowanej wersji, przekazując identyfikator sesji, aby zapisać stan. Odpowiednio, backend całej platformy rozumie, jak odbierać takie żądania i generować wyjście komponentu.

W rezultacie utworzenie tego rozwiązania zajęło ponad rok, zaangażowani programiści C zażądali przedpłaty, ale nie stworzyli modułu, który implementowałby tę funkcjonalność w nginx. Nie było to jednak wymagane, ponieważ po dwóch latach rozwoju projekt musiał zostać ograniczony.

Nie było to jednak wymagane, ponieważ po dwóch latach rozwoju projekt musiał zostać ograniczony

W XXI wieku technologii chmurowych, w których zasoby procesora są skalowane dość tanio pionowo, a równoważniki obciążenia są włączane w bardzo krótkim czasie, aby stworzyć z góry jakiś konkretny kod do równoważenia aplikacji, naszym zdaniem wydaje się to dodatkową pracą. To, co naprawdę możesz zrobić, to upewnić się, że sesje użytkowników nie są powiązane z konkretną maską internetową, a następnie po prostu sklonować liczbę wymaganych webinstans podczas oczekiwania na optymalizację kodu.

Inną skrajnością, którą napotkaliśmy w naszej praktyce, jest komplikacja pracy ze statyczną treścią ładowaną przez użytkowników. Deweloperzy zaprojektowani z myślą o dużym obciążeniu tworzą obsługę klastra serwerów nginx z modułem WebDAV. Każdy plik przesłany przez użytkownika najpierw trafił na serwer pośredni, a następnie udał się do serwera WebDAV, z którego został później wysłany do nginx. Informacje o miejscu przechowywania tego pliku zostały zapisane w bazie danych. Prawdziwe obciążenie tego projektu nie nadeszło.

Naprawdę poważnym problemem, naszym zdaniem, dla większości projektów jest tylko całkowity brak jakiejkolwiek zasady przechowywania plików - gdy wszystko jest umieszczone w jednym katalogu. A kiedy pewnego dnia zdasz sobie sprawę, że pliki mają mniej niż 70 tysięcy, a ext4 nie pozwala na pisanie nowych, albo wymyślasz rozsądny schemat dystrybucji plików, albo przenosisz się na przykład do XFS. W drugim przypadku nic cię nie uratuje.

Jak proponujemy rozwiązać to pytanie wszystkim klienci:

1. Jeśli istnieje rozdzielenie danych „gorących” i „zimnych” według czasu (świeże zdjęcia VKontakte są przewijane częściej niż stare), a strumień przesłanych danych jest mniej więcej taki sam - podczas pobierania plików przechowuj pliki w katalogu utworzonym na podstawie daty / godziny pobrania. W zależności od kwoty można ją podzielić na dni lub podzielić na godziny. Ponownie łatwiej będzie usunąć stare pliki, jeśli to konieczne.

2. Jeśli dane nie są podzielone na świeże i niezbyt dobre, możesz obliczyć dwa różne cyfrowe skróty z nazwy pliku, a następnie użyć ich w określonej strukturze katalogów, wewnątrz której można już dodać sam plik.

Ale co, jeśli obawiamy się, że serwer nie obciąży czytania? W pierwszym etapie lsyncd nas uratuje, co pomoże rozprowadzić ładunki statyczne na kilku oddzielnych serwerach, a tym samym rozłożyć obciążenie na jego odczyt. A ponieważ statyczność jest wszędzie taka sama, możesz ją odczytać z dowolnego serwera. Jeśli to konieczne, możesz łatwo dodać dodatkową moc do obwodu, dopóki programiści nie wymyślą bardziej subtelnego obwodu. Ale uważaj - pamiętaj, że nie ma nic bardziej trwałego niż tymczasowe szczudło. Na pewno będą musieli się pozbyć.

PRO HIPSTERS I SILVER BULLET

Nie warto rzucać karkołomnych, sprawdzonych w czasie i miliardów rozwiązań RPS ze względu na nowe modne rzeczy, mając nadzieję na znalezienie zbawienia od wszystkich problemów na raz. Często okazuje się, że nawet jeśli niektóre techniki i technologie supernowych rozwiążą niektóre z twoich obecnych problemów, jednocześnie dodadzą całkiem sporo nowych, nawet potencjalna możliwość, o której nigdy byś nie pomyślał. Weź

na przykład ta sama baza danych NoSQL. W hobby NoSQL jako panaceum na problemy z bazą danych istnieje wiele pułapek. Na przykład w większości rozwiązań NoSQL synchronizacja danych z dyskiem jest globalnym lok, podczas którego praca z bazą danych jest niezwykle trudna. Jeśli używasz rzodkwi, jeśli potrzebujesz danych, masz dwie możliwości:

1. Miej urządzenie podrzędne na oddzielnej maszynie, która będzie okresowo zrzucać dane.

2. Wyłącz wysypisko na mistrza, nie niewolnik, stale módl się, aby nic nie upadło.

W rzeczywistości dwa główne problemy wszystkich nowych technologii następują po sobie:

1. Rozwiązania dotyczące wilgoci.

2. Brak bazy wiedzy na temat istniejących problemów.

Jeśli masz problem z MySQL i Postgres, możesz napisać o tym w Google i prawie na pewno znajdziesz milion osób, które spotkały się z podobną osobą przed Tobą. Jeśli problem jest związany z jakąś świeżą technologią, istnieje duże ryzyko, że będziesz musiał udać się do programisty i dowiedzieć się, co jest. My sami kiedyś byliśmy zbyt pochłonięci takimi rzeczami (a stało się to nawet na stosunkowo dobrze znanym i długo rozwijanym Openstacku) - zamiast zwykłych metod wirtualizacji chcieliśmy móc zarządzać maszynami wirtualnymi „jak w Amazon”. W tym celu wybraliśmy Openstack, z którym mieliśmy do czynienia w następnym miesiącu. Podstawową przyczyną cierpienia jest wilgoć i potrzeba wsparcia. Aby uruchomić maszynę wirtualną w Openstack, istnieje pięć demonów Pythona, interakcja między którymi przechodzi RabbitMQ, a kod ciągle się zmienia. Oczywiste jest, że wszystko może się tam złamać i to się psuje.

NIE KICK

Z drugiej strony bycie dość wstecznym jest również niebezpieczne. Pamiętajmy, że programiści Perla (w ogóle nie chcemy obrazić programistów Perla), którzy twierdzili, że Perl jest lepszy niż PHP, Perl jest lepszy niż Python, Perl jest lepszy niż Ruby i tak dalej. A teraz widzimy ogromną liczbę programistów Perla, których rynek stopniowo się zamyka. Jak być?

Najważniejsze jest znalezienie kogoś, kto przeszedł drażliwą ścieżkę wybranej technologii do ciebie :). Wiele osób ma wystarczająco dużo wolnego czasu, a firmy, które przeznaczą dwa lata na wszystkie rozwiązania technologiczne, zawsze będą istniały. Wybrał sprytną technologię, o której wszyscy piszą? Znajdź facetów, którzy już próbowali i pomogli. na przykład my :)

Co może temu zapobiec i co naprawdę warto robić na początku?
Ale co, jeśli obawiamy się, że serwer nie obciąży czytania?
Jak być?
Wybrał sprytną technologię, o której wszyscy piszą?