CLOVER🍀

That was when it all began.

JGroupsについて、少しだけ調べてみました

Infinispanに関する設定で出てくる、JGroupsというものに対する設定があります。

設定ファイルの内容が通信関連の設定なので、クラスタリングの際の通信にはこれが使われているのだろうとは思っていましたが、JBoss ASでのクラスタリングとかにも使われているソフトウェアだったんですね。
http://thinkit.co.jp/free/compare/14/3/1.html

JBoss系は使ってこなかったので、全然知りませんでした…。

JGroups
http://www.jgroups.org/

とはいえ、案の定日本語の情報は少ないですね。今回、JGroupsを調べているのは、Infinispanを試してみたいがためなので、あんまり深追いしない程度にさらっと…。

公式ドキュメント
http://www.jgroups.org/manual-3.x/html/index.html

そもそもJGroupとは?という話ですが、クラスタ環境でのノード間のP2P通信に関するサポートを行うソフトウェアらしく、いくつかJGroupsで定義されているプロトコルがあるようです。

通信に関するプロトコル

ノート間の通信は、マルチキャストまたはユニキャストで行うそうな。使用する通信プロトコルとしては、

をサポートしています。
この設定は、XMLでの設定UDPTCP/TUNNELタグに対応します。

ソケットのバッファサイズやメッセージ集約、スレッドプールに関する設定などを行います。スレッドプールの設定が2個あるのは何ででしょう?と思っていたのですが、JGroups内部などで使う特殊なメッセージを使う時に割り当てられるものがあるみたいです。

他のノードやコーディネータを探すプロトコル

これを、ディカバリプロトコルというそうです。

ノードが最初に接続する際に、他のノードやコーディネータ (グループ全体を管理するノード)を探すために使用します。そして、コーディネータからメンバーの最新情報が通知されます、と。
*ここでのプロトコルは、グループメンバーシッププロトコルGMS)です

ディカバリプロトコルには、UDPではPINGを使用します(PINGタグに対応)。PINGに誰も応答しない場合は、グループの最初のメンバーとなります。

ディカバリプロトコルとしては、以下が存在します。

  • PING
  • TCPGOSSIP
  • TCPPING
  • MPING
障害検出プロトコル

heartbeatメッセージに基づく、障害検知プロトコル(FailureDetection)です。障害が発生した可能性があるノードが検出されると、ここで定義されたプロトコルが使用され、最終的にノードがダウンしていると判断された場合はクラスタのメンバーから切り離されます。その他のメンバーには、新しいクラスタの定義が送られることになります。

設定としては、以下のタグを使用します。

  • FD
  • FD_SOCK
  • VERIFY_SUSPECT

組み合わせて使用することができます。

配信の信頼性を確保するプロトコル

データパケットが実際に正しい順序 (FIFO) で、目的地となるノードに配信されるようにするプロトコルです。

設定としては、以下のタグを使用します。

  • UNICAST
  • UNICAST2
  • pbcast.NAKACK
グループメンバーシップ(GMS

現在の、アクティブなメンバーの一覧を管理するプロトコルです。クラスタへの参加(Join)/退出(Leave)や、障害検出プロトコルによるメッセージ(Suspect)も取り扱います。

メンバーに変更があった場合は、各メンバーに通知が行われます。コーディネータが離脱する場合には、他のメンバーがコーディネータとなるように処理が行われます。

設定としては、以下のタグを使用します。

フロー制御プロトコル

文字通りFlow Controlですが、データの受信側と送信側の流量制御を行うためのプロトコルのようです。流量制御はクレジット(credit)の設定で行います。

設定としては、以下のタグを使用します。

  • FC
  • MFC(Multicast Flow Control)
  • UFC(Unicast Flow Control)
分離されたネットワークのマージ

ネットワークエラーが発生し、クラスタが分断された後、再度単一のクラスタに戻すためのプロトコルです。各クラスタのコーディネータ同士がMERGEメッセージを送ることにより、行われるサービスのようです。

設定としては、以下のタグを使用します。

  • MERGE2
  • MERGE3
ガベージコレクション

ノードが受け取ったメッセージを、定期的に削除するための仕組みです。

設定としては、以下のタグを使用します。

  • pbcast.STATE
断片化

送信側でメッセージを断片化し、受信側で戻すための仕組みです。設定したしきい値を越えると、メッセージを断片化して送信します。

設定としては、以下のタグを使用します。

  • FRAG
  • FRAG2(通常、こっちを使う?)


まあ、さらさらと眺めてみましたけど、とても全部は見きれませんね…。この他にも、設定いっぱいありますし。

とりあえず、分かる範囲で少しずつ理解するようにしましょう。先のクラスタのサンプルで、

[error] INFO: ISPN000094: Received new cluster view: [ubuntu-62093|0] [ubuntu-62093]

みたいなログが出ていた意味が、ようやく分かりました。

参考資料)
日本語だと、このサイトがまとめていらっしゃいます。
http://ise0615.blogspot.jp/2010/06/jgroups-jgroups.html
http://ise0615.blogspot.jp/2010/06/jgroups.html
http://ise0615.blogspot.jp/2010/06/jgroups_28.html
http://ise0615.blogspot.jp/2010/06/jgroups_3819.html

あとは、RedHatJBoss Enterprise Application Platform 5に関するドキュメント中に、JGroupsの設定内容が出てきます。
https://access.redhat.com/knowledge/docs/ja-JP/JBoss_Enterprise_Application_Platform/5/html/Administration_And_Configuration_Guide/jgroups.chapt.html
https://access.redhat.com/knowledge/docs/ja-JP/JBoss_Enterprise_Application_Platform/5/html/Administration_And_Configuration_Guide/clustering-jgroups-isolation.html
https://access.redhat.com/knowledge/docs/ja-JP/JBoss_Enterprise_Application_Platform/5/html/Administration_And_Configuration_Guide/jgroups-other-merge.html
https://access.redhat.com/knowledge/docs/ja-JP/JBoss_Enterprise_Application_Platform/5/html/Administration_And_Configuration_Guide/jgroups-other-gc.html
https://access.redhat.com/knowledge/docs/ja-JP/JBoss_Enterprise_Application_Platform/5/html/Administration_And_Configuration_Guide/ch27s02.html
https://access.redhat.com/knowledge/docs/ja-JP/JBoss_Enterprise_Application_Platform/5/html/Administration_And_Configuration_Guide/jgroups-other-st.html