前書き

OrientDBは、グラフおよびドキュメントデータベースをサポートするマルチモデルNoSQLデータベースです。 これはJavaアプリケーションであり、任意のオペレーティングシステムで実行できます。 また、完全にhttps://en.wikipedia.org/wiki/ACID[ACID]に準拠しており、マルチマスタークラスタリングとレプリケーションをサポートしているため、簡単に水平にスケーリングできます。

ただし、OrientDBの「クラスター」という言葉は、2つの異なる概念を指す場合があります。

  1. OrientDBを実行しているサーバーであるOrientDB _nodes_のクラスターを持つことができます。 これは、1つのサーバーで複数のOrientDBインスタンスを実行できるため、少なくとも1つの物理(またはクラウド)サーバーを使用することを意味します。

  2. OrientDB _database_内にクラスターを持つこともできます。これは、類似したタイプまたは値のレコードのグループです。 このようなクラスターは、複数のサーバーにまたがって存在することも、1つのサーバーに限定することもできます。

この記事の焦点は、最初の種類のクラスター、つまり ノードのクラスター。 クラスターモードでは、OrientDBはマルチマスターまたはマスターレスの分散アーキテクチャで実行されます。これは、クラスター内のすべてのノードが同等の基盤で動作し、互いのレコードを読み書きできることを意味します。 ただし、ノードはクラスターに_replica_として参加することもでき、読み取り専用モードで動作します。

このチュートリアルでは、OrientDBのコミュニティエディションを使用して、2つのマスターノードと1つのレプリカノードで3ノードのクラスターをセットアップします。

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • クラスタをサポートするのに十分なRAMを備えた3つのUbuntu 16.04サーバー。 これは、ニーズとOrientDBのカスタマイズ方法によって異なりますが、それぞれ4 GBが適切なデフォルトです。

  • https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04 [この初期サーバー設定を使用してUbuntu 16.04チュートリアル]。

  • Javaはすべてのサーバーにインストールする必要があります。https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-get-on-ubuntu-16-04 #installing-the-oracle-jdk [このJavaインストールガイドのJDK 8ステップ]。 OpenJDK JREも機能するため、Oracleライセンスに同意したくない場合は、同じチュートリアルを使用してデフォルトのJREをインストールできます。

  • https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-orientdb-on-ubuntu-16-04 [単一サーバーOrientDBのステップ1インストールガイド]書かれているとおり。 オプションでステップ2に従って、必要なRAMの量を制限することもできます。 OrientDB分散起動スクリプトは、少なくとも4 GBのRAMが使用可能であることを想定しており、これを変更しない限り、少ない場合は起動に失敗します。

  • OrientDBは、https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-orientdb-on-ubuntu-16-04 [ステップ5および6つの単一サーバーOrientDBインストールガイド]、ユニットをリロードした後に停止します(つまり、 サービスを開始せずに)。 行う必要がある変更は、ユニットファイルで「+ ExecStart 」に指定するファイルのみです。 元のチュートリアルでは ` server.sh `を使用しますが、ここでは分散モードに ` server.sh +`を使用します。

手順1-ルートパスワードとOrientDBインスタンス名の生成

まず、分散サーバースクリプト `+ dserver.sh +`を実行して、OrientDBのインスタンスがクラスター内で機能するために必要な資格情報を生成します。 具体的には、これにより、OrientDBのインスタンスのルートパスワードと名前を設定できます。 * 3つすべてのサーバー*でこの手順に従う必要があります。

開始するには、インストールディレクトリに移動します。

cd /opt/orientdb

次に、分散サーバーを起動します。

sudo bin/dserver.sh

分散サーバーを初めて起動すると、* root *ユーザーアカウントのパスワードを指定するよう求められます。 これは、OrientDB Studio、OrientDBを管理するためのWebベースのインターフェイス、コンソールからOrientDBへの接続などのためにサーバーにアクセスするために使用される内部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]:

スクリプトの実行が完了すると、次のような行が表示されます。

Output2017-06-01 02:24:00:717 INFO   v2.2.20 (build 76ab59e72943d0ba196188ed100c882be4315139). [OServer]

この時点で、 `+ CTRL + C +`を使用してプロセスを終了できます。 OrientDBがインストールされたので、いくつかの構成ファイルを変更して、クラスターとして実行できるようにする必要があります。

ステップ2-分散モードで機能するようにOrientDBを構成する

OrientDBのインストールがクラスター内のノードとして機能するためには、 `+ config +`ディレクトリ内の3つのファイルを修正する必要があります。 彼らです:

  1. + hazelcast.xml +:このファイルで定義されたパラメーターは、ノードの自動検出を可能にします。

  2. + default-distributed-db-config.json +:このファイルは、分散環境でのみ使用され、各データベースのノードの動作を定義するために使用されます。

  3. + orientdb-server-config.xml +:これは、OrientDBのメイン設定ファイルであり、分散モードでもスタンドアロンモードでも変更する必要があります。

このステップでは、 `+ hazelcast.xml +`で始まる各ファイルを変更します。

`+ hazelcast.xml +`ファイルの変更

`+ hazelcast.xml +`で設定する必要がある最も重要な設定は、各ノードがクラスターに参加するために使用するメカニズムです。 このセクションで検討する2つのメカニズムは、_IP Multicast_と_TCP / IP-cluster_です。 前者では、各ノードが属するネットワークを自動検出するために使用するマルチキャストアドレスとポートを指定します。 後者では、各クラスターメンバーのIPアドレスを指定する必要があります。 DigitalOceanではIPマルチキャストがサポートされていないため、ここで使用する方法はTCP / IPクラスターです。

開始するには、ファイルを編集用に開きます。

sudo nano /opt/orientdb/config/hazelcast.xml

ファイルはそれほど長くありません。 これは、変更するファイルのセクションのみを示す切り捨てバージョンです。

/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つずつ)この方法に固執します。

ファイルの変更が完了すると、最終バージョンは次のようになります。

/opt/orientdb/config/hazelcast.xml

. . .
   <group>
       <name></name>
       <password></password>
   </group>
   <properties>
       . . .
   </properties>
   <network>
       <port auto-increment="">2434</port>
       <join>
           <multicast enabled="">
               <multicast-group>235.1.1.1</multicast-group>
               <multicast-port>2434</multicast-port>
           </multicast>





       </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

ファイルの関連部分は、以下のコードブロックに示されています。

/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つがダウンしても定足数は形成されません。

  • * executionMode *:同期または非同期のクライアントの実行モードを定義します。 デフォルトでは、クライアントが決定できます。

  • * readYourWrites *:ノードの応答が書き込みクォーラムに到達するためにカウントされるかどうかを指定します。

  • * newNodeStrategy *:新しいノードがクラスターに参加するとどうなりますか。 デフォルト値では、ノードはサーバーのリストの下に自動的に登録されます。

以下のパラメーターを追加します。

  • * hotAlignment *:ノードがダウンしてからオンラインに戻った場合の動作を指定します。 有効にすると、ノードがオフラインのときに同期メッセージが分散キューに保持されます。 オンラインに戻ると、キュー内のすべての同期メッセージをポーリングして同期フェーズを開始します。

  • * servers *:クラスター内のノードの役割(マスターまたはレプリカ)を指定するために使用されます。 デフォルトでは、サーバー内のすべてのノードがマスターになることを示すために、アスタリスク「+ * +」が使用されます。 2つのマスターと1つのレプリカを含むクラスターを構築するため、各ノードの名前とクラスター内での役割を指定して、このパラメーターを変更して一致させます。 名前は、ステップ1で構成したものです。

ファイルの変更が完了すると、次のようになります。

/opt/orientdb/config/default-distributed-db-config.json

{


 "autoDeploy": true,
 "readQuorum": 1,
 "writeQuorum": "majority",
 "executionMode": "undefined",
 "readYourWrites": true,
 "newNodeStrategy": "static",
 "servers": {



 },

 ...

}

完了したら、ファイルを保存して閉じます。 リストの最後のファイルを構成します。

`+ 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で指定したものであることに注意してください。

/opt/orientdb/config/orientdb-server-config.xml

. . .
<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 *に変更します。 編集後、最終バージョンは次のようになります。

/opt/orientdb/config/orientdb-server-config.xml

. . .
<handler class="com.orientechnologies.orient.server.hazelcast.OHazelcastPlugin">
   <parameters>
       <parameter value="" 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

次に、UFWを再起動します。

sudo systemctl restart ufw

OrientDBは前提条件からSystemdサービスとしてすでに設定されているため、残りの構成が完了したので、クラスターを開始できます。

手順4-OrientDBクラスターの起動とテスト

各サーバーで、起動時にサービスが開始されるように、サービスが有効になっていることを確認します。

sudo systemctl enable orientdb

これで、3つのサーバーすべてを起動できます。 最初のサーバーが起動しました(つまり、 最初にクラスターに参加する)が_coordinator server_になります。これは、分散操作が開始される場所です。 特定のサーバーにその役割を持たせたい場合は、まずその役割を開始します。

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:  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                    |
-------------------+------+------------------------------------+-----+---------+-------------------+
||ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|4    |01:26:00 |
| |ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|4    |01:25:13 |
|*|ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|6    |01:24:46 |

サーバーとそのデータベースがオンラインである場合、クラスターが適切に機能している可能性が高いため、これは良い兆候です。 同様の出力も表示されますが、以下のコンソールからデータベースの1つに接続すると、詳細が表示されます。 今のところ、この出力を停止するには、 `+ CTRL + C +`を押します。

クラスター全体の新しいデータのデータ複製を検証するには、1つのサーバーでデータを生成し、それが他のサーバーに複製されるかどうかを確認する必要があります。 *マスターサーバーの1つで、次のコマンドペアを使用してコンソールを起動します。

cd /opt/orientdb/bin
sudo ./console.sh

最後のコマンドは、コンソールの起動中に次の出力を表示し、プロンプトを「+ orientdb> +」に変更する必要があります。

OutputOrientDB console v.2.2.17 (build [email protected]; 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

次に、「++」という名前のデータベースを作成します。

create database remote:localhost/ root  plocal

データベースが正常に作成された場合は、データベースに接続し、プロンプトが一致するように変更する必要があります。

現在、 `++`はまだ空のデータベースです。 テストデータを取得するために、クラスを追加してみましょう。

create class

次に、レコードを挿入します。

insert into  values

挿入したばかりのレコードが新しいデータベースに保持されていることを確認します。

select  from

すべてうまくいった場合、出力は次のようになります。

Output+----+----+----+------+
|#   |id  |age |name  |
+----+----+----+------+
|0   |1   |35  |sammy |
+----+----+----+------+

1 item(s) found. Query executed in 0.216 sec(s).

これでコンソールを終了できます。

exit

この検証プロセスの最後の手順は、クラスター内の別のノードにログインし、新しいデータベースにクエリを実行して、データが正常に伝達されたかどうかを確認することです。

ssh @

前と同じようにコンソールを起動します。

cd /opt/orientdb/bin
sudo ./console.sh

新しいOrientDBデータベースのデフォルトのユーザーおよびパスワードである* admin *としてデータベースに接続します。

connect remote:localhost/ admin admin

前と同じクエリを実行します。

select  from

出力は以前のサーバーの出力と同じである必要があります。サーバーのクラスター全体でクエリを実行しているためです。 これでコンソールを終了できます。

exit

これにより、3ノードクラスターが正しく機能していることが確認されます。

結論

異なる役割(マスターまたはレプリカ)を提供する3つのノードで構成されるOrientDBクラスターをセットアップしました。 このようなセットアップでは、ノードの数を簡単に変更できます。 Ansibleなどの構成管理ツールを使用して自動化するこのようなクラスターの展開。

現時点では、https://www.digitalocean.com/community/tutorials/how-to-secure-your-orientdb-database-on-ubuntu-16-04 [このOrientDBセキュリティガイドをご覧ください]クラスター内の各ノードを保護する方法を学びます。 OrientDB管理に関する公式ドキュメントは、http://orientdb.com/docs/last/Administration.html [プロジェクトのドキュメントサイト]で入手できます。Hazelcastの詳細については、https://hazelcast.org/mastering-hazelcast [ Hazelcastのドキュメント]。