Ignite Web Consoleとは
Ignite Web Consoleは、対話型の設定ウィザードにより、Apache Igniteの様々な設定の管理および監視を実施するためのWebアプリケーションです。
主に実現できることは以下の内容になります。
- Apache Ignite用の様々な設定を作成する。
- RDBのスキーマから、自動的にApache Ignite用のPOJOコードや設定ファイルを生成できます。
- SQLクエリを実行し、実行計画を表示します。
- キャッシュおよびノードのメトリック、CPUおよびヒープの使用状況を表示するクラスタ監視機能(GridGainプラグインとして別途入手可能)。
今回は1, 2を試してみるつもりです。
Ignite Web Consoleの構成
Ignite Web Consoleを利用する際の構成と今回試してみるDBキャッシュサーバとしての構成は以下のようになります。
Web ConsoleからJavaソース、Ignite設定ファイルを取得し、Igniteに設定することで、IgniteをRDBのキャッシュサーバ(*)として利用することができます。
- もしくは、インメモリデータグリッドをRDBに永続化するとも言えます。
まずは、Ignite Web ConsoleとApache Ignore Cluster間のデータのやり取りのため、Web Console AgentをIgniteノードにインストール・設定します。
前提条件
今回のIgnite Web Consoleを利用する前提条件は以下のとおりです。
- Ignite Web ConsoleはDockerで利用する。
- バックエンドのRDBはPostgreSQLを利用する。
- PostgreSQLのあらかじめ作成したスキーマから、Ignite Web Consoleでクラスタ用の設定ファイルを抽出し利用する。
Ignite Web Consoleを利用するまでの手順は以下のとおりです。
- PostgreSQLにテーブルを作成する。
- Dockerインストール
- Ignite Web ConsoleのDockerコンテナ起動
- IgniteサーバのRESTサーバーモードを有効にする。
- Webエージェントのインストール・起動
- DBスキーマのインポートとクラスタ設定ファイル出力
- 作成したクラスタ設定ファイルをIgniteへ適用
Ignite Web Consoleのインストール
PostgreSQLにテーブルを作成する。
あらかじめテーブルを作成しておきます。
今回は以下のテーブルを作成しました。
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を使用しており、データベースファイルを格納するディレクトリも作成しています。
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回目以降は以下のように起動・停止する。
# docker start web-console-standalone
# docker stop web-console-standalone
IgniteサーバのRESTサーバーモードを有効にする。
IgniteサーバがWebエージェントと通信するためには、RESTサーバーモードを有効にしてIgniteノードを起動する必要があります。
# cp -pr /opt/apache-ignite/libs/optional/ignite-rest-http/ /opt/apache-ignite/libs/
Webエージェントのインストール・起動
Igniteサーバと通信するWebエージェントをインストールします。
まず、ブラウザでIgnite Web Consoleにアクセスします。ポートは80で私の環境だと以下のURLになります。
最初にIgniteのアカウントを作成する必要があります。(省略)
右下の「Download Agent」をクリックすると「ignite-web-agent-2.6.0.zip」がダウンロードされます。
Igniteが稼働しているサーバ(ノード)へダウンロードしたzipファイルをアップロードし、任意のディレクトリに展開します。
今回は以下のディレクトリに展開しました。
/opt/ignite-web-agent-2.6.0
WebエージェントのserverURIプロパティを、IgniteノードのRESTサーバーURIを参照するように設定します。
server-uri=http://192.168.20.71
以下のコマンドでWebエージェントを起動します。
# 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」ボタンを押下する。
(2)ダイアログが表示されるので、PostgreSQLの接続のための情報を入力する。
(3)インポートするデータベースを選択する。
(4)テーブル一覧が表示されるので、チェックを入れます。今回は「testm」テーブルを対象にしています。
(5)「Save」ボタンを押下します。
すると、以下のように「MyCluster」が一覧に追加されます。
(6)「Donload project」ボタンを押下すると、「MyCluster-project.zip」ファイルがダウンロードされます。
作成したクラスタ設定ファイルを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ぐらいです。
<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を起動します。
# cd /opt/apache-ignite/bin
# ./ignite.sh ../config/default-config-postgres-jdbcpojo.xml
Igniteクライアントで、データを投入してみる。
Igniteにデータを投入するサンプルプログラムです。
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スルーでデータが書き込まれていることが確認できました。