Heartbeat サーバ

Heartbeatサーバは、SAから定期的に送信されるHeartbeatパケットを受け取り、監視を行うためのサーバです。 さらに、HeartbeatパケットにはSAの動作状態を示すいくつかの情報が含まれている場合、これを用いることでHeartbeatサーバは動作情報をグラフ化して表示することが可能となっています。

なお、Heartbeatに関する詳細な仕様は Heartbeat Server仕様 をご覧ください。

Heartbeatサーバの機能

Heartbeatサーバでは、大きく分けて以下の3つの機能を提供しています。

Heartbeatパケットの受信
SAから定期的に送信されるHeartbeatパケットを受信し、その情報を蓄積します。
SAの死活判定及び通知
定期的にSAから送信されるHeartbeatパケットの受信状況を元に、SAの死活判定を行います。 UPと判定する条件、DOWNと判定する条件はそれぞれ設定ファイルで変更することが可能です。 また、判定した結果をRSに通知します。
SAの各種情報のグラフ化
Heartbeatパケットに含まれる動作情報をそれぞれ蓄積し、グラフ化した結果を画像もしくはHTML形式で表示することができます。 グラフ化可能な情報は、Heartbeatパケット仕様で定義される、トラヒック、CPU利用率、メモリ利用率などです。

これらの機能の関係は、以下の図のようになります。

../_images/heartbeat-model.png

Heartbeat受信部

Heartbeatを受信するのは、”hbserver”というプログラムです。 このプログラムはデーモンとして動作し、常にHeartbeatパケットを待ち受けています。

hbserverがパケットを受信すると、設定ファイル(hbserver.conf)で指定したディレクトリの下にmonitor_reportというファイルに受信した記録を残します。

SAがHeartbeatを送信する間隔は任意の間隔に設定可能ですが、1台のHeartbeatサーバに送信する全てのSAは、同一の送信間隔である必要があります。

死活判定および通知プログラム

Heartbeatパケットの受信記録を元にSAの死活判定を行うのは、”mreport.py”というプログラムです。 このプログラムは、cronで定期的に実行され、以下の動作を行います。

  1. 別のHeartbeatサーバとRSへの通知権をネゴシエーションする(冗長化を利用する場合)
  2. RSから監視対象のSA一覧を取得する
  3. Heartbeat受信ログを元にUPとなったSA、またはDOWNとなったSAを検出する
  4. UP→DOWN、もしくはDOWN→UPのように状態が変更されたもののみをRSに通知する

cronでの実行間隔を短くすることで、より早く通知を行うことが可能になりますが、RSやHeartbeatサーバの負荷がそれに伴って上昇する点にご注意ください。

死活判定条件

SAがUPもしくはDOWNと判定する条件は、以下のようになります。

UP判定条件
既にDOWNと判定されている、もしくは該当のSAから一度もHeartbeatパケットを受信したことがない状態から、Heartbeatパケットを[n]回連続で受信したとき。
DOWN判定条件
既にUPと判定されている状態から、Heartbeatパケットを[n]回連続で受信できなかったとき。

上記で、[n]と表記した部分に関しては、設定ファイル(hbserver.conf)にて具体的な値を指定することになります。 設定ファイルの詳細については Heartbeat サーバの構築 をご覧ください。

グラフ提供インターフェイス

HeartbeatサーバはHeartbeatパケットに含まれるステータス情報を元にグラフ化を行い、イメージもしくはHTML形式でクライアントに提供することが可能です。

グラフ表示可能な情報

Heartbeatパケットに含まれる、以下の情報をSA毎にグラフ化することができます。

  • CPU利用率
  • メモリ利用率(実メモリ容量/空きメモリ容量)
  • トラフィックレート(インターフェイス毎)
  • モバイル端末の電波受信レベル(モバイル端末毎)

なお、これらの情報はSAから送信されるHeartbeatパケットに該当される情報が含まれている場合のみ、表示可能です。

グラフ表示CGI

グラフ情報は、HTTPサーバ(Apache等)上のCGIとして提供されます。 このCGIに対して、グラフ描画オプションを指定することで様々にカスタマイズされたグラフ表示を出力することが可能です。

たとえば、CPU利用率表示グラフを表示するためのURLは以下のようになります。

http://192.0.2.1/hbcgi/grapher.cgi?ID=0001-0000-0101-0000-0000-0000-0000-2222&
KeyCode=0158aeed0db2bc37a3de1bde40727227fa1472fe&ItemName=cpu_usage&ItemIndex=0
&Output=image
(実際には 1 行です)

この結果、以下のようなイメージを得ることができます。

../_images/hbgraph.png

リクエストパラメータの詳細

CGIリクエストに含めることのできるパラメータは以下の通りです。個々のパラメータは<name>=<value>といったフォーマットで指定します。

Distribution ID

<name>:ID
<value>:<Distribution ID>
解説:表示対象となるSAのDistribution IDを指定します。
例:
ID=0001-0000-0101-0000-0000-0000-0000-2222

キーコード

<name>:KeyCode
<value>:<key>
解説:共通鍵を用いたキーコードを指定します。キーコードは、Distribution ID と共通鍵を ‘@’ で連結した文字列に対し、SHA1でハッシュを取って生成します。 共通鍵は、hbserver.confの KeyCodeSeed パラメータにて指定したものが用いられます。
例:
Distribution IDが''0001-0000-0101-0000-0000-0000-0000-2222''、共通鍵
が''example''の場合:
KeyCode=78dea8e8dda78454395308a2b37905655f016179

表示項目の指定

<name>:

ItemName

<value>:
  • rate_byte_traffic
  • rate_packet_traffic
  • memory_capacity
  • cpu_usage
  • sgm_signal_quality
解説:

output が image の場合にのみ有効なパラメータです。 出力する項目を指定することができます。

例:
ItemName=cpu_usage

表示項目のインデックス指定

<name>:ItemIndex
<value>:<index_num>
解説:output が image の場合にのみ有効なパラメータです。 出力する項目のインデックス番号を指定します。 CPUやインターフェイスのインデックス番号に相当します。
例:
ItemIndex=0

出力形式の指定

<name>:

Output

<value>:
  • image
  • html
解説:

image が指定された場合は、イメージ画像のみがレスポンスとして渡され、htmlが指定された場合は、すべてのイメージを含む全体のHTMLがレスポンスとして渡されます。 このパラメータを指定しなかった場合のデフォルトはhtmlとなります。

例:
Output=image

イメージタイプの指定

<name>:

ImageFormat

<value>:
  • png
  • gif
解説:

レスポンスとして出力されるグラフイメージをpng、gifのどちらにするかを指定します。

例:
ImageFormat=png

グラフ描画開始日時指定

<name>:StartTime
<value>:<”ccyymmddHHMM.ss”>
解説:グラフ描画を開始する日時を指定します。 無指定時のデフォルトは1日前からとなります。 RangeTimeパラメータとは排他の関係になります。
例:
2007年1月1日13:00を指定する場合:
StartTime=200701011300.00

グラフ描画終了日時指定

<name>:EndTime
<value>:<”ccyymmddHHMM.ss”>
解説:グラフ描画を終了する日時を指定します。StartTimeパラメータが指定 された場合には必須となります。
例:
2007年2月1日13:00を指定する場合:
EndTime=200702011300.00

グラフ描画時間範囲指定

<name>:

RangeTime

<value>:
  • day
  • week
  • month
  • halfyear
  • year
解説:

期間を指定し、過去から現在までの範囲のグラフ描画を行います。 dayは1日、weekは1週間、monthは1月、halfyearは半年、yearは1年を指定します。

例:
RangeTime=day

グラフの横幅指定

<name>:Width
<value>:<pixel>
解説:グラフ全体のイメージの横幅をピクセル単位で指定します。 無指定時のデフォルトは400となります。
例:
Width=550

グラフの縦幅指定

<name>:Height
<value>:<pixel>
解説:グラフ全体のイメージの縦幅をピクセル単位で指定します。 無指定時のデフォルトは100となります。
例:
Width=150

グラフの上限値指定

<name>:UpperLimit
<value>:<num>
解説:グラフの縦軸の上限を整数値で指定します。 無指定時、トラフィックグラフ、メモリ使用量グラフは無制限となり、CPU利用率グラフでは100%となります。
例:
UpperLimit=1000

グラフの下限値指定

<name>:LowerLimit
<value>:<num>
解説:グラフの縦軸の下限を整数値で指定します。無指定時は0となります。
例:
LowerLimit=20

グラフのタイトル

<name>:Title
<value>:<title>
解説:グラフのタイトルとして表示される文字列を指定します。 無指定時、トラフィックグラフでは traffic 、メモリ使用量グラフでは memory 、CPU利用率グラフでは cpu となります。
例:
Title=example

縦軸ラベルの名前指定

<name>:VerticalLabel
<value>:<name>
解説:グラフの縦軸ラベルとして表示される文字列を指定します。 無指定時、トラフィックグラフでは bps 、メモリ使用量グラフでは byte 、CPU利用率グラフでは percent となります。
例:
VerticalLabel=example

背景色指定

<name>:BackGroundColor
<value>:<#rrggbb>
解説:グラフの背景色をRGBのカラーコードで指定します。
例:
BackGroundColor=#FFFFFF

キャンバスの背景色指定

<name>:CanvasColor
<value>:<#rrggbb>
解説:グラフキャンバスの背景色をRGBのカラーコードで指定します。
例:
CanvasColor=#FFFFFF

フォントの色指定

<name>:FontColor
<value>:<#rrggbb>
解説:フォントの色をRGBのカラーコードで指定します。
例:
FontColor=#000000

主グリッド線の色指定

<name>:MainGridColor
<value>:<#rrggbb>
解説:主グリッド線の色をRGBのカラーコードで指定します。
例:
MainGridColor=#000000

グリッド線の色指定

<name>:GridColor
<value>:<#rrggbb>
解説:グリッド線の色をRGBのカラーコードで指定します。
例:
GridColor=#000000

表示タイプ線の指定

<name>:

ViewType

<value>:
  • LINE1
  • LINE2
  • LINE3
  • AREA
  • STACK
解説:

グラフの描画パターンを指定します。

例:
ViewType=AREA

Heartbeatサーバの冗長化・負荷分散

Heartbeatサーバは、2台を1セットとし、冗長化構成を取ることができます。 この場合、SAは常に2台のHeartbeatサーバに対して同時にHeartbeatパケットを送信することになります。

../_images/heartbeat-redundancy2.png

Heartbeatサーバは、設定ファイル(hbserver.conf)にて冗長化モードが指定されると、以下の動作を行うようになります。

Heartbeatパケットの相互補完
Heartbeatパケット受信部は、相互に受信したパケット情報の保管を行う機能を持ちます。 これにより、片側のサーバでHeartbeatパケットが欠落したような場合でも、正しく受信記録を補完することができるようになります。
監視結果通知の調停
監視結果をRSに通知する際は、2台の間で同期が行われた上で、どちらか一方がRSに通知を行います。 ただし、Heartbeatサーバ間で正しく同期が行われなかった場合は、2台が同時にRSに通知することになります。