Tech Sketch Bucket of Technical Chips by TIS Inc.

Infinispanの紹介(2) クラスタ構成

Pocket

前回 はInfinispanを1台構成(Localモード)で稼働させ、キャッシュサーバとして使用する方法を紹介しました。今回は複数台のInfinispanサーバでクラスタを構成し、拡張性・可用性向上を実現する機能を紹介します。


クラスタ構成

データの保持

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

infini_1_cluster.jpg

この選択としては読み込み速度または耐障害性を優先するならReplicatedモード(Javaヒープの使用量が大きくなるデメリットがありますが)、書き込み速度またはJavaヒープの使用量の低減を優先するならDistributedモードになります。

クラスタ構成での通信

Infinispanをクラスタ構成で使用する場合、その通信処理には JGroups が用いられます。
前回、mavenを用いたプロジェクト作成を紹介しましたが、その中にクラスタ構成で用いる場合の環境設定のXMLファイル"src/main/resources/infinispan-clustered-udp.xml"があります。その内容を示します。

<transport>のプロパティで指定した"jgroups-udp.xml"がJGroupsの環境設定を行うXMLファイルです。このファイルの実体はInfinispanのJARファイルに存在し、次のように通信で用いるマルチキャストアドレスなどが設定されています。

JGroupsとは

JGroupsの機能により複数のアプリケーション間でデータの同期が容易に実現できることを紹介します。この機能により、Infinispanのクラスタ内のデータの複製が実現されます。

概要

データの同報通信(1対多の通信)はIPマルチキャストで実現できますが、プロトコルがUDPのためメッセージの欠落、順序の入れ替わりが発生し、信頼性が低いものです。
JGroupsはこの欠点を解決するもので、IPマルチキャストにもとづき、

  • すべての受信者にメッセージをロストせずに伝達する
  • 大きなメッセージは内部的には分割して送信する
  • メッセージの送信順に受信が行われる

の特徴を持つ信頼性の高い同報通信を実現します。

基本的な使い方

JGroupsでメッセージを送受信する処理を示します。

メソッドconnectにより、"MyCluster"という名前のクラスタを構築し(既に同一アプリケーションが稼働していればそのクラスタに参加します)、ポート45588でマルチキャスト通信する準備を行います。
メソッドsendにより、メッセージ(Messageの第3引数が送信データ)をクラスタ環境にマルチキャストで送信します。このメッセージはメソッドsetReceiverで定義したメソッドreceiveで受信できます。
このように数行のコードでクラスタ環境の同報通信が可能となります。

データ同期に使う機能

JGroupsでアプリケーション間のデータ同期のために使用する機能を示します。

1)クラスタを構成するノードの把握
クラスタのノード構成に変更があった際に、現在のノードの一覧をメソッドviewAcceptedで取得できます(構成変更時に自動で呼び出されるコールバックルーチンです)。

このクラスタのノード情報を元に、送信データのMessageの第1引数に送信先のノードを指定し、特定のノードのみにメッセージ送信することが可能です。詳細は チュートリアル を参照ください。

2)他ノードとデータの同期を取る
クラスタの他ノードが保持するデータを取得することができます。呼び出し元のノードがメソッドchannel.getStateを呼ぶと、クラスターの他のノードのコールバックルーチンgetStateが自動で呼ばれ、呼び出し元にデータを送信することが行えます。getStateは次のようになります。

この処理で送信されたデータは、呼び出し元のコールバックルーチンsetStateで自動に受信されます。setStateは次のようになります。

この機能により、あるノードの起動時にメソッドchannel.getStateを呼ぶことで、既に稼働しているノードが保持しているデータの入手が行え、クラスタ内でのデータの一貫性の保持が容易に実現できます。

Infinispanのキャッシュ機能をクラスタ環境で使う

クラスタ環境で埋め込み型のInfinispanを使用する際の環境設定を1台構成(Localモード)との差異で示します。この差異は環境設定のXMLファイル内で吸収され、Javaアプリケーションのコードに差異はありません。

Replicatedモードの場合

準備

サンプルは ここから 入手できます。なお、キャッシュマネージャの作成はAbstractNode.javaのコンストラクタで行われていますが、環境設定がハードコーディングで行われていますので、次のようにコメントを書き換えXMLファイルの使用に変更します。

また、mavenのpom.xml内のInfinispanのバージョンが"5.1.0.CR2"ですので最新の"5.2.1.Final"に書き換えます。

環境設定の確認

環境設定に用いられる XMLファイル の内容を示します。

<transport>でJGroupsの環境設定のXMLファイルを、<clustering>でクラスタがreplicationモードであることを指定します。

サンプルの稼働

Node0.javaとNode1.javaを起動します。この中ではメソッドwaitForClusterToFormによりお互いが起動するのを待ちます。Node1が起動すると"Demo"という名称のキャッシュに("key", "value")のデータを書き込みます。Node0ではデータのリスナーとして LoggingListener を登録し、キャッシュにデータが格納されればその内容を表示します。

Distributedモードの場合

準備

Replicatedモードとの差異を示します。サンプルは ここから 入手できます。
AbstractNode.javaは先ほどと同様に環境設定にXMLファイルを用いるように、またpom.xml内のInfinispanのバージョンを最新に修正します。

環境設定の確認

環境設定に用いられる XMLファイル の内容を示します。

<transport>でJGroupsの環境設定のXMLファイルを、<clustering>でクラスタがdistributionモードであることを、numOwnersで何台のノードでデータを保持するかを指定します。本例では3台のノードを稼働させますが、各データはそのうちの2台で保持することになります。

サンプルの稼働

Node0.java,Node1.javaとNode2.javaを起動します。この中ではメソッドwaitForClusterToFormによりお互いが起動するのを待ちます。Node2が起動すると"Demo"という名称のキャッシュに("key", "value")のデータを20回書き込みます。Node0,1,2ではデータのリスナーとして LoggingListener を登録し、キャッシュにデータが格納されればその内容を表示します。

最後に

今回は、Infinispanを複数台構成のReplicationモード、Distributionモードで稼働させる方法を紹介しました。1台構成のLocalモードに対して環境設定のXMLファイルの変更だけで非常に簡単にクラスタ化が実現できます。
次回はInfinispanのDistributionモードでMapReduceのアプリケーションを稼働させる方法を紹介します。

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