Wie funktioniert es?

Ihre Anwendung verwendet eine geänderte Version der SQLite-Bibliothek, die den LiteSync-Code enthält, um auf Ihre Datenbank zuzugreifen.

Die Änderungen an der SQLite-Bibliothek sind intern und die Schnittstelle ist dieselbe.

Die LiteSync-Bibliotheken kommunizieren miteinander und tauschen Transaktionsdaten aus.






Replikation

Wenn die App zum ersten Mal geöffnet wird, stellt sie eine Verbindung zu den anderen Knoten her und lädt eine neue Kopie der Datenbank herunter.

In einer zentralisierten Topologie sendet der Primärknoten die Datenbankkopie an die Sekundärknoten.

Nach dem Herunterladen startet der Knoten die Synchronisation.



Synchronisation

Sobald die Knoten dieselbe Basis-Datenbank haben, tauschen sie Transaktionen aus, die ausgeführt wurden, als sie offline waren.

Danach wechseln sie in den Online-Modus und sobald eine neue Transaktion in einem Knoten ausgeführt wurde, wird sie zur Ausführung in den verbundenen Knoten übertragen.

Wenn der Knoten offline ist, wird die Transaktion in einem lokalen Protokoll gespeichert, um später ausgetauscht zu werden.



MUSS ICH MEINEN APP-CODE ÄNDERN?

Es gibt ein paar Schritte grundsätzlich müssen wir jedoch die URI-Zeichenfolge in der sich öffnenden Datenbank ändern:

“file:/path/to/app.db”

zu so etwas:

“file:/path/to/app.db?node=secondary&connect=tcp://server.ip:1234”

Die gute Nachricht ist, dass LiteSync die native SQLite3-Schnittstelle verwendet. Dies bedeutet, dass wir keine andere API verwenden müssen.



Verbindung

Jeder Knoten hat 2 Optionen:

binden an eine Adresse
verbinden an die Peer-Adresse

Sie können also auswählen, welche Seite mit der anderen verbunden werden soll. Dies ist nützlich, wenn sich eine Seite hinter einem Router oder einer Firewall befindet.



Unterstützte Topologien


Zentralisierte Sterntopologie


In dieser Topologie haben wir einen Knoten, mit dem alle anderen Knoten verbunden sind. Daher muss er online sein, damit die Synchronisation stattfinden kann.

Hier einige Beispielkonfigurationen:


Der Primärknoten kann an eine Adresse gebunden werden und die Sekundärknoten stellen eine Verbindung zu dieser Adresse her.

Primärknoten:

"file:/home/user/app.db?node=primary&bind=tcp://0.0.0.0:1234"

Sekundärknoten: (in einem anderen Gerät)

"file:/home/user/app.db?node=secondary&connect=tcp://server:1234"


Der Primärknoten kann auch eine Verbindung zu Sekundärknoten herstellen.

Primärknoten:

"file:/home/user/app.db?node=primary&connect=tcp://address1:port1,tcp://address2:port2"

Sekundärknoten: (jeweils auf einem separaten Gerät)

"file:/home/user/app.db?node=secondary&bind=tcp://0.0.0.0:1234"


Wir können sogar eine Mischung dieser beiden Optionen verwenden.

Primärknoten:

"file:/home/user/app.db?node=primary&bind=tcp://0.0.0.0:1234&connect=tcp://address1:port1"

Sekundärknoten 1:

"file:/home/user/app.db?node=secondary&connect=tcp://server:1234"

Sekundärknoten 2:

"file:/home/user/app.db?node=secondary&bind=tcp://0.0.0.0:1234"



Peer-to-Peer-Topologie


Das vollständig verbundene Peer-to-Peer-Netzwerk wird zwischen Primärknoten hergestellt.

Wir müssen die Gesamtzahl der Knoten im Netzwerk manuell auf jedem Knoten (vorerst) mitteilen.

Die Richtung der Verbindungen muss ebenfalls mitgeteilt werden (welche Knoten werden mit welchen verbunden)

Hier ist ein Beispiel für ein Netzwerk mit 3 Knoten:

Knoten 1:

"file:db1.db?node=primary&total_primary_nodes=3&bind=tcp://0.0.0.0:1201"

Knoten 2:

"file:db2.db?node=primary&total_primary_nodes=3&bind=tcp://0.0.0.0:1202& connect=tcp://127.0.0.1:1201"

Knoten 3:

"file:db3.db?node=primary&total_primary_nodes=3&bind=tcp://0.0.0.0:1203& connect=tcp://127.0.0.1:1201,tcp://127.0.0.1:1202"



Gemischte Topologie


In dieser Topologie sind mehr als ein Primärknoten als Peers und viele Sekundärknoten mit ihnen verbunden.

Die Konfiguration für die Primärknoten ist dieselbe wie oben in der Peer-to-Peer-Topologie.

Jeder sekundäre Knoten wird zu einem bestimmten Zeitpunkt mit einem einzelnen primären Knoten verbunden. Wir können die Adresse vieler Primärknoten mitteilen, damit sie zufällig einen auswählen. Wenn die Verbindung zu einem Primärknoten unterbrochen wird, wird eine Verbindung zu einem anderen Knoten hergestellt.

Hier ist ein Beispiel-URI für einen sekundären Knoten:

"file:db4.db?node=secondary&connect=tcp://127.0.0.1:1201,tcp://127.0.0.1:1202,tcp://127.0.0.1:1203"



Synchronisationsstatus

Wir können den Synchronisationsstatus mit diesem Befehl überprüfen:

PRAGMA sync_status

Es wird eine JSON-Zeichenfolge zurückgegeben.



Synchronisierungsbenachrichtigung

Ihre Anwendung kann benachrichtigt werden, wenn die lokale Datenbank aufgrund der Synchronisierung mit Remote-Knoten aktualisiert wird. Die Benachrichtigung erfolgt über eine benutzerdefinierte Funktion.

Wähle eine Sprache -->

Wichtig: Die Benachrichtigungsfunktion wird vom Arbeitsthread aufgerufen. Die Anwendung sollte die Datenbankverbindung NICHT innerhalb der Benachrichtigungsfunktion verwenden und muss so schnell wie möglich zurückkehren! Die Anwendung kann die Benachrichtigung vor der Rückkehr an den Hauptthread übertragen.



Überprüfen, ob die Datenbank bereit ist

Wenn die App zum ersten Mal auf einem Gerät geöffnet ist, kann sie eine neue Kopie der Datenbank von einem anderen Knoten herunterladen. Bis es fertig ist, können wir nicht auf die Datenbank zugreifen.

Wir können den Synchronisierungsstatus abrufen und den db_is_ready Variable überprüfen.

Überprüfen Sie die folgenden grundlegenden App-Beispiele.



Wie verwende ich es in meiner App?

Es gibt 3 Schritte:

1  Ersetzen Sie die SQLite-Bibliothek durch die mit LiteSync

2  Ändern Sie die URI-Verbindungszeichenfolge

3  Überprüfen Sie den Status der Datenbankbereitschaft

Beim Kompilieren von C- und C ++ - Apps müssen Sie Ihre Anwendung mit der LiteSync-Bibliothek verknüpfen.

Für andere Sprachen muss das richtige wrapper installiert sein.



Beispiel für einen Primärknoten

Der Primärknoten kann eine normale Anwendung sein, genau dieselbe App wie die Sekundärknoten, jedoch mit einem anderen URI.

Oder wir können eine App verwenden, die als primärer Knoten dient.

Eine eigenständige Basisanwendung, die ausschließlich zum Halten eines zentralisierten Datenbankknotens verwendet wird, sieht folgendermaßen aus:

Wähle eine Sprache -->



Beispiel für eine einfache App

Eine grundlegende App, die in die lokale Datenbank schreibt, sieht folgendermaßen aus:

Wähle eine Sprache -->



AKTUELLE EINSCHRÄNKUNGEN

1  Nicht-deterministische Funktionen (die jedes Mal unterschiedliche Werte zurückgeben, wenn sie aufgerufen werden) sind blockiert, wie random() und date('now'). Verwenden Sie explizit erzeugte Werte in Ihrer App

2  Das Schlüsselwort AUTOINCREMENT wird nicht unterstützt - aber Sie benötigen es nicht! (Details im Video)

3  Nur eine einzige Anwendung kann gleichzeitig auf die Datenbank zugreifen. Jede Instanz muss ihre eigene Datenbank verwenden, die dann mit LiteSync repliziert und synchronisiert wird