それはどのように機能しますか?

アプリケーションは、LiteSyncコードを含むSQLiteライブラリの修正バージョンを使用して、データベースにアクセスします。

SQLiteライブラリの変更は内部で行われ、インターフェースは同じです。

LiteSyncライブラリは相互に通信し、トランザクションデータを交換します。






レプリケーション

アプリを初めて開いたときに、他のノードに接続し、データベースの新しいコピーをダウンロードします。

集中トポロジでは、プライマリノードがデータベースコピーをセカンダリノードに送信します。.

ダウンロードが完了すると、ノードは同期を開始します。



同期

ノードが同じデータベースベースを持つと、オフライン時に実行されるトランザクションが交換されます。

その後、オンラインモードに入り、新しいトランザクションがノードで実行されると、転送されて接続されたノードで実行されます。

ノードがオフラインの場合、トランザクションはローカルログに保存され、後で交換されます。



自分のアプリコードを変更する必要がありますか?

いくつかの手順がありますが、基本的には、データベースのURI文字列を次のように変更する必要があります:

"file:/path/to/app.db"

このようなものに:

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

朗報は、LiteSyncがネイティブのSQLite3インターフェイスを使用することです。つまり、別のAPIを使用する必要はありません。



接続

各ノードには2つのオプションがあります:

アドレスにバインドする
ピアアドレスに接続します

したがって、どちら側をもう一方に接続するかを選択できます。これは、片側がルーターまたはファイアウォールの背後にある場合に役立ちます。



サポートされるトポロジ


一元化された、スター型トポロジー


このトポロジでは、他のすべてのノードが接続されるノードがあるため、同期を実行するにはオンラインである必要があります。

ここにいくつかの設定例があります:


プライマリノードはアドレスにバインドでき、セカンダリノードはそのアドレスに接続できます。

プライマリノード:

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

セカンダリノード:(別のデバイス内)

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


プライマリノードはセカンダリノードにも接続できます。

プライマリノード:

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

セカンダリノード:(それぞれ別のデバイス上)

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


これら2つのオプションを組み合わせて使用することもできます。

プライマリノード:

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

セカンダリノード1:

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

セカンダリノード2:

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



ピアツーピアトポロジ


完全に接続されたピアツーピアネットワークは、プライマリノード間で作成されます。

ネットワーク上のノードの総数を各ノードで手動で通知する必要があります(今のところ)

接続の方向も通知する必要があります(どのノードがどのノードに接続するか)

これは、3つのノードを持つネットワークの例です。

ノード1:

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

ノード2:

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

ノード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"



混合トポロジー


このトポロジでは、複数のプライマリノードがピアとして接続され、多くのセカンダリノードがそれらに接続されています。

プライマリノードの構成は、ピアツーピアトポロジ(上記)と同じです。

各セカンダリノードは、特定の時間に1つのプライマリノードに接続されます。 多くのプライマリノードのアドレスを通知できるため、プライマリノードはランダムに1つを選択します。 プライマリノードへの接続が切断されると、別のノードに接続します。

セカンダリノードのURIの例を次に示します。

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



同期ステータス

次のコマンドを使用して、同期ステータスを確認できます:

PRAGMA sync_status

JSON文字列を返します。



同期通知

リモートノードとの同期によりローカルデータベースが更新されると、アプリケーションに通知できます。 通知は、ユーザー定義関数を介して行われます。

言語を選択してください -->

重要: 通知関数はワーカースレッドによって呼び出されます。 アプリケーションは通知関数内でdb接続を使用してはならず、できるだけ早く戻る必要があります。 アプリケーションは、戻る前に通知をメインスレッドに転送できます。



データベースの準備ができているかどうかの確認

アプリがデバイスで初めて開かれている場合、別のノードからデータベースの新しいコピーをダウンロードできます。それが完了するまで、データベースにアクセスできません。

同期ステータスを取得し、db_is_ready変数を確認できます。

以下の基本的なアプリの例を確認してください。



自分のアプリでそれを使用するには?

3つのステップがあります:

1  SQLiteライブラリをLiteSyncを含むライブラリに置き換えます

2  URI接続文字列を変更する

3  データベースのレディステータスを確認します

CおよびC ++アプリをコンパイルするときは、アプリケーションをLiteSyncライブラリにリンクする必要があります。

他の言語では、適切なラッパーをインストールする必要があります。



プライマリノードの例

プライマリノードは通常のアプリケーションで、セカンダリノードとまったく同じアプリですが、異なるURIを使用できます。

または、プライマリノード専用のアプリを使用することもできます。

一元化されたdbノードを維持する目的でのみ使用される基本的なスタンドアロンアプリケーションは、次のようになります。

言語を選択してください -->



基本的なアプリの例

ローカルデータベースに書き込む基本的なアプリは次のようになります:

言語を選択してください -->



セキュリティ

LiteSyncは、秘密鍵による暗号化を通じて、どのノードがネットワークの一部になれるかを制御する「共有秘密鍵」方式を使用しています

データベースとノード間の通信の両方で暗号化を有効にすることが可能(そして推奨)です

暗号化についての説明をご確認ください



現在の制限

1  非決定的な関数(それぞれの呼び出しで異なる値を返す)は、random()date('now')のようなものはブロックされます。アプリで生成された明示的な値を使用してください

2  AUTOINCREMENTキーワードはサポートされていません - しかし、それは必要ありません!(詳細はビデオをご覧ください)

3  同時にデータベースにアクセスできるのは一つのアプリケーションだけです。各インスタンスは自身のデータベースを使用し、それらはLiteSyncを使用して複製および同期されます