Tworzenie wysokowydajnych systemów bazodanowych

Pracując nad ostatnią wersją Listów Mikołaja obiliśmy się o problem tworzenia wysokowydajnych systemów.  Doszliśmy do momentu, w którym klasyczna optymalizacja tworzonych algorytmów nie wystarczała  w obrębie danej infrastruktury, a możliwości jej zmiany mieliśmy ograniczone. Klasyczna struktura użytkownik-do-bazy-danych przy systemach nisko obciążonych wygląda przeważnie jak struktura rozgwiazdy:

Baza danych nisko obciążona

Jedna baza danych obsługuje skończoną liczbę klientów. Przy dużym obciążeniu ilością zapytań pojawiają się problemy z wydajnością, czego doświadczyliśmy w tym roku przy tworzeniu Listów Mikołaja.

Rozwiązaniem jest zastosowanie architektury rozproszonej dla bazy danych, gdzie tworzymy bazę typu master, następnie replikujemy jej zawartość na bazy typu slave:

bazy danych podział master-slave

Użytkownicy dopisujący nowe dane do bazy danych zapisują je w bazie master, następnie dane te są zreplikowane do baz podwładnych.

Replikacja bazy master do baz slave

Kolejnym krokiem zwiększającym wydajność jest rozdzielenie ruch w zależności od rodzaju – ruch czytający dane (częściej występujący) od ruchu zapisującego dane (rzadziej występujący):

Obsługa bazy danych z load balancerem

Loadbalancer rozdziela zapytania przychodzące do bazy danych, zapytania czytające dane rozdzielane są na bazy slave. Zapytania zapisywania danych przekazywane są do zreplikowanej bazy master. Rozwiązanie przypomina po części bardziej znaną wśród laików technologię RAID.

Całość jest stabilna, bardziej wydajna i diabelnie skalowalna, jako że kolejnych instancji typu slave możemy dokładać bez większych problemów.