ページ

2010年6月28日月曜日

JGroupsを利用したクラスタ関連 ~その弐 参加・離脱の仕組み ~

参加(JOIN)
~ 参加(JOIN)とは、JGroupsリスナーの起動時に行われる
マルチキャストグループに加わる為の仕組みの事です。

・他メンバーが存在しない状態でリスナーを起動した場合



メンバーAは、グループ内に存在するコーディネーター(※1)を
見つける為に、GET_MBRS_REQメッセージをマルチキャストで送信します。
この場合、グループ内に他メンバーがいない為、GET_MBRS_REQメッセージ
に対する応答(GET_MBRS_RSPメッセージ)がありません。
メンバーAは、一定時間誰からも応答がない事を確認すると、
自分がグループ内の最初のメンバーであるとみなし、コーディネーターを
担当する事になります。

----------------------------------------------------------------
※1.コーディネーターとは
コーディネーターは、グループに存在するすべてのメンバー情報を、
グループ全体に通知して共有する役目をしています。
コーディネーターは、グループ内に1メンバーのみ存在しており、
新たにメンバーが参加したり、離脱すると、最新のメンバー情報を
全体に通知しています。
(このようにメンバーを管理する為の仕組みの事を、
「グループメンバーシップ(GMS)」と呼んでいます。)
また、コーディネーターは、後述するMERGE処理にて複数に分かれた
パーディションを結合する為に、定期的にGET_MBRS_REQメッセージ
を送信する事で、グループ内のコーディネーターが自分だけである事を
確認する役目もしています。
----------------------------------------------------------------

・既に1メンバー存在する状態でリスナーを起動した場合



グループ内にメンバーAのみが存在している状態で、メンバーBを起動すると、
メンバーBは、グループ内に存在するコーディネーターの存在を確認する為に、
GET_MBRS_REQメッセージをマルチキャストで送信します。
これを受信したメンバーAは、誰がコーディネーター(この場合はメンバーA)
なのかを知らせる為に、GET_MBRS_RSPメッセージを返信します。

その結果、メンバーBはグループ内のコーディネーターがメンバーAであると
知る為、メンバー管理をおこなっているコーディネーターに対して
グループへの参加依頼となるJOIN_REQメッセージを送信します。
コーディネーターは、JOIN_REQメッセージを受信すると、
最新のメンバーリストをJOIN_RSPメッセージとしてメンバーBに返信します。
これによって、メンバーBは、現在、グループ内に存在する全メンバーの情報
を知る事が出来ます。

----------------------------------------------------------------
※ポイント
他メンバーがGET_MBRS_REQメッセージを受信すると、
GET_MBRS_RSPメッセージとして自分やコーディネーターの情報を返信します。
これにより、グループ内に存在する現在のコーディネーターが誰なのか
を発見し、JOIN_REQメッセージを送信する事でグループに加わる事が出来ます。
また、このようにメンバーやコーディネーターの情報を取得する為の
仕組みを、「ディスカバリプロトコル」と呼ばれています。
----------------------------------------------------------------

----------------------------------------------------------------
ディスカバリプロトコルの種類
PING      ・・・ マルチキャストでGET_MBRS_REQメッセージを送信して、
コーディネーターが誰なのかを発見する。(デフォルト値)
TCPGOSSIP ・・・ コーディネーター役のメンバーを固定IPにする。
TCPPING   ・・・ 事前にすべてのメンバー情報を明示的にリスト化しておく。
MPING     ・・・ ソケットを開いてマルチキャストディスカバリ
メッセージを送受信する。
----------------------------------------------------------------

・既に2メンバーが連携されている状態でリスナーを起動した場合



メンバーA、メンバーBが既にマルチキャスト連携されている状態で
メンバーCを起動した場合、
リスナーを起動時に、GET_MBRS_REQメッセージをマルチキャストで送信します。
GET_MBRS_REQメッセージを受信したメンバーA、メンバーBは、
GET_MBRS_RSPメッセージを返信することで、コーディネーターがメンバーAで
ある事を知る事が出来ます。

メンバーCは、コーディネーターであるメンバーAに対して、
グループに参加する為にJOIN_REQメッセージを送信します。

コーディネーターは、JOIN_REQメッセージを受信後、
最新のメンバーリストをJOIN_RSPメッセージとしてメンバーCに返信します。

コーディネーターは、最新のメンバーリスト(VIEW)をマルチキャストで
送信する事で全メンバーに共有します。
これにより、すべてのメンバーは、[A,B,C]というリストを共有する事になります。

----------------------------------------------------------------
※ポイント
新たにメンバーが加わると、リストの最後尾に追加されます。
上記の場合、メンバーDが参加するとメンバーリストは、
[A,B,C,D]のようになります。
また、メンバーリストの先頭がコーディネーターを担当する事になっており、
メンバーAが離脱すると、[B,C,D]となる為、
メンバーBがコーディネーターとなります。
再度、メンバーAが参加しても、[B,C,D,A]となっている為、
コーディネーターは、メンバーBが継続する事となります。
----------------------------------------------------------------

離脱(REMOVE)
~ 離脱(REMOVE)とは、JGroupsリスナーの停止時にマルチキャストグループ
から抜ける為の仕組みの事です。

・コーディネーターが離脱した場合



離脱するメンバーは、コーディネーター(この場合は、メンバーA自身)に対して、
LEAVE_REQメッセージを送信します。

LEAVE_REQメッセージを受信したメンバーAは、LEAVE_RSPメッセージを
返信します。

コーディネーターは、離脱するメンバーを除いた最新のメンバーリスト
を作成し、マルチキャストでVIEWメッセージを全メンバーに送信します。

メンバーB、メンバーCは、VIEWメッセージを受信する事で最新のメンバー情報
を共有する事が出来ます。
また、この場合メンバーリストが、[B,C]になるので、メンバーBが
コーディネーターとなります。


・コーディネーターでないメンバーが離脱した場合



メンバーBは、コーディネーターであるメンバーAに対して、
LEAVE_REQメッセージを送信します。
これに対し、コーディネーターは、LEAVE_RSPメッセージを返信する
事でメンバーBの離脱が完了します。

また、コーディネーターであるメンバーAは、最新のメンバーリスト
を共有する為、マルチキャストでVIEWメッセージを送信します。

メンバーCは、VIEWメッセージを受信することで、今現在の最新メンバー
を共有する事が出来ます。

----------------------------------------------------------------
※ポイント
マルチキャストグループから離脱する際には、必ず、上記処理が必要になります。
その為、Jgroupsの終了処理を行わずにTomcatを停止しようとした場合、
Tomcatが停止しなくなるという問題が発生します。
(対応方法:ServletContextListenerのcontextDestroyedにて、
JGroupsの終了処理を実行させる。)
----------------------------------------------------------------

0 件のコメント:

コメントを投稿