H2 はクラスタリングをサポートしているため、プロセスは次のようになります。
- サーバーを起動する
java org.h2.tools.CreateCluster
目的のクラスタ間でデータベースを複製するために使用します
そして、1つのターゲット、1 つのソース、およびクラスター エンドポイントのCreateCluster
リストが必要であることを知っているので、次の質問があります。
3 台のサーバー (A、B、および C) のクラスターを開始するには、クラスター上のサーバーの正確な数を知る必要がある、というのは正しいですか。各サーバーには
SET CLUSTER
ステートメント用の DB サーバーのリストが必要だからです。org.h2.tools.CreateCluster.process(String, String, String, String, String)
メソッドの呼び出し。- サーバー A を起動します。
- サーバー B を起動します。
- サーバー C を起動します。
CreateCluster
A をソース、B をターゲット、A、B、C をクラスター リストとして、B マシンで実行します。CreateCluster
B をソース、C をターゲット、A、B、C をクラスター リストとしてC マシンで実行します。
サービスの開始プロセスでA と Bを開始したとします。アプリケーションはクラスターでいくつかの SQL の実行を開始しました。C が見つからない場合、C はdown として扱われますか?
2 番目の質問で開始された開始プロセスを続けて、Cを開始し、B をソースとして、A、B、C をクラスター ノード リストとして実行する準備が整いまし
CreateCluster
た。この瞬間に 2 つのことが起こります。- B は排他モード (
SET EXCLUSIVE 2
)でロックされます。CreateCluster
- SQL
SET CLUSTER 'A,B,C'
は B と C で実行されます
- B は排他モード (
Bがロックされている間に実行されたSQLは、Aで実行されますか? もしそうなら、それらはすでにコミットされていますか?そして、B が解放されたとき、クライアントはまだ待機していますか? その後、このコマンドは C に通知されますか?