2008/08/21

H2 Databaseのクラスタリング構成に挑戦

H2 Database Engine
http://www.h2database.com/

H2 Database のクラスタリングに挑戦したのでそのときのメモです。
利用する環境は次の通りです。

OS: Windows XP Professional SP3
Java: JDK 6 Update 7
H2: Version 1.0.77 (2008-08-16)

1. 仮想 2 台構成サーバを再現する
今回は 2 台のサーバを用意できないのでローカルマシンで H2 Server を 2 つ起動して確認します。
まず適当なディレクトリに clustertest というフォルダを作成し、その中に h2.jar をコピーします。さらに server1 ディレクトリと server2 ディレクトリも作成します。
+ [clustertest]
+ h2.jar
+ [server1]
+ [server2]
2. H2 Server を起動する
コマンドプロンプトを 2 つ起動してカレントディレクトリを clustertest にします。
server1 となる H2 を 9101 ポートで起動します。
java -cp h2.jar org.h2.tools.Server
-tcp
-tcpPort 9101
-baseDir server1
続いて server2 となる H2 を 9102 ポートで起動します。
java -cp h2.jar org.h2.tools.Server
-tcp
-tcpPort 9102
-baseDir server2
3. クラスタリングモードにする
新たにコマンドプロンプトを起動して clustertest に移動します。
java -cp h2.jar org.h2.tools.CreateCluster
-urlSource jdbc:h2:tcp://localhost:9101/test
-urlTarget jdbc:h2:tcp://localhost:9102/test
-user sa
-serverlist localhost:9101,localhost:9102
このとき、正常にクラスタリングできれば何もエコーはありません。問題があれば何かしらの Exception が発生すると思います。
また、正常にクラスタリングできている状態でもう一度同じコマンドを実行すると、「クラスタリングエラー - データベースはクラスターモードで動作しています」というエラーが返ってくると思います。

4. 接続してみる
上の 3. で使用したコマンドプロンプトで構わないので、次のコマンドを実行して H2 Server に接続します。
java -cp h2.jar org.h2.tools.Shell
-url jdbc:h2:tcp://localhost:9101,localhost:9102/test
-user sa
「sql>」と出て入力待機状態になれば成功です。

5. テーブルを作成してデータを投入する
クラスタリングを確認するために簡単なテーブルを作成します。
create table hoge (id int, name varchar, primary key (id));
insert into hoge values (1, 'Bill Gates');
insert into hoge values (2, 'Steve Jobs');
insert into hoge values (3, 'Linus Benedict Torvald');
データを確認します。
sql> select * from hoge;
ID |NAME
1 |Bill Gates
2 |Steve Jobs
3 |Linus Benedict Torvald
(3 rows, 0 ms)
6. server1 をダウンさせる
server1 を起動したコマンドプロンプトで Ctrl+C を押すと H2 Server を停止できます。
停止した状態で再度 SELECT してみると…おお、SELECT できました。
さらに server2 を停止して SELECT してみると…
sql> select * from hoge;
Error: org.h2.jdbc.JdbcSQLException: 接続が壊れています
Connection is broken [90067-77]
当然ながらエラーになりました。

実際には 1 台のサーバ上で 2 つの H2 Server を起動するのではなく 2 台以上のサーバでこの構成を作成することになると思いますが、恐らく問題ないのではないでしょうか (実験したら報告します)。
現時点で問題 (というか不明なこと) は一度落ちてしまった H2 Server を起動し直してあげても接続中のコンソールにはその復帰状況伝わっていないということです。下に簡単に例を挙げると…
  • server1 と server2 を起動
  • クラスタリング構成開始
  • コンソール (もしくはアプリケーション) が接続
  • server1 を停止
  • server1 を起動
  • server2 を停止
この状態ではコンソールから操作できません。一度コンソール切断の後、再接続するとつながります。

0 件のコメント: