#chiroito ’s blog

Java を中心とした趣味の技術について

Infinispan 10.1 の環境を構築する

Infinispan を使った環境を構築する場合、ライブラリモード(Embedded)方式とクライアントサーバ方式の2通りの方法があります。今回はmycache というキャッシュを持つ環境の作り方をそれぞれ簡単に紹介します。

今回試したバージョンは Infinispan 10.1.3.Final です。

2つの方式

ライブラリモードは、みなさんが書いたアプリケーションと同じメモリ空間にキャッシュしたデータが格納されます。APIとしての機能はこちらの方が高機能な印象です。

f:id:chiroito:20200309144230p:plain

参考:Embedding Infinispan 10.1

クライアントサーバモードは、専用のサーバプロセスにデータが格納されます。クライアントからサーバにあるデータへのアクセスは必ずネットワークを介します。

f:id:chiroito:20200309150137p:plain

参考:Deploying and Configuring Infinispan 10.1 Servers

どちらの構成でもクラスタを組むことができます。

ライブラリモード

maven でやっている場合には以下の様に依存関係を追加します。

<dependency>
    <groupId>org.infinispan</groupId>
    <artifactId>infinispan-core</artifactId>
    <version>10.1.3.Final</version>
</dependency>

シングルノード

シングルノードの場合は、特になにも気にする必要はありません。DefaultCacheManager を使うことで簡単に実現できます。

EmbeddedSingleSample.java

public class EmbeddedSingleSample {
    public static void main(String[] args) {
        EmbeddedCacheManager manager = new DefaultCacheManager();
        manager.defineConfiguration("mycache", new ConfigurationBuilder().build());
        Cache<Object, Object> c = manager.getCache("mycache");
    }
}

マルチノード

クラスタを組む時の設定には「クラスタを構成する全てのノードで共通の設定」と「ノード毎に異なる設定」があります。前者にはクラスタの名前やキャッシュの設定などがあり、後者にはIPアドレスやポートなどがあります。前者は設定ファイルや実装コードなどで固定のコードで指定し、後者は実行時に引数として指定するのが良いでしょう。

この例では、クラスタ全体で共通の設定を設定ファイル(embedded_sample.xml)に保存して、それを読み込みます。クラスタを組むためのIPは実行時に-Djgroups.tcp.address=<IPアドレス>として渡しています。

最低限必要な設定、実装、実行方法は以下のとおりです。

embedded_sample.xml

<infinispan>
    <cache-container>
        <transport stack="tcp"/>
        <distributed-cache name="mycache" />
    </cache-container>
</infinispan>

EmbeddedSample.java

public class EmbeddedSample {
    public static void main(String[] args) throws Exception{
        EmbeddedCacheManager manager = new DefaultCacheManager("embedded_sample.xml");
        Cache<String, String> mycache = manager.getCache("mycache");
    }
}

実行時引数にIPの情報を渡して次の様に実行します。今回は省略していますが、実際にはクラスパスをきちんと付けてください。

java -Djgroups.tcp.address=192.168.1.1 EmbeddedSample.java

複数の場所で実行することでクラスタを組めます。

クライアントサーバモード

こちらの場合は最低でもクライアントとサーバが必要なので、シングルノードはありません。全てマルチノードです。クライアントとサーバでそれぞれ設定が必要です。

設定ファイルの詳細はこちらをご覧ください。

urn:infinispan:config:10.1

サーバ

サーバは、サーバソフトウェアをダウンロードして、設定を行い起動します。

以下から Server をダウンロードして解凍して下さい。

Download - Infinispan

※公式のコンテナイメージを使う場合は認証機能が有効になっています。そのため少し難しくなっていますのでご注意ください。未経験の人が軽く試してみたい場合にはコンテナイメージの使用はお奨めしません。

設定は、サーバの設定とキャッシュの設定の2つが必要です。

サーバの設定は、特に変更せずとも試せます。今回はIPの設定を起動時に指定します。

キャッシュの設定はCLIで行う方法と、手で行う方法があります。CLIで作成するとdata/cacheファイルにキャッシュの情報が永続化されます。手で行う方法はこのファイルを手で修正します。起動時にこの設定ファイルが毎回読み込まれ、クラスタに新たに参加したノードにこのファイルがなければ内容がコピーされます。

server/data/cache

<?xml version="1.0" ?>

<infinispan>
    <cache-container>
        <distributed-cache name="mycache" />
    </cache-container>
</infinispan>

サーバの起動にはbin/server.batを使います。LinuxなどのOSではbin/server.shになります。使いたいIPアドレスを-bオプションで指定して起動します。

bin/server.bat -b 192.168.1.1

クライアント

クライアントからサーバへ接続するには、サーバのIPとポートを最低1つ指定します。

必要なパラメータはこちらに記載されています。

org.infinispan.client.hotrod.configuration (Infinispan JavaDoc All 10.1.5.Final API)

public class HotRodClientSample {
    public static void main(String[] args) {
        ConfigurationBuilder cb = new ConfigurationBuilder();
        cb.addServer().host("192.168.1.1").port(11222);
        RemoteCacheManager manager = new RemoteCacheManager(cb.build());
        RemoteCache<String, String> c = manager.getCache("mycache");
    }
}

このアプリを起動することでクライアントがサーバへ接続します。