Skalowanie

Problem

Chcemy zwiększyć wydajność systemu lub zdolność do przechowywania większej ilości danych bez konieczności optymalizacji i refaktoringu logiki aplikacji lub zmiany technologii.

Opis rozwiązania

Zwiększamy wydajność systemu poprzez zwiększanie ilości zasobów przetwarzających.

Skalowanie systemu - rozbudowa systemu w celu obsługi większej liczby użytkowników, transakcji, żądań lub przechowywania większej ilości danych. Dla przykładu skalowanie systemu webowego polega na takiej jego rozbudowie aby mógł obsłużyć większą liczbę użytkowników. Skalowanie systemu bazodanowego polega na takiej jego rozbudowie aby mógł przechować i obsługiwać większą liczbę danych.

Pojęcia związane ze skalowaniem

Ze skalowaniem związane są następujące pojęcia:

  • Speedup - przyśpieszenie - stosunek przepustowości systemu po rozbudowie do przepustowości systemu przed rozbudową

  • Scalability factor - efektywność przyśpieszania

Ze względu na scalability factor skalowalność można podzielić na:

  • liniową - wraz ze wzrostem zasobów system zwiększa swoją wydajność liniowo - parametr SF wynosi 1.0, czyli efektywność skalowania jest równa 100%. Oznacza to też nieskończoną skalowalność systemu.

  • sub-liniową - parametr SF wynosi < 1.0. Oznacza to, że wraz z rozbudową systemu o kolejne zasoby jego wydajność rośnie coraz wolniej, aż osiągnie pewną granicę. Oznacza to skończoną skalowalność systemu.

  • negatywną - parametr SF wynosi < 0.0. Oznacza to, że wraz z rozbudową systemu o kolejne zasoby jego wydajność maleje. Efekt taki można zaobserwować dla aplikacji nie przystosowanych do skalowania.

  • super-liniową - parametr SF wynosi > 1.0. Jest to szczególny przypadek, kiedy wydajność systemu rośnie szybciej niż liniowo wraz ze zwiększaniem ilości zasobów. Przykładem może być system operujący na danych odczytanych z plików. Może się zdarzyć sytuacja kiedy wątki uruchomione na różnych procesorach będą operowały na tych samych plikach. Czas dostępu do plików zmniejszy się wtedy o rząd wielkości dzięki buforom systemowym, co spowoduje superliniowy wzrost wydajności.

Sposoby skalowania

W chwili obecnej występują dwie główne drogi skalowania systemów:

  • skalowanie pionowe / vertical scaling

  • skalowanie poziome / horizontal scaling

Vertical scaling

Vertical scaling czyli inaczej skalowanie pionowe polega na zwiększaniu ilości lub wydajności zasobów w ramach pojedynczej jednostki przetwarzania (np. serwera) - zwiększanie ilości pamięci RAM, szybkości procesorów, ilości procesorów, zamiana dysków na wydajniejsze itp.

Horizontal scaling

Horizontal scaling czyli inaczej skalowanie poziome polega na zwiększaniu ilości jednostek przetwarzających co powoduje utworzenie klastra. Głównymi problemami związanymi ze skalowaniem poziomym są:

  • load-balancing - optymalne przydzielenie zadań do procesorów, tak aby w danej chwili każdy procesor miał tyle samo pracy do wykonania.

  • split-brain effect - efekt “rozdwojenia jaźni” systemu - pewne części systemu nie mają świadomości istnienia pozostałych części, co powoduje niebezpieczeństwo utraty spójności danych. Przykładem może być system webowy, w którym sesje użytkowników przechowywane są lokalnie na każdym serwerze z klastra. Żądania użytkowników mogą trafiać na różne serwery co spowoduje efekt split-brain - za każdym razem system będzie operował na innej sesji użytkownika co może spowodować błędne zachowanie systemu.

Konsekwencje

Zalety skalowania pionowego:

  • prosta instalacja

  • brak konieczności zmian w aplikacji (dla większości przypadków)

Wady skalowania pionowego:

  • skończona i nieliniowa skalowalność - poprzez zwiększanie np. ilości CPU można uzyskać parametr SF równy około 0.9

  • konieczny downtime systemu

  • zmniejsza dostępność systemu - rośnie prawdopodobieństwo awarii któregoś z komponentów

  • większy koszt - wraz ze zwiększaniem ilości zasobów koszt skalowania rośnie wykładniczo

Zalety skalowania poziomego:

  • prosta instalacja

  • możliwa do osiągnięcia liniowa i nieskończona skalowalność

  • większa dostępność systemu

  • brak konieczności zmian w aplikacji (dla większości przypadków)

Wady skalowania poziomego:

  • dla większości przypadków nieliniowa i skończona skalowalność

  • konieczność wprowadzenia dodatkowych mechanizmów - load-balancing, mechanizmy zapobiegania efektom split-brain

Comments