Ignite Web Consoleを使って、DBキャッシュサーバを構築してみた

# Ignite Web Consoleとは

Ignite Web Consoleは、対話型の設定ウィザードにより、Apache Igniteの様々な設定の管理および監視を実施するためのWebアプリケーションです。
主に実現できることは以下の内容になります。

1. Apache Ignite用の様々な設定を作成する。
2. RDBのスキーマから、自動的にApache Ignite用のPOJOコードや設定ファイルを生成できます。
3. SQLクエリを実行し、実行計画を表示します。
4. キャッシュおよびノードのメトリック、CPUおよびヒープの使用状況を表示するクラスタ監視機能（GridGainプラグインとして別途入手可能）。

今回は1, 2を試してみるつもりです。

## Ignite Web Consoleの構成

Ignite Web Consoleを利用する際の構成と今回試してみるDBキャッシュサーバとしての構成は以下のようになります。
Web ConsoleからJavaソース、Ignite設定ファイルを取得し、Igniteに設定することで、IgniteをRDBのキャッシュサーバ(*)として利用することができます。
* もしくは、インメモリデータグリッドをRDBに永続化するとも言えます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/c90e535f-1df5-6469-a1d0-d67c5b65c4ac.png)

まずは、Ignite Web ConsoleとApache Ignore Cluster間のデータのやり取りのため、Web Console AgentをIgniteノードにインストール・設定します。

# 前提条件

今回のIgnite Web Consoleを利用する前提条件は以下のとおりです。

1. Ignite Web ConsoleはDockerで利用する。
1. バックエンドのRDBはPostgreSQLを利用する。
1. PostgreSQLのあらかじめ作成したスキーマから、Ignite Web Consoleでクラスタ用の設定ファイルを抽出し利用する。


Ignite Web Consoleを利用するまでの手順は以下のとおりです。

1. PostgreSQLにテーブルを作成する。
1. Dockerインストール
1. Ignite Web ConsoleのDockerコンテナ起動
1. IgniteサーバのRESTサーバーモードを有効にする。
1. Webエージェントのインストール・起動
1. DBスキーマのインポートとクラスタ設定ファイル出力
1. 作成したクラスタ設定ファイルをIgniteへ適用


# Ignite Web Consoleのインストール

## PostgreSQLにテーブルを作成する。

あらかじめテーブルを作成しておきます。
今回は以下のテーブルを作成しました。

```sql
create table testm (
  key character(8) not null
  , data1 bigint
  , data2 bigint
  , data3 bigint
  , primary key (key)
);
```

## Dockerインストール

CentOS 7.4にDockerを入れました。手順は省略。

## Ignite Web ConsoleのDockerコンテナ起動

Ignite Web ConsoleのDockerコンテナは以下のように起動します。
Ignite Web ConsoleはMongoDBを使用しており、データベースファイルを格納するディレクトリも作成しています。

```terminal
MongoDBがデータベースファイルを作成するホストマシン上のパスを作成
# mkdir -p /var/lib/ignite/mongodb
# docker pull apacheignite/web-console-standalone
# docker run -d -p 80:80 -v /var/lib/ignite/mongodb:/var/lib/mongodb --name web-console-standalone apacheignite/web-console-standalone
```

2回目以降は以下のように起動・停止する。

```terminal
# docker start web-console-standalone
# docker stop web-console-standalone
```


## IgniteサーバのRESTサーバーモードを有効にする。

IgniteサーバがWebエージェントと通信するためには、RESTサーバーモードを有効にしてIgniteノードを起動する必要があります。

```terminal
# cp -pr /opt/apache-ignite/libs/optional/ignite-rest-http/ /opt/apache-ignite/libs/
```


## Webエージェントのインストール・起動

Igniteサーバと通信するWebエージェントをインストールします。

まず、ブラウザでIgnite Web Consoleにアクセスします。ポートは80で私の環境だと以下のURLになります。
最初にIgniteのアカウントを作成する必要があります。（省略）

　http://192.168.20.71/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/cd7bf97a-5b94-e09b-ff75-57276330b0e8.png)

右下の「Download Agent」をクリックすると「ignite-web-agent-2.6.0.zip」がダウンロードされます。
Igniteが稼働しているサーバ（ノード）へダウンロードしたzipファイルをアップロードし、任意のディレクトリに展開します。

今回は以下のディレクトリに展開しました。

　/opt/ignite-web-agent-2.6.0

WebエージェントのserverURIプロパティを、IgniteノードのRESTサーバーURIを参照するように設定します。

```ignite-web-agent-2.6.0/default.properties
server-uri=http://192.168.20.71
```

以下のコマンドでWebエージェントを起動します。

```terminal
# cd /opt/ignite-web-agent-2.6.0/
# ./ignite-web-agent.sh
```

ログは以下のファイルに出力されます。

logs/ignite-web-agent.log


## DBスキーマのインポートとクラスタ設定ファイル出力

以下のディレクトリにJDBCドライバ（Jarファイル）を格納します。
Agent、Webコンソールは起動したままで大丈夫です。

/opt/ignite-web-agent-2.6.0/jdbc-drivers

今回はPostgreSQLを使うため、「postgresql-42.2.4.jar」を格納しました。

(1)右側の「Import from Database」ボタンを押下する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/2f7ee1db-f4c3-08d5-3807-b2d6c5b23000.png)


(2)ダイアログが表示されるので、PostgreSQLの接続のための情報を入力する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/35843d2c-c200-7946-bbdd-cd787c087479.png)

(3)インポートするデータベースを選択する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/c048a4b9-6b8f-8749-61ed-29248383e028.png)

(4)テーブル一覧が表示されるので、チェックを入れます。今回は「testm」テーブルを対象にしています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/f2c50b72-dcea-fbe6-3185-501205176d35.png)

(5)「Save」ボタンを押下します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/65ea991d-dbe9-0dd4-f8cb-5edcd319ebc5.png)

すると、以下のように「MyCluster」が一覧に追加されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/a1370472-7961-4181-1e7c-1f2292d2494d.png)


(6)「Donload project」ボタンを押下すると、「MyCluster-project.zip」ファイルがダウンロードされます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/d8136fd8-8ef7-0c84-6856-05fc2562edac.png)



## 作成したクラスタ設定ファイルをIgniteへ適用

先ほどダウンロードした「MyCluster-project.zip」ファイルを展開し、「MyCluster-project\src\main\resources\META-INF\MyCluster-server.xml」を修正し、Igniteサーバの「/opt/apache-ignite/config」ディレクトリへ格納します。
※ファイル名はdefault-config-postgres-jdbcpojo.xml に変更しました。

変更するのはIPぐらいです。

```default-config-postgres-jdbcpojo.xml
    <bean id="dsPostgreSQL_Testdb" class="org.postgresql.ds.PGPoolingDataSource">
        <property name="url" value="jdbc:postgresql://192.168.20.71:5432/testdb"/>
        <property name="user" value="postgres"/>
        <property name="password" value="postgres"/>
    </bean>

          <property name="addresses">
            <list>
              <value>192.168.20.71:47500..47509</value>
            </list>
          </property>
```

次に、postgresのJDBCドライバ（postgresql-42.2.4.jar）を以下のディレクトリに格納します。

　/opt/apache-ignite/libs

「MyCluster-project.zip」ファイルの「MyCluster-project\src\main\java\com\gmail\mkyz08\model\testm.java」をコンパイルし、jarファイル（testm.jar）を作成し、先ほどのpostgresのJDBCドライバと同じディレクトリに格納します。

最後にIgniteを起動します。

```terminal
# cd /opt/apache-ignite/bin
# ./ignite.sh ../config/default-config-postgres-jdbcpojo.xml 
```

# Igniteクライアントで、データを投入してみる。

Igniteにデータを投入するサンプルプログラムです。

```java
package jp.mky.igniteclient;

import org.apache.ignite.Ignition;
import org.apache.ignite.client.ClientCache;
import org.apache.ignite.client.ClientException;
import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.ClientConfiguration;

import com.gmail.mkyz08.model.Testm;


public class PostgresCacheAppTestm {

	public static void main(String[] args) {
	    ClientConfiguration cfg = new ClientConfiguration().setAddresses("192.168.20.71:10800");

	    try (IgniteClient igniteClient = Ignition.startClient(cfg)) {
	        final String CACHE_NAME = "TestmCache"; // キャッシュの名前はサーバのXML設定と合わせる

	        ClientCache<String, Testm> cache = igniteClient.getOrCreateCache(CACHE_NAME);

	        System.out.format(">>> Created cache [%s].\n", CACHE_NAME);

	        String key = "1";

	        Testm data = new Testm(1L, 2L, 3L);

	        cache.put(key, data);

	        System.out.format(">>> Saved [%s] in the cache.\n", data);

	        Testm cachedVal = cache.get(key);

	        System.out.format(">>> Loaded [%s] from the cache.\n", cachedVal);
	    }
	    catch (ClientException e) {
	        System.err.println(e.getMessage());
	    }
	    catch (Exception e) {
	        System.err.format("Unexpected failure: %s\n", e);
	        e.printStackTrace();
	    }
	}
}
```

IgniteへいくつかデータをPUTした後に、PostgreSQLを検索した結果は以下のとおりで、Writeスルーでデータが書き込まれていることが確認できました。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/377b7642-b155-f271-c740-fb1ad989c271.png)