Skip to content

Tutorial: working with distributed graph database

toshihisa kajiwara edited this page Aug 21, 2014 · 7 revisions

Previous (Setup a distributed database) - Next (Tutorials Page)

サーバーノードが分散データベースに参加して状態で、あるノードがダウンしたりすると、すべてのクライアントはその通知を受けて透過的に別のノードに引き継がれます。 これをコンソールでチェックしてみましょう。OrientDBが分散データベースとして稼働している時、現在のノードクラスターの構成はinfoコマンドで表示できます。

$ cd bin
$ ./console.sh

OrientDB console v.1.6 www.orientechnologies.com
Type 'help' to display all the commands supported.
Installing extensions for GREMLIN language v.2.5.0-SNAPSHOT

orientdb> connect remote:localhost/GratefulDeadConcerts admin admin
Connecting to database [remote:localhost/GratefulDeadConcerts] with user 'admin'...OK
orientdb> info

Current database: GratefulDeadConcerts (url=remote:localhost/GratefulDeadConcerts)

Cluster configuration:
{
  "members":[{
    "name":"node1384015873680",
    "listeners":[{"protocol":"ONetworkProtocolBinary","listen":"192.168.1.179:2425"},{"protocol":"ONetworkProtocolHttpDb","listen":"192.168.1.179:2481"}],
    "id":"3bba4280-b285-40ab-b4a0-38788691c4e7",
    "startedOn":"2013-11-09 17:51:13",
    "databases":[]
    },{
    "name":"node1383734730415",
    "listeners":[{"protocol":"ONetworkProtocolBinary","listen":"192.168.1.179:2424"},{"protocol":"ONetworkProtocolHttpDb","listen":"192.168.1.179:2480"}],
    "id":"5cb7972e-ccb1-4ede-bfda-c835b0c2e5da",
    "startedOn":"2013-11-09 17:30:56",
    "databases":[]
    }],
  "localName":"_hzInstance_1_orientdb",
  "localId":"5cb7972e-ccb1-4ede-bfda-c835b0c2e5da"
}

ここで、あたらしいvertexをノード1に対して作成してみましょう。

orientdb> create vertex V set node = 1
Created vertex 'V#9:815{node:1} v1' in 0,013000 sec(s).

もう一つのノード上のコンソールから、以下のSQLを実行すると:

orientdb> select from v where node = 1
----+------+----
#   |@RID  |node
----+------+----
0   |#9:815|1
----+------+----
1 item(s) found. Query executed in 0.19 sec(s).

このように、ノード1で作成したvertexはノード2にレプリケーションされています。ノード1のDBプロセスをkillしてみます。 すると、ノード2のコンソールには以下のメッセージが表示されます。

INFO [192.168.1.179]:2435 [orientdb] Removing Member [192.168.1.179]:2434 [ClusterService]
INFO [192.168.1.179]:2435 [orientdb]
Members [1] {
	Member [192.168.1.179]:2435 this
}
 [ClusterService]
WARN [node1384015873680] node removed id=Member [192.168.1.179]:2434 name=node1384014656983 [OHazelcastPlugin]
INFO [192.168.1.179]:2435 [orientdb] Partition balance is ok, no need to re-partition cluster data...  [PartitionService]

ノード2が、ノード1が通信できなくなったことを認識したということです。では(停止した)ノード1に接続していたコンソールで、SQLを実行してみましょう。

orientdb> select from V limit 2

WARN Caught I/O errors from /192.168.1.179:2425 (local socket=0.0.0.0/0.0.0.0:51512), trying to reconnect (error: java.io.IOException: Stream closed) [OStorageRemote]
WARN Connection re-acquired transparently after 30ms and 1 retries: no errors will be thrown at application level [OStorageRemote]
----+----+--------------+---------+------------+----+---------------+--------------+-----------+--------------
#   |@RID|name          |song_type|performances|type|out_followed_by|out_written_by|out_sung_by|in_followed_by
----+----+--------------+---------+------------+----+---------------+--------------+-----------+--------------
1   |#9:1|HEY BO DIDDLEY|cover    |5           |song|[5]            |#9:7          |#9:8       |[4]
2   |#9:2|IM A MAN      |cover    |1           |song|[2]            |#9:9          |#9:9       |[2]
----+----+--------------+---------+------------+----+---------------+--------------+-----------+--------------

コンソールはいったん、ノード1が接続できないと表示した後に、ノード2に自動接続して、SQLの実行結果を正しく返しました。

ではノード2につながっているコンソールで、更にvertexを作ってみましょう。

orientdb> create vertex V set node = 2
Created vertex 'V#9:816{node:2} v1' in 0,014000 sec(s).

このオペレーションはジャーナル(更新ログ)に記録されて、後でノード1が復旧したら、データ更新結果が同期されます。 ノード1を再起動させると、分散データベース環境へ自動で参加(orientDBはalignmentアラインメントと呼びます)が成功します。 ノード1のコンソールを起動してチェックしてみましょう。

orientdb> select from v where node = 2
----+------+----
#   |@RID  |node
----+------+----
0   |#9:816|2
----+------+----
1 item(s) found. Query executed in 0.209 sec(s).

同期されています。マルチマスターというのはこういうことですね。起動するサーバーの台数に制限はありません。ただし、低速のネットワークで多くのサーバーを動作させた場合、 同期更新に時間がかかるので、ネットワークのタイムアウトをチューニングしたりする必要があります。

詳細については、 Distributed Architectureを参照して下さい。

Previous (Setup a distributed database) - Next (Tutorials Page)

Clone this wiki locally