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:
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:
Użytkownicy dopisujący nowe dane do bazy danych zapisują je w bazie master, następnie dane te są zreplikowane do baz podwładnych.
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):
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.