/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

Nagios の parents 設定を使っても、多段監視だと DOWN 判定になる話

少し IT 系の記事を増やそうと思い、過去の資料を漁ってたら Nagios 関係の資料がいくつか出てきたのでご紹介します。

Nagios の parents 設定とは?

Nagios の parents 設定(親子設定)とは、「NagiosがモニタされているホストDOWNとUNREACHABLEの状態を区別するため、Nagiosにホストがお互いどのように繋がっているかを指示する」(引用:Nagios Core 日本語 ドキュメント 親/子関係定義)ための機能です。

例として、以下の単純な監視ネットワークを考えます。フロントエンドが1台、バックエンドが1台の構成です。

監視ネットワーク例

この場合の親子設定は以下のようになります。

define host{
    host_name      FrontEnd
    ...
}
define host{
    host_name      BackEnd
    parents        FrontEnd
    ...
}

parents 設定のメリット

この parents 設定ですが、設定せずとも Nagios は動作します。では設定するとどんなメリットがあるのでしょうか。

親子関係を図示してくれる

Nagios の管理画面上で、この親子関係を図として表示することができます。子供の子供、その子供の更に子供…というように何代にもわたって設定が可能なため、複雑なネットワークを監視している場合は、どこで障害が起きているかが確認しやすくなります。

[caption id="attachment_2814" align="aligncenter" width="300"]監視ネットワークを図示できる 参照元URL:http://www.it-sudparis.eu/s2ia/user/procacci/Doc/nagios/nagios.html[/caption]

親が DOWN した時、子のステータスが DOWN ではなく UNREACHABLE になる

そして今回取り上げたかったのが、このメリットです。

監視ネットワーク上、親(例だとフロントエンドサーバ)に障害が発生してしまうと、子(例だとバックエンドサーバ)の監視を行うことができません。この際に、親のステータスは DOWN となりますが、子のステータスは「親がダウンしたので子の監視ができなかった」という意味で、UNREACHABLE となります。

一見便利だけど少し紛らわしい

「親がダウンしたので子の監視ができなかった」と書きましたが、この「ダウン」かどうかはもちろん Nagios が判定します。多くの場合、Ping を打って応答があるか無いか、という確認方法を取るかとおもうのですが、ここが少し厄介です。

良くあるのが、フロントエンドサーバが高負荷状態となり、バックエンドサーバへの監視が行えなかった場合。

フロントエンドサーバが高負荷状態の場合

この場合、バックエンドサーバに監視が行えなかったのだから、バックエンドサーバに対しては UNREACHABLE が返ってきてほしいところです。しかし Ping でホスト監視を行っている場合、高負荷状態ではサーバ自体は稼働しているため、Ping は通るのでフロントエンドサーバは DOWN ではなく UP の状態だと判断されます。その結果、バックエンドサーバは UNREACHABLE ではなく DOWN のステータスとなります。

親が高負荷状態のときも、子を UNREACHABLE にするには?

高負荷状態で親のホスト監視が正常に行えてしまうことが問題であるため、Ping 以外の手段に頼ることになります。

ただ、Ping をホスト監視に用いるのは直感的で分かりやすいと思うので、ここを崩してまで、親が高負荷状態のときも子を UNREACHABLE にしたいかどうかはかなり疑問です(^_^;

一応の手段としてはホスト監視を NRPE の応答で見ることが考えられます。内部リソースを監視している場合は NRPE が必須なので、多くの監視対象サーバでは NRPE デーモンが起動しているはずです。NRPE が起動していなければ監視が出来ないのだから、この NRPE が稼働しているかどうかをホスト監視に用いてしまおう、という発想です。NRPE が稼働しているかどうかは高負荷状態では確認できないため、親が DOWN のステータスとなり、子は UNREACHABLE にできます。