ページ

2010年6月28日月曜日

JGroupsを利用したクラスタ関連 ~その壱 JGroupsとは ~

JGroupsとは
JGroupsは、Javaで作成された複数のアプリケーション間において、
相互に通信させる為のネットワーク通信ライブラリです。
memcacheなどのキャッシュツールと組み合わせる事で、
クラスタ間でキャッシュのフラッシュをマルチキャスト連携させる事が
出来るようになります。

----------------------------------------------------------------
※ 通常、キャッシュは、各サーバー毎に保存されています。
その為、コンテンツが変更された際に、キャッシュが無効になるまでは、
古い内容のコンテンツが表示されてしまったり、各サーバー毎に
レスポンス内容が異なってしまうという問題が発生してしまいます。
そこで、JGroupsを利用して各サーバー間を連携させる事で、
この問題が解決できるようになります。
----------------------------------------------------------------

マルチキャスト通信とは
マルチキャスト通信は、特定のグループに対してのみデータを転送する
仕組みです。メッセージを受信する側がマルチキャストアドレス
(224.0.0.0~239.255.255.255)を設定することで、
マルチキャストアドレス宛に送信されたデータを、自分あてに
受信出来るようになります。




----------------------------------------------------------------
マルチキャストの利点
・パケットがマルチキャストグループあたりひとつで良いので
ネットワークが混雑しない。(ユニキャストの場合、受信者が増えると、
その数分だけパケットを送信するので、ネットワークが混雑する。)
・ネットワークインタフェースカードで所属していない
マルチキャストグループあてのパケットをフィルタできるので、
非受信者に負荷がかからない。(ブロードキャストだと、パケットは
ひとつで良いが、非受信者のコンピュータに対してもCPU負荷を
かけてしまう。)
----------------------------------------------------------------


JGroupsのパラメーターについて
JGroupsは、通信に利用する各プロトコルの設定値を変更する事が出来ます。
以下は、JGroupsで設定する主なパラメーターになります。

----------------------------------------------------------------
UDP
mcast_addr=231.12.21.132 ・・・ マルチキャストアドレスの指定
mcast_port=45566 ・・・ マルチキャストポートの指定
ip_ttl=4 ・・・ TTLの指定
mcast_send_buf_size=100000 ・・・ 送信するマルチキャストのバッファサイズ
mcast_recv_buf_size=500000 ・・・ 受信するマルチキャストのバッファサイズ
ucast_send_buf_size=100000 ・・・ 送信するユニキャストのバッファサイズ
ucast_recv_buf_size=64000 ・・・ 受信するユニキャストのバッファサイズ
PING
timeout=3000 ・・・ INITIAL_MEMBERSを見つけるために送信されるFIND_INITIAL_MBRSのタイムアウト合計(ミリ秒)。
num_initial_members=2 ・・・ GET_MBR_REQを送信してからtimeoutが経過するか、ここで指定した数のGET_MBR_RSPを受け取るまで待機する。
MERGE2
min_interval=5000 ・・・ FIND_INITIAL_MBRS(GET_MBR_REQを送信してGET_MBR_RSPを取得する処理)を送信する間隔の下限値を設定する。
max_interval=20000 ・・・ FIND_INITIAL_MBRS(GET_MBR_REQを送信してGET_MBR_RSPを取得する処理)を送信する間隔の上限値を設定する。
FD
shun=true ・・・ SUSPECTして除外したメンバーからHEARTBEATが送られてきた場合に、NOT MEMBERを送信して再JOINさせる。
timeout=5000 ・・・ HEARTBEATを送信する間隔。次のHEARTBEATを送信するまでに応答が返ってこない場合はタイムアウト
max_tries=3 ・・・ 指定した回数以上のタイムアウトが発生した場合にFD検知する。
FD_SOCK
VERIFY_SUSPECT
timeout=2000 ・・・ ARE YOU DEADメッセージを送信してから I AM NOT DEADを受け取るまでのタイムアウト
pbcast.NAKACK
retransmit_timeout=600,1200,2400,4800 ・・・ 再送要求までのタイムアウト時間。0.6秒→1.2秒→2.4秒→4.8秒の順に隔を空けて応答を待つ。
gc_lag=20 ・・・ GCラグ(ミリ秒)を設定する。
UNICAST
timeout=400,800,1600,3200 ・・・ ACKメッセージを受信するまでの最大待ち時間(ミリ秒)
pbcast.STABLE
desired_avg_gossip=20000 ・・・ STABLEメッセージを送信する平均時間
FRAG
frag_size=8192 ・・・ このサイズよりも大きなメッセージは、小さく断片化してから送信する。
STATS
pbcast.GMS
join_timeout=5000 ・・・ JOIN_REQを送信してからJOIN_RSPを取得するまでのタイムアウト(ミリ秒)を設定する。
leave_timeout=5000 ・・・ LEAVE_REQを送信してからLEAVE_RSPを取得するまでのタイムアウト(ミリ秒)を設定する。
merge_timeout=10000 ・・・ MERGE_REQを送信してからMERGE_RSPを取得するまでのタイムアウト(ミリ秒)を設定する。
shun=false ・・・ 受信したVIEWに自分が含まれていない場合は、自分をSHUNするか否か
print_local_addr=true ・・・ リスナー時起動時にローカルアドレスをコンソール表示するか否か
----------------------------------------------------------------

ルーティングとバインドアドレスについて注意点
~以下のように複数のネットワークインターフェースが存在する構成となっている場合、
先頭のインターフェースが優先してマルチキャスト通信に利用されます。
以下のように設定する事で、指定したインターフェースを経由して
マルチキャスト通信が利用できるようになります。



----------------------------------------------------------------
# route add -net 231.12.21.0 netmask 255.255.255.0 <インターフェース>
----------------------------------------------------------------

また、IPv6 を利用可能なOSでは、基本となるネイティブソケットが IPv6 になる為、
Javaでは、IPv4よりもIPv6を優先して利用するようになっています。
IPV4を優先するように設定する為には、以下のVMオプションを指定します。

-Djava.net.preferIPv4Stack=true

また、JGroupsは、リスナー起動時に自分のIPアドレスをOSから取得します。
その際も先頭のインターフェースに割り当てられたIPアドレスを利用してしまう為、
マルチキャスト通信で利用するインターフェースに割り当てられたIPアドレスを
バインドアドレスとして指定する為に、以下のVMオプションを指定して下さい。

-Djgroups.bind_addr=

JGroupsの仕組み
~JGroupsは、多くの処理(プロトコル)から構成されており、
それぞれの仕組みが互いに組み合わされる事で1つの機能を担っています。
JGroupsの特徴を理解しておく事は、トラブル発生時に問題解決に役立つ為、
非常に重要です。
次回からは、JGroupsで主要となる以下の機能の特徴について記述しています。

・参加/離脱(JOIN/REMOVE)
・障害検知(FD、FD_SOCK)
・パーティションの結合(MERGE)

0 件のコメント:

コメントを投稿