Firma PayPal opublikowała kod źródłowy odpornej na awarie bazy danych JunoDB, która manipuluje danymi w formacie klucz-wartość. System został pierwotnie zaprojektowany z myślą o wysokim bezpieczeństwie, poziomej skalowalności, odporności na awarie oraz zdolności do obsługi setek tysięcy równoczesnych połączeń z przewidywalnymi opóźnieniami. W PayPal praktycznie wszystkie usługi, od logowania użytkowników po przetwarzanie transakcji finansowych, są oparte na JunoDB. Kod projektu napisany jest w języku Go (biblioteka kliencka w Javie) i jest udostępniany na licencji Apache 2.0. W trakcie dalszego rozwoju będą przyjmowane poprawki, ulepszenia i zmiany od społeczności.
Architektura JunoDB opiera się na użyciu load balancera, który przyjmuje żądania od aplikacji klienckich i rozdziela je między serwery proxy, które jednocześnie łączą się z grupą serwerów przechowywania podczas realizacji żądania. Każdy serwer proxy nawiązuje połączenia jednocześnie ze wszystkimi serwerami serwerami przechowywania i przekierowuje żądania do grupy serwerów przechowywania na podstawie indeksu partycjonowania, który jest przechowywany w rozproszonej systemie przechowywania konfiguracji etcd.

Dane są partycjonowane i przypisane do węzłów przechowywania przy użyciu haszowania, co pozwala zmniejszyć przemieszczanie danych przy zwiększaniu lub zmniejszaniu liczby węzłów w klastrze. W celu zapewnienia odporności na awarie każda porcja danych jest replikowana na wielu węzłach przechowywania, co pozwala na zachowanie informacji w przypadku awarii poszczególnych serwerów. Obsługiwane jest tworzenie terytorialnie rozproszonych magazynów, w których grupy węzłów znajdują się w różnych centrach danych.

Na węzłach przechowywania dane są umieszczane w pamięci operacyjnej lub w lokalnej pamięci opartej na bibliotece RocksDB. Przy stałym przechowywaniu dane są umieszczane w zaszyfrowanej postaci (klucz szyfrowania może być określany zarówno przez klienta, jak i ustawiany na poziomie proxy).

Aby uzyskać dostęp do bazy danych z aplikacji, dostarczana jest biblioteka kliencka, która oferuje API dla aplikacji w językach Java, Go i C++. Część kliencka jest maksymalnie uproszczona, a złożona logika i ustawienia są, w miarę możliwości, przeniesione na stronę DBMS. Interakcja między klientem a balansującym lub proxy odbywa się przez zaszyfrowany kanał komunikacyjny. Do zarządzania i wysyłania zapytań można użyć interfejsu wiersza poleceń, który odtwarza wszystkie możliwości klienta API.
System został zaprojektowany do obsługi zapytań z przewidywalnie niskimi opóźnieniami; na przykład klaster złożony z trzech węzłów przechowujących i jednego proxy, utworzonego z środowisk n1-highmem-32 (32 CPU Intel Xeon 2.30GHz, 214 GB RAM i 450 GB pamięci SSD), był w stanie zapewnić stałe opóźnienia nieprzekraczające 2,5 ms w 95% przypadków oraz 16 ms w 99% podczas obsługi 200 tysięcy jednoczesnych połączeń TLS i przepływu 15 tysięcy zapytań na sekundę (przy 3000 jednoczesnych połączeń i przepływie 80 tysięcy zapytań na sekundę opóźnienia nie przekroczyły 6 ms w 95% przypadków i 15 ms w 99%). W PayPal usługi oparte na JunoDB obsługują około 350 miliardów zapytań dziennie.

Źródło: opennet.ru
