2009-12-11 14 views
24

W aplikacji, która osadza SQLite3 i korzysta z bazy danych w pamięci, czy możliwe jest replikowanie bazy danych między dwoma uruchomionymi wystąpieniami aplikacji? Mógłbym to zrobić ręcznie z protokołem homebrew duplikującym wszystkie moje dostępy DB, ale wydaje się, że coś powinno być zrobione wewnątrz warstwy DB.Czy SQLite obsługuje replikację?

Odpowiedz

12

Brute force approach: Wyślij do polecenia ".dump", aby utworzyć tekstową reprezentację danych. Odczytaj te dane do drugiej bazy danych. Nie jestem pewien, czy możesz tego użyć.

Jeśli potrzebujesz drobnoziarnista aktualizację (przesyłając kopię każdego zapisu do drugiej kopii), przyjrzeć się sqlite3_update_hook

Ale jak masz zamiar obsługiwać błędy? Na przykład, co się dzieje, gdy kopia bazy danych w aplikacji2 nie może z jakiegoś powodu wykonać aktualizacji?

Aby rozwiązać ten problem, przenieś bazę danych do procesu serwera i poproś dwie aplikacje o rozmowę.

+0

Okay, więc sqlite3_update_hook byłby moim punktem wyjścia do warstwowania tego na poziomie rzędu po rzędzie. To bardzo pomocne, dziękuję. W odpowiedzi na inne punkty, unikam rzeczy, których nie można wprowadzić za pomocą pewnych magicznych właściwości aplikacji. Pożądanie dwóch oddzielnych instancji zamiast centralnej bazy danych zależy od wymagań co do rozkładu, a sqlite jest sterowane przez limit zasobów systemowych. – kdt

+1

OK. Tylko upewnij się, że obie kopie zabraknie pamięci/miejsca na dysku w tym samym czasie, itp. –

+0

To nie wydaje się być poważną odpowiedzią. Tak, w końcu możesz zbudować to samemu, ale będzie to duże przedsięwzięcie, aby uczynić go niezawodnym. –

0

Nie, nie, ponieważ zakres projektu jest prostą bazą danych w procesie. Ale ponieważ baza danych jest tylko jednym plikiem, możesz napisać własny skrypt replikacji oparty na zwykłych operacjach kopiowania plików, rsync lub czymś podobnym.

Jeśli naprawdę chcesz typu RDBMS opartego na SQLite/klient, możesz spojrzeć na SQLiteDBMS.

1

Jeśli chcesz replikacji w bazie danych w pamięci, należy spojrzeć na berkeley DB (BDB). Jednak model danych dla BDB jest słownikiem typu string, więc tracisz elastyczność SQL. dodatkowo posiada licencję na trzy klauzule, więc jeśli twój projekt jest komercyjny, musisz uzyskać licencje.

0

Unison? Najlepsze, co można zrobić, ale było gorące, ponieważ SQLite db w jednym monolitycznym pliku. Nie można zaokrąglić robin między dwoma "instancjami". Hot spare nie jest zły, wystarczy po prostu podnieść inną aplikację + db bez większego zamieszania, porównać z Master-Slave lub aktywnym pasywnym MySQL, gdzie istnieje ręczna interwencja, która nie jest łatwa. Replikacja MySQL przebiega wokół SQL, a nie tylko takich jak unison/rsync. Ale z jednością masz mistrza-mistrza.

2

Lsyncd - Live Syncing (Mirror) Daemon może być przydatny tutaj. Używa rsync do ciągłej replikacji na poziomie pliku.

+0

To prawdopodobnie nie jest dobry pomysł na działające na żywo bazy danych. Może to spowodować uszkodzenie bazy danych Slave, jeśli zostanie ona replikowana podczas transakcji. –

5

Istnieją 2 opcje realizowane wewnątrz warstwy DB:

litereplica (jedna replikacja kierunku, w czasie rzeczywistym przyrostowy)

{ Characteristics: [ 
    "replica db is binary equivalent of main db when synchronized", 
    "replica db is read-only", 
    "all the db is replicated" ], 
Split Brain: "not applicable, as it is single master", 
Additional Features: "Point-in-time recovery, encryption using ChaCha", 
Interface: "native SQLite. Existing wrappers for SQLite can be used", 
Notes: "does not support WAL", 
License: "commercial" } 

litesync (multi-master replikacji i synchronizacji)

{ Characteristics: [ 
    "can write to the db even when it is off-line", 
    "fast (first write to local db, then synchronize using a worker thread)", 
    "avoids insert id collisions using modified rowids" ], 
Split Brain: "does not occur because it uses a star topology", 
Additional Features: "encryption using ChaCha", 
Interface: "native SQLite. Existing wrappers for SQLite can be used", 
Notes: "use attached db for replication of only some tables", 
License: "commercial" } 
+0

Dzięki za odpowiedź. Przeczytałem link, o którym wspomniałeś o litereplica i pobrałeś go. Jednak nie ma wystarczających informacji o tym, jak skonfigurować master slave (szczerze mówiąc, nigdy wcześniej tego nie robiłem, więc jestem nieco zdezorientowany). Czy masz więcej informacji lub link do samouczka na ten temat? Dziękujemy – mOna

+0

Sprawdź wideo na stronie internetowej. – malhal

0

Po wyjęciu z pudełka, nie. Istnieje niewielka liczba opcji innych firm:

Synchronizacja SQLite: https://ampliapps.com/sqlite-sync/ Ta wydaje się atrakcyjna, ponieważ może replikować do innych baz danych, a także SQLite i nie modyfikuje silnika SQLite. Jeszcze tego nie próbowałem.

Litereplica: http://litereplica.io/ Tylko w jedną stronę. Wydaje się, że było trochę.

LiteSync: http://litesync.io/ Replikacja dwukierunkowa. Całkiem nowa, ale ewolucja Litereplicy jest prawdopodobnie bardziej dojrzała, niż się wydaje.Próbowałem tego trochę i wygląda na to, że działa sprawnie, z kilkoma błędami, które analizuje programista. Musisz użyć zmodyfikowanego przez programistę silnika SQLite, który wydaje się być zależną od zależności. Nie masz też zbytniej kontroli, np. nie można powielać replikacji bez ponownego otwierania bazy danych.