Heartbeat には,クラスタリング動作に関するパラメータがいくつかあります。

 今回は,設定パラメータを通じて,クラスタリング動作に関して,さらに理解を深めていきましょう。

 クラスタリング動作に関するパラメータは,大きく2つに分けられます。ハートビート通信に関するパラメータと,リソース監視・制御のパラメータです。

◆ハートビート通信に関するパラメータ

 ハートビート通信に関するパラメータは,「ha.cf」で設定します。次の5種類があります。

(1) udpport

 ハートビート通信で利用するポート番号を設定できます。構築したクラスタ環境では次のようになっており,コミュニティ推奨の udp/694 としています。

udpport 694

 もし,udp/694 が他のアプリケーションで利用されているような環境では,本パラメータを変更することで対応できます。

(2) keepalive

 クラスタ・ノードから,ハートビート・パケットを送信する間隔を設定できます。構築したクラスタ環境では次のようになっており,この場合は,各クラスタ・ノードから2秒間隔で,ハートビート・パケットが送信されることになります。

keepalive 2

また,第5回でご説明した通り,Heartbeatのネットワーク監視は,各クラスタ・ノードから,指定したIPアドレスに対して「ping」を実行(ICMPパケットを送信)することで実現されますが,このICMPパケットの送信間隔も,keepaliveで設定する値と同じになります。

 平常状態でのHeartbeat関連のパケット送信は,図1のようになります。

図1●平常状態でのHeartbeat関連のパケット送信
図1●平常状態でのHeartbeat関連のパケット送信
[画像のクリックで拡大表示]

 ちなみに,「tcpdump」コマンドによって,実際のパケットの流れを確認できます。まず,ハートビート通信に関しては,次の手順で操作をして確認します。

1) CentOSの端末を起動し,管理者権限で以下のコマンドを実行します(ノード hb01, hb02 のいずれでも構いません)。

# tcpdump -i eth0 port 694 -nn

2) 5秒程度したら,「Ctrl+ C」を押してtcpdumpの処理を停止させます。 その結果,端末に次のような内容が表示されます。

16:19:47.964790 IP 192.168.0.1.32770 > 192.168.0.255.694: UDP, length 207
16:19:48.120129 IP 192.168.0.2.32770 > 192.168.0.255.694: UDP, length 207
16:19:49.964786 IP 192.168.0.1.32770 > 192.168.0.255.694: UDP, length 207
16:19:50.120164 IP 192.168.0.2.32770 > 192.168.0.255.694: UDP, length 207
16:19:51.968049 IP 192.168.0.1.32770 > 192.168.0.255.694: UDP, length 207

 各クラスタ・ノードのhb01(192.168.0.1), hb02(192.168.0.2) が,ブロードキャスト・アドレス「192.168.0.255」,ポート番号「udp/694」に対して,それぞれ2秒間隔で,ハートビート・パケットを送信していることが確認できます。

 同様に,ネットワーク監視に関して,次の手順で操作をして確認します。

1) ノード hb01 において,CentOSの端末を起動し,管理者権限で以下のコマンドを実行します。

# tcpdump -i eth1 -p icmp -nn

2) 5秒程度したら,「Ctrl+ C」を押してtcpdumpの処理を停止させます。 その結果,端末に次のような内容が表示されます。

16:19:57.974314 IP 172.20.24.51 > 172.20.25.4: ICMP echo request, id 46099, seq 377, length 119
16:19:57.974936 IP 172.20.25.4 > 172.20.24.51: ICMP echo reply, id 46099, seq 377, length 119
16:19:59.974289 IP 172.20.24.51 > 172.20.25.4: ICMP echo request, id 46099, seq 378, length 119
16:19:59.974928 IP 172.20.25.4 > 172.20.24.51: ICMP echo reply, id 46099, seq 378, length 119
16:20:01.974659 IP 172.20.24.51 > 172.20.25.4: ICMP echo request, id 46099, seq 379, length 119
16:20:01.975311 IP 172.20.25.4 > 172.20.24.51: ICMP echo reply, id 46099, seq 379, length 119

 hb01(172.20.24.51)から,client(172.20.25.4)に対して,ICMPパケットを2秒間隔で送信し,各echo requestにclientが応答(reply)していることが確認できます。

(3) warntime

 対向ノードからのハートビート・パケットを受信できなくなってから,警告メッセージをログ出力するまでの時間を設定できます。構築したクラスタ環境では次のようになっており,対向ノードから20秒間ハートビート・パケットを受信できないとき,警告メッセージを出力します。

warntime 20

(4)deadtime

 対向ノードからのハートビート・パケットを受信できなくなってから,対向ノードを故障(OFFLINE)と判断するまでの時間を設定できます。構築したクラスタ環境では次のようになっており,対向ノードから24秒間ハートビート・パケットを受信できないとき,対向ノードを故障と判断します。

deadtime 24

 このパラメータは,クラスタリング動作に関する重要なパラメータの1つになります。

 このパラメータを小さくすると,ノード故障発生時に,短い時間でフェイルオーバーが実現でき,その結果,サービス停止時間を短くすることが可能です。ただし,極端に小さい値とした場合には,対向ノードが動作しているにもかかわらず,何らかの理由でハートビート・パケットの受信が遅延したときに,誤って対向ノードを故障と判断(誤検知)してしまうことがあります。

 よって,あまり極端に小さい値にしない方がよく,今回設定した値程度としておくことが適当です。

 また,Heartbeat のネットワーク監視では,先ほどご説明した通り,指定したIPアドレスに対するpingの応答があれば正常と判断します。ここで,ping の応答パケットを受信できなくなってから,ネットワーク故障と判断するまでの時間も,deadtimeで設定する値と同じになります。

(5) initdead

 Heartbeatの起動時に,各ノードがクラスタのメンバに参加するまでの待ち合わせ時間を設定できます。構築したクラスタ環境では次のようになっており,Heartbeat起動コマンド実行後,48秒間,別ノードでのHeartbeatが起動するのを待ち合わせます。

initdead 48

 特に,OS 起動時にHeartbeatを自動起動するような環境では,ノードによって,ネットワーク起動等の時間がかかることも考えられるので,充分な時間をとることが推奨されています。

 なお,各パラメータに基づく動作内容から,(2) から (5)のパラメータの値については,次の条件を満たしている必要があります。

initdead > deadtime > warntime > keepalive