Propagator zmian w bazie danych do składów NoSQL

Transkrypt

Propagator zmian w bazie danych do składów NoSQL
Propagator zmian w bazie danych do
składów NoSQL
Paweł Tarczykowski
Założenia

Wieloplatformowość

Brak zależności od języka programowania

Brak centralnego punktu spójności danych

Przyspieszenie przez zrównoleglenie

Wysoka konfigurowalność
Rozwiązania

Serwer w języku Java

Protokół oparty o framework Thrift



Algorytm propagacji opracowany przez Pawła
Leszczyńskiego
Aplikacja wielowątkowa bazująca na
asymetrycznym zapisie
Konfiguracja w XML oraz YAML
Obsługiwane technologie

Redis

Solr

MongoDB

Cassandra

PostgreSQL
Problemy



Architektura danych w Cassandrze
Generowanie unikalnych ID dla składów, które
same tego nie potrafią
Connection Pooling
Konfigurowanie aplikacji

Konfiguracja aplikacji jest podzielona na dwie
części

Konfiguracja składów – XML

Konfiguracja schematu - YAML
Konfigurowanie składów
<remote>
<name>Postgres</name>
<host>localhost</host>
<port>5432</port>
<user>farrel</user>
<password>haslo</password>
<driver>pl.umk.mat.propagator.driver.Postgres</driver>
<connections>1</connections>
<threads>1</threads>
<properties>
<database>farrel</database>
</properties>
</remote>
Sterowniki

Aby sterownik był poprawnie rozpoznany przez
serwer musi:

Odziedziczyć po klasie BaseDriver

Implementować jeden z dostępnych interfejsów:





FullTextSearch
DocumentStorage
KeyValue
MultiColumn
DataBase
Konfigurowanie schematu

Konfiguracja jest podzielona dwie części


Relacje – abstrakcyjny model danych, model na
którym operuje użytkownik
Projekcje – rozbicie relacji na różne składy danych,
model, na którym pracuje serwer
Konfigurowanie schematu
- name: book
primaryProjection: book_financial
attributes:
- { name: id, type: int }
- { name: author, type: text }
- { name: title, type: text }
- { name: price, type: float }
- { name: nb_of_items, type: int }
Konfigurowanie schematu
- name: book_financial
storageId: rdbms_1
primaryRelation: book
attributes:
- { name: id }
- { name: price }
- { name: nb_of_items }
Schemat działania serwera

Jeden wątek główny na żądanie




Ma dostęp do kolejek zadań dla wątków
pobocznych
Wykonuje podział żądania na mniejsze zadania
przy pomocy grafu
Wykonuje zadania pierwszorzędne dla utrzymania
spójności danych
Loguje zlecenie zadań drugorzędnych wątkom
pobocznym
Schemat działania serwera

Stała liczba wątków pobocznych



Pobiera z kolejki zadań zadanie drugorzędne i
wykonuje je
Loguje wykonanie zadania
Dwa wątki loggerów

Log zadań zleconych

Log zadań wykonanych

Przy starcie aplikacji czytane są oba logi

Zadania, które zostały zlecone, a nie zostały
wykonane zostają zlecone ponownie
Algorytm propagacji

Ograniczenia algorytmu

Brak możliwości użycia relacji wiele do wielu

Operacje na pojedynczych krotkach
Algorytm Propagacji

Krok 1


Jeśli typ modyfikacji to insert to dodajemy
odpowiednie pola do projekcji głównej
modyfikowanej relacji w celu uzyskania klucza
głównego
Krok 2

Wyszukujemy resztę projekcji, które będą
modyfikowane przez nasze rządanie
Algorytm Propagacji

Krok 3


Jeśli projekcja ma jako pierwszorzędną relację
którą modyfikujemy wykonujemy odpowiednią
operację
Jeśli nie wyszukujemy po kluczu obcym krotki, które
należy zmodyfikować i wykonujemy zmianę według
zdefiniowanego w schemacie operatora.
Dziękuję