Tech Sketch Bucket of Technical Chips by TIS Inc.

Infinispanの紹介(1) キャッシュ機能

Pocket

InfinispanはJBossASの内部でも使用されるキャッシュサーバですが、MapReduceのアプリケーションの実行基盤としても使用できます。これから3回にわたり、Infinispanのキャッシュ機能、クラスタ構成、MapReduceでのアプリケーション実行を紹介します。


Infinispanとは

Infinispan は、標準規約の JSR 107 (JCACHE - Java Temporary Caching API)および JSR 347 (Data Grids for the Java Platform)の考えにもとづいた、Key/Value型のデータを格納するピュアJavaのインメモリデータグリッドです。このInfinispanはJBossで開発されオープンソース(LGPL 2.1)のもとで使用でき、またRedHat社が JBoss Data Grid という名称で有償サポートを提供しています。

Infinispanの使用方法は、埋め込み型(アプリケーションと同一JVMで稼働)とクライアント/サーバ型(クライアントアプリケーションから様々なプロトコルで使用可能)の2つの形態があります。

infini_1_arch.jpg

また、1台構成(Localモード)ではなく複数台のInfinispanサーバでクラスタを構成して拡張性・可用性向上を実現できます(ここではクライアント/サーバ型で図示します)。

infini_1_cluster.jpg

このクラスタ構成でのデータの保持は、Replicatedモード(データを全ノード保持)とDistributedモード(データを一部のノードのみに保持)の2つの形態があります。

Infinispanのキャッシュ機能を埋め込み型で使う

Infinispanを1台構成(Localモード)の埋め込み型で用いる場合のキャッシュ機能の使い方を紹介します。

開発環境の作成

Infinispanのアプリケーション作成にあたっては、mavenを用い開発環境のプロジェクトを作成します。これはmvnコマンド

を実行することによりInfinispanのプロジェクトが作成され、サンプルアプリケーションも生成されます。生成されるファイルの一覧を示します(ディレクトリ"gid"の部分はmvnコマンド実行中に入力が要求されるmavenのgroupIdで、入力内容に応じたディレクトリ構成になります)。

なお、pom.xmlでのInfinispanのバージョン指定が古いので、15行目を

のように最新のものに書き換え、"mvn package"でコンパイルします。アプリケーションの実行は"mvn -Prun exec:java"で行えます。

キャッシュ機能のコード概要

mavenで作成されたサンプルアプリケーションApplication.javaより、データを格納・更新するコードを抜粋します。

まず、キャッシュマネージャDefaultCacheManagerに環境設定のXMLファイルinfinispan-local.xmlを指定します(1台構成ではファイルの中身が空でもデフォルト値で稼働します。次回紹介するクラスタ構成では通信方式の指定が必須となります)。
キャッシュ作成のgetCache()に引数がありませんのでデフォルト設定のキャッシュが作成されます。後述の永続化の設定等カスタマイズが必要な場合は、getCache()の引数にキャッシュの名称を付け、そのキャッシュに対するカスタマイズ設定をXMLファイルに設定します。
キャッシュを作成すると、それに対してKey/Valueのデータを格納(put)、更新(replace)するなどの処理が行えます。

実使用にあたっての考慮点

Infinispanはインメモリのデータグリッドですので、デフォルト設定のままではサーバ再起動でキャッシュデータは消失します。これを避ける手段としてファイルシステムでの永続化(CacheStore)があります(JDBCの使用も可能です)。環境設定はXMLファイルに次のように定義します。

まず、"teams"という名称のキャッシュを用いるとし、に"teams"の名称を設定します。この中に永続化のためにFileCacheStoreのloaderを指定します。
この設定によりプロパティlocationで指定したディレクトリ下にキャッシュ名称(この場合はteams)のディレクトリが作成され、キャッシュの内容が永続化されます。
また、アプリケーションでは、getCache()の引数にキャッシュ名称(この場合はteams)をつけます。
これにより、Infinispanサーバを再起動してもデータの消失を防げます。

また、InfinispanはピュアJavaですのでOutOfMemoryエラーを防止するために

  • Expiration:一定時間の後にデータを消す
  • Eviction:任意のエントリ数を超えた場合にデータを消す
  • Passivation:CacheStoreに書き出す

のようなことを検討する必要があります。詳細はマニュアルの Cache Loaders and Stores を参照ください。

Infinispanをクライアント・サーバ型で使う

HotRodプロトコルの場合

Infinispanサーバに外部のJavaアプリケーションがHotRodと呼ばれる独自の高速なプロトコルでアクセスすることができます。このHotRodの利点として、

  • smart routing: Distributionモードで使用時に実際にデータがあるノードと直接通信する
  • 任意のデータ型が利用できる
  • ロードバランシング・フェールオーバーをドライバが自動で行う

があげられます。現在はJavaのドライバのみが提供されますので、他言語から使用する場合は汎用的なRESTあるいはmemcacheのプロトコルを用います。
HotRodの使用手順を示します。

1) Infinispanのバイナリモジュールを ここから 入手します。今回はバージョン5.2.1.Finalを使用します。
2) 環境設定のXMLファイルは"etc/config-samples/distributed-udp.xml"を用い、namedCacheに使用するキャッシュの名称(この場合はteams)を設定します。

3) Infinispanサーバを起動します。オプションprotocolに使用するプロトコルHotRodを、オプションcache_configに使用するXMLファイルを指定します。

4) アプリケーションの作成にあたって
埋め込み型との差異は、キャッシュマネージャにRemoteCacheManagerを指定し、サーバのアドレス・ポート番号およびサーバの定義ファイルで指定したキャッシュの名称を指定します。

キャッシュの作成後は埋め込み型と同様にKey/Valueのデータを格納(put)、更新(replace)するなどの処理が行えます。
なお、前述のmavenで作成したプロジェクトを流用する場合は、pom.xmlのdependencyにinfinispan-client-hotrodを追加する必要があります。

RESTインターフェースの場合

InfinispanのRESTサーバをTomcat上で稼働させ、RESTでアクセスする手順を示します。

1) Infinispanのバイナリモジュールを ここから 入手します。今回はバージョン5.2.1.Finalを使用します。
2) Tomcatのwebappsにディレクトリinfinispanを作成し、そこにバイナリモジュール内のREST機能のWARファイル modules/rest/infinispan-server-rest.war を解凍します。
3) Infinispanの定義ファイルを作成します。infinispan/WEB-INF/web.xmlには

という、存在しない定義ファイルが指定されていますので、例えばinfinispan.xmlと名称を変え、実際の定義ファイルは infinispan/WEB-INF/classes/infinispan.xml に前述のHotRodプロトコルと同様に作成します。

4) Tomcatを起動すると、InfinispanのRESTサーバが使用可能になります。RESTサーバにアクセスする際のURLは "http://192.168.0.1:8080/infinispan/rest/キャッシュ名称(本例ではteams)/key値" の様になります。このURL呼び出し時のHTTPメソッドでInfinispanに対する処理が次のように決まります。

HTTPメソッド Infinispanの処理 レスポンスコード レスポンスデータ 備考
PUT BODYにValue値 put 200 なし key値が存在しても200(上書き)
GET get 200 key値に対するValue値 key値が存在しなければ404
DELETE remove 200 なし key値が存在しなくても200

最後に

今回は、1台構成のLocalモードでのキャッシュ機能の使い方を紹介しました。単なるキャッシュ機能だけではなく、CacheStoreの機能でのOutOfMemoryエラーの防止、HotRodプロトコルというmemcacheプロトコルより高速・高機能なものの使用が特徴としてあげられます。
次回はInfinispanをクラスタ環境で稼働させる方法を紹介します。

エンジニア採用中!私たちと一緒に働いてみませんか?