Ubuntu16.04でOrientDBクラスターを構成する方法
序章
OrientDBは、グラフおよびドキュメントデータベースをサポートするマルチモデルのNoSQLデータベースです。 これはJavaアプリケーションであり、任意のオペレーティングシステムで実行できます。 また、完全に ACID であり、マルチマスタークラスタリングとレプリケーションのサポートに不満があり、簡単な水平スケーリングが可能です。
ただし、OrientDBの「クラスター」という言葉は、次の2つの異なる概念を指す場合があります。
- OrientDBを実行しているサーバーであるOrientDBノードのクラスターを持つことができます。 これは、1つのサーバーで複数のOrientDBインスタンスを実行できるため、少なくとも1つの物理(またはクラウド)サーバーを使用することを意味します。
- OrientDB データベース内にクラスターを作成することもできます。これは、同様のタイプまたは値のレコードのグループです。 このようなクラスターは、複数のサーバーにまたがって存在することも、1つのサーバーに限定されることもあります。
この記事の焦点は、最初の種類のクラスター、つまり ノードのクラスター。 クラスターモードでは、OrientDBはマルチマスターまたはマスターレス分散アーキテクチャで実行されます。つまり、クラスター内のすべてのノードが同等の基盤で動作し、互いのレコードを読み書きできます。 ただし、ノードはレプリカとしてクラスターに参加することもでき、読み取り専用モードで動作します。
このチュートリアルでは、OrientDBのコミュニティエディションを使用して、2つのマスターノードと1つのレプリカノードを持つ3ノードクラスターをセットアップします。
前提条件
このチュートリアルに従うには、次のものが必要です。
-
クラスターをサポートするのに十分なRAMを備えた3台のUbuntu16.04サーバー。 これは、ニーズとOrientDBのカスタマイズ方法によって異なりますが、それぞれ4GBが適切なデフォルトです。
-
sudoの非rootユーザーアカウントとファイアウォールは、このUbuntu16.04チュートリアルを使用した初期サーバーセットアップを使用して、各サーバーにセットアップします。
-
Javaはすべてのサーバーにインストールする必要があります。これは、このJavaインストールガイドのJDK8の手順に従って実行できます。 OpenJDK JREも機能するため、Oracleライセンスを受け入れたくない場合は、同じチュートリアルを使用してデフォルトのJREをインストールできます。
-
OrientDBは、シングルサーバーOrientDBインストールガイドのステップ1に従って、各サーバーにをインストールしました。 オプションで、手順2に従って、必要なRAMの量を制限することもできます。 OrientDB分散スタートアップスクリプトは、少なくとも4 GBのRAMが使用可能であることを想定しており、これを変更しない限り、RAMが少ない場合は起動に失敗します。
-
OrientDBは、シングルサーバーOrientDBインストールガイドのステップ5および6に従って、各サーバーでSystemdサービスとしてセットアップし、ユニットをリロードした後に停止します(つまり、 サービスを開始せずに)。 必要な変更は、ユニットファイルの
ExecStart
に指定するファイルだけです。 元のチュートリアルではserver.sh
を使用していますが、ここでは分散モードにdserver.sh
を使用しています。
ステップ1—ルートパスワードとOrientDBインスタンス名を生成する
まず、分散サーバースクリプトdserver.sh
を実行して、OrientDBのインスタンスがクラスター内で機能するために必要な資格情報を生成します。 具体的には、これにより、OrientDBのインスタンスのルートパスワードと名前を設定できます。 3台のサーバーすべてでこの手順を実行する必要があります。
開始するには、インストールディレクトリに移動します。
- cd /opt/orientdb
次に、分散サーバーを起動します。
- sudo bin/dserver.sh
分散サーバーを初めて起動するときに、rootユーザーアカウントのパスワードを指定するように求められます。 これは、OrientDBを管理し、コンソールからOrientDBに接続するためのWebベースのインターフェイスであるOrientDBStudioなどのサーバーにアクセスするために使用される内部OrientDBアカウントです。 ここでパスワードを指定しない場合、パスワードは自動的に生成されます。 ただし、自分で指定することをお勧めします。次のプロンプトが表示されたときに指定してください。
Output+---------------------------------------------------------------+
| WARNING: FIRST RUN CONFIGURATION |
+---------------------------------------------------------------+
| This is the first time the server is running. Please type a |
| password of your choice for the 'root' user or leave it blank |
| to auto-generate it. |
| |
| To avoid this message set the environment variable or JVM |
| setting ORIENTDB_ROOT_PASSWORD to the root password to use. |
+---------------------------------------------------------------+
Root password [BLANK=auto generate it]: *****
Please confirm the root password: *****
次に、OrientDBのインスタンスの名前を設定するように求められます。これは、実行されているクラウドサーバーの名前と同じにすることができます。
Output+---------------------------------------------------------------+
| WARNING: FIRST DISTRIBUTED RUN CONFIGURATION |
+---------------------------------------------------------------+
| This is the first time that the server is running as |
| distributed. Please type the name you want to assign to the |
| current server node. |
| |
| To avoid this message set the environment variable or JVM |
| setting ORIENTDB_NODE_NAME to the server node name to use. |
+---------------------------------------------------------------+
Node name [BLANK=auto generate it]: node-name
スクリプトの実行が終了すると、次のような行が表示されます。
Output2017-06-01 02:24:00:717 INFO OrientDB Server is active v2.2.20 (build 76ab59e72943d0ba196188ed100c882be4315139). [OServer]
この時点で、CTRL+C
を使用してプロセスを終了できます。 OrientDBがインストールされたので、クラスターとして実行できるようにいくつかの構成ファイルを変更する必要があります。
ステップ2—分散モードで機能するようにOrientDBを構成する
OrientDBのインストールをクラスター内のノードとして機能させるには、そのconfig
ディレクトリー内の3つのファイルを変更する必要があります。 彼らです:
hazelcast.xml
:このファイルで定義されたパラメーターにより、ノードの自動検出が可能になります。default-distributed-db-config.json
:このファイルは分散環境でのみ使用され、各データベースのノードの動作を定義するために使用されます。orientdb-server-config.xml
:これはメインのOrientDB構成ファイルであり、分散モードかスタンドアロンモードかに関係なく変更する必要があります。
このステップでは、hazelcast.xml
から始めて各ファイルを変更します。
hazelcast.xml
ファイルの変更
hazelcast.xml
で構成する必要がある最も重要な設定は、各ノードがクラスターに参加するために使用するメカニズムです。 このセクションで検討する2つのメカニズムは、IPマルチキャストとTCP/IPクラスターです。 前者では、各ノードが属するネットワークを自動検出するために使用するマルチキャストアドレスとポートを指定します。 後者の場合、各クラスターメンバーのIPアドレスを指定する必要があります。 DigitalOceanではIPマルチキャストがサポートされていないため、ここで使用する方法はTCP/IPクラスターです。
開始するには、編集用にファイルを開きます。
- sudo nano /opt/orientdb/config/hazelcast.xml
ファイルはそれほど長くありません。 これは、変更するファイルのセクションのみを表示する切り捨てられたバージョンです。
. . .
<group>
<name>orientdb</name>
<password>orientdb</password>
</group>
<properties>
. . .
</properties>
<network>
<port auto-increment="true">2434</port>
<join>
<multicast enabled="true">
<multicast-group>235.1.1.1</multicast-group>
<multicast-port>2434</multicast-port>
</multicast>
</join>
</network>
このファイルに対して行うことは、IPマルチキャストを無効にし、TCP / IPクラスターを有効にするエントリを追加し、クラスターメンバーを指定することです。 各タグを見てみましょう:
-
group> name :この要素は、クラスターの名前を定義します。 好きなものを選ぶことができます。
-
group> password :クラスターに参加するために各メンバーによって送信されるブロードキャストメッセージを暗号化するために使用されるパスワードを定義します。 ここで強力なパスワードを選択してください。
-
network> port :ノードの自動検出に使用されるポートを識別します。
auto-increment
属性は、定義されたポートから開始し、そのポートが使用されている場合は他のポートを試行し続けるようにメカニズムに指示します。 falseに設定すると、定義されたポートが通信に使用され、ポートがすでに使用されている場合はノードの検出が失敗します。 この記事では、属性は無効になります。 -
join> multicast 要素は、IPマルチキャストパラメータを定義するために使用されます。 IPマルチキャストは使用しないため、無視します。 つまり、
enabled
属性をfalseに設定します。 -
join> tcp-ip :これはTCP/IPクラスター関連のパラメーターを定義するために使用されます。
enabled
属性はそれを有効にするために使用されます。 -
join> tcp-ip> member :クラスターの各メンバーを定義します。 各メンバーを指定する方法は他にもありますが、各メンバーのIPアドレスを指定する方法(1行に1つ)を使用します。
ファイルの変更が完了すると、最終バージョンは次のようになります。
. . .
<group>
<name>clusterName</name>
<password>clusterPassword</password>
</group>
<properties>
. . .
</properties>
<network>
<port auto-increment="false">2434</port>
<join>
<multicast enabled="false">
<multicast-group>235.1.1.1</multicast-group>
<multicast-port>2434</multicast-port>
</multicast>
<tcp-ip enabled="true">
<member>your_master_server_ip_1</member>
<member>your_master_server_ip_2</member>
<member>your_replica_server_ip</member>
</tcp-ip>
</join>
</network>
編集が終了したら、ファイルを保存して閉じます。 次は、リストの2番目のファイルです。
default-distributed-db-config.json
ファイルの変更
hazelcast.xml
と同様に、/opt/orientdb/config/default-distributed-db-config.json
にいくつかの変更を加えます。 このファイルで、クラスター内で各サーバーが果たす必要のある役割(マスターまたはレプリカ)を指定します。
編集のために開きます。
- sudo nano /opt/orientdb/config/default-distributed-db-config.json
ファイルの関連部分は、以下のコードブロックに示されています。
{
"autoDeploy": true,
"readQuorum": 1,
"writeQuorum": "majority",
"executionMode": "undefined",
"readYourWrites": true,
"newNodeStrategy": "static",
"servers": {
"*": "master"
},
. . .
}
各行の意味は次のとおりです。
- autoDeploy :データベースをまだ持っていないクラスター内の新しいノードにデータベースをデプロイするかどうかを指定します。
- readQuorum :読み取り操作でクライアントに応答する前にコヒーレントである必要があるクラスターノードからの応答の数。 「1」に設定すると、読み取りの一貫性が無効になります。
- writeQuorum :書き込み操作で、クライアントに応答を送信する前に応答する必要のあるノードの数。 デフォルトはmajorityで、(N / 2)+ 1 を使用して計算されます。ここで、Nはクラスターで使用可能なマスターノードの数です。 大多数を計算するとき、レプリカノードは考慮されません。 マスターノードが2つしかないクラスターでデフォルトのままにすると、ノードの1つがダウンしても、クォーラムは形成されません。
- executeMode :クライアントの実行モード(同期または非同期)を定義します。 デフォルトでは、クライアントが決定できます。
- readYourWrites :ノードの応答が書き込みクォーラムに到達するためにカウントするかどうかを指定します。
- newNodeStrategy :新しいノードがクラスターに参加するとどうなりますか。 デフォルト値では、ノードはサーバーのリストに自動的に登録されます。
次のパラメータを追加します。
- hotAlignment :ノードがダウンしてからオンラインに戻った場合にどうなるかを指定します。 有効にすると、ノードがオフラインのときに同期メッセージが分散キューに保持されます。 オンラインに戻ると、キュー内のすべての同期メッセージをポーリングして同期フェーズを開始します。
- サーバー:クラスター内のノードの役割(マスターまたはレプリカ)を指定するために使用されます。 デフォルトでは、アスタリスク
*
は、サーバー内のすべてのノードがマスターになることを示すために使用されます。 2つのマスターと1つのレプリカを含むクラスターを構築する予定なので、各ノードの名前とクラスター内での役割を指定して、このパラメーターを一致するように変更します。 名前は、ステップ1で構成したものです。
ファイルの変更が完了すると、次のようになります。
{
"replication": true,
"hotAlignment" : true,
"autoDeploy": true,
"readQuorum": 1,
"writeQuorum": "majority",
"executionMode": "undefined",
"readYourWrites": true,
"newNodeStrategy": "static",
"servers": {
"orientdb_server_name_1": "master",
"orientdb_server_name_2": "master",
"orientdb_server_name_3": "replica"
},
...
}
完了したら、ファイルを保存して閉じます。 次に、リストの最後のファイルを構成します。
orientdb-server-config.xml
ファイルの変更
/opt/orientdb/config/orientdb-server-config.xml
内には、OrientDBのHazelcastインメモリデータグリッドを使用したクラスタリングを有効または無効にするために使用されるパラメーターがあります。 手順1でOrientDBインスタンスに付けた(またはスクリプトを自動生成させた)名前は、このファイルで変更できます。
編集のために開きます。
- sudo nano /opt/orientdb/config/orientdb-server-config.xml
ファイルの関連セクションを以下に示します。これはファイルの上部にあります。 NodeName パラメーターの値は、ステップ1で指定した値であることに注意してください。
. . .
<handler class="com.orientechnologies.orient.server.hazelcast.OHazelcastPlugin">
<parameters>
<parameter value="${distributed}" name="enabled"/>
<parameter value="${ORIENTDB_HOME}/config/default-distributed-db-config.json" na$
<parameter value="${ORIENTDB_HOME}/config/hazelcast.xml" name="configuration.haz$
<parameter value="orientdb_server_name_1" name="nodeName"/>
</parameters>
</handler>
. . .
クラスタリングを有効にするには、enabledパラメーターをtrueに変更します。 編集後、最終バージョンは次のようになります。
. . .
<handler class="com.orientechnologies.orient.server.hazelcast.OHazelcastPlugin">
<parameters>
<parameter value="true" name="enabled"/>
<parameter value="${ORIENTDB_HOME}/config/default-distributed-db-config.json" na$
<parameter value="${ORIENTDB_HOME}/config/hazelcast.xml" name="configuration.haz$
<parameter value="orientdb_server_name_1" name="nodeName"/>
</parameters>
</handler>
. . .
ファイルの編集が終了したら、保存して閉じます。
クラスタを起動してテストする前に残されているのは、OrientDBのトラフィックがファイアウォールを通過できるようにすることだけです。
ステップ3—ファイアウォールを通過するOrientDBトラフィックを許可する
今すぐクラスターを起動しようとすると、OrientDBのトラフィックがファイアウォールによってブロックされます。 次のポートを通過するトラフィックを許可するルールを追加しましょう。
2424
、バイナリ通信に使用2434
、クラスター通信の交換に使用
ポート2424
および2480
を開きます。
- sudo ufw allow 2424
- sudo ufw allow 2434
注:ポート2480
は、アプリケーションのWebインターフェイスであるOrientDBStudioにアクセスするために使用されます。 これはHTTPを使用するため、安全ではなく、パブリックインターネットに公開しないでください。 ただし、テストセットアップでこのポートのトラフィックを許可する場合は、次の方法で許可できます。
- sudo ufw allow 2480
次に、UFWを再起動します。
- sudo systemctl restart ufw
OrientDBは、前提条件からSystemdサービスとして既にセットアップされているため、残りの構成が完了したので、クラスターを開始できます。
ステップ4—OrientDBクラスターの開始とテスト
各サーバーで、サービスが有効になっていることを確認して、起動時にサービスが開始されるようにします。
- sudo systemctl enable orientdb
これで、3つのサーバーすべてを起動できます。 最初のサーバーが起動しました(つまり 最初にクラスターに参加する)がコーディネーターサーバーになり、ここで分散操作が開始されます。 特定のサーバーにその役割を持たせたい場合は、最初にそのサーバーを起動します。
- sudo systemctl start orientdb
プロセスステータスをチェックして、正しく開始されたことを確認します。
- sudo systemctl status orientdb
次のような出力が表示されます。
Output● orientdb.service - OrientDB Server
Loaded: loaded (/etc/systemd/system/orientdb.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2017-06-01 02:45:53 UTC; 7s ago
サーバーが起動しない場合は、出力で手がかりを探します。 エラーの潜在的な原因には、RAMが不足している、Java JREがインストールされていない、または検証に失敗した変更されたJSONファイルが含まれます。 手順2のファイルに変更を加えた場合は、必ずOrientDBを再起動してください。
プロセスが正しく実行されたら、クラスターが正しく機能していることをテストしましょう。 3つのノードのいずれかで、クラスターに関連するsyslogエントリをフィルタリングします。
- sudo tail -f /var/log/syslog | grep -i dserver
このコマンドを使用すると、クラスターのすべてのメンバーがオンラインであることを示す次のような出力が表示されます。 アスタリスクは、どのマスターがコーディネーターサーバーであるかを示します。
Output-------------------+------+------------------------------------+-----+---------+-------------------+
|Name |Status|Databases |Conns|StartedOn|Binary |
-------------------+------+------------------------------------+-----+---------+-------------------+
|orientdb-replica-1|ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|4 |01:26:00 |111.111.111.111
|orientdb-master-2 |ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|4 |01:25:13 |222.222.222.222
|orientdb-master-1*|ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|6 |01:24:46 |333.333.333.333
サーバーとそのデータベースがオンラインの場合、クラスターが正しく機能している可能性が高いため、これは良い兆候です。 以下のコンソールからデータベースの1つに接続すると、同様の出力が表示されますが、より多くの情報が表示されます。 CTRL+C
を押すと、この出力を今のところ停止できます。
クラスタ全体の新しいデータでのデータ複製を確認するには、1つのサーバーでデータを生成してから、他のサーバーに複製されるかどうかを確認する必要があります。 マスターサーバーの1つで、次のコマンドのペアを使用してコンソールを起動します。
- cd /opt/orientdb/bin
- sudo ./console.sh
最後のコマンドは、コンソールの起動中に次の出力を表示し、プロンプトをorientdb>
に変更する必要があります。
OutputOrientDB console v.2.2.17 (build UNKNOWN@r98dbf8a2b8d43e4af09f1b12fa7ae9dfdbd23f26; 2017-02-02 07:01:26+0000) www.orientdb.com
Type 'help' to display all the supported commands.
Installing extensions for GREMLIN language v.2.6.0
orientdb>
次に、OrientDBサーバーインスタンスに接続します。 このコマンドは、 root ユーザーアカウントを使用してサーバー上で実行されているOrientDBのインスタンスに接続するだけであり、データベースには接続しません。 パスワードは、手順3で作成したものです。
- connect remote:localhost root root-password
次に、CallMeMaybe
という名前のデータベースを作成しましょう。
- create database remote:localhost/CallMeMaybe root root-password plocal
データベースが正常に作成された場合は、データベースに接続すると、それに合わせてプロンプトが変更されます。
注:「権限が拒否されました」などのエラーが表示された場合は、/opt/orientdb/databases
ディレクトリの権限を確認してください。 コンソールからデータベースを作成するアカウントには、そのフォルダーへの読み取りおよび書き込み権限が必要です。 詳細については、このLinux権限チュートリアルをご覧ください。
現在、CallMeMaybe
はまだ空のデータベースです。 テストデータを取得するために、クラスを追加しましょう。
- create class Artist
次に、レコードを挿入します。
- insert into Artist (id, name, age) values (01,'sammy', 35)
新しいデータベースに、挿入したばかりのレコードが保持されていることを確認します。
- select id, age, name from Artist
すべてがうまくいった場合、出力は次のようになります。
Output+----+----+----+------+
|# |id |age |name |
+----+----+----+------+
|0 |1 |35 |sammy |
+----+----+----+------+
1 item(s) found. Query executed in 0.216 sec(s).
これでコンソールを終了できます。
- exit
この検証プロセスの最後のステップは、クラスター内の別のノードにログインし、新しいデータベースにクエリを実行して、データが正常に伝播されたかどうかを確認することです。
- ssh sammy@another_orientdb_server_ip
前と同じようにコンソールを起動します。
- cd /opt/orientdb/bin
- sudo ./console.sh
admin としてデータベースに接続します。これは、新しいOrientDBデータベースのデフォルトのユーザーとパスワードです。
- connect remote:localhost/CallMeMaybe admin admin
以前と同じクエリを実行します。
- select id, age, name from Artist
サーバーのクラスター全体でクエリを実行しているため、出力は前のサーバーと同じである必要があります。 これで、コンソールを終了できます。
- exit
これにより、3ノードクラスターが正しく機能していることが確認されます。
結論
異なる役割(マスターまたはレプリカ)を提供する3つのノードで構成されるOrientDBクラスターをセットアップしました。 このような設定では、ノード数の変更が簡単です。 Ansible のような構成管理ツールを使用して、このようなクラスターのデプロイを自動化すると、さらに簡単で、楽しく、タスクが少なくなります。
今のところ、クラスター内の各ノードを保護する方法については、このOrientDBセキュリティガイドを参照してください。 OrientDB管理に関する公式ドキュメントは、プロジェクトのドキュメントサイトで入手できます。また、Hazelcastの詳細については、Hazelcastドキュメントにアクセスしてください。