web-dev-qa-db-ja.com

CentOS6でIcinga / Nagiosを使用してHAproxyを介してWebサーバーノードを監視する方法

このガイドでは、HAプロキシの設定や、なぜそうしたいのかについてはまったく焦点を当てていません。あなたがそれを持っていて、Icingaを使用してそれを適切に監視したい場合は、これをどのように行うことができるかについてのアイデアがあります。

したがって、ここに潜在的なシナリオがあります。

  • 2つのデータセンターAおよびB
  • データセンターごとに1つのHAプロキシノード
  • 各HAプロキシは、各データセンターA1、A2、B1、B2の2つのWebサーバーを指します。
  • このシナリオのWebサーバーは、実際にはWebサービスエンドポイントであり、URLへの単純なHTTP GETは、システムの実際の状態についてはあまりわかりません。

賢明な監視では、現在アクティブなノードの外部チェック(pingdomなど)を受け入れることができます。ただし、これにはいくつかの影響があります。

  • パッシブノードをテストすることはありません。つまり、ノードを切り替える前に、パッシブノードが機能しているかどうかがよくわかりません。
  • 1つのノードに障害が発生しても、何が問題であるかを明確に示すことはできません。

だからここに妄想的な人のアプローチがあります:

  • 外部IPからHAプロキシを経由してシステムに至るまで、各ノードを監視して、途中の不具合を検出したいと思います。
  • バックエンドサービスに実際のWebサービス呼び出しを行って、それが機能していることを確認したいのですが、通常のWebサイトをテストしている場合は明らかに適用できません。

それではそれを手に入れましょう...

1
Kristofer

まず、haproxyでのCookieの挿入を有効にし、各バックエンドノードに一意のキーを割り当てる必要があります。これは通常、セッションの粘着性のために使用されます。つまり、サイトにアクセスしている人が、まだ利用可能な場合は常に同じバックエンドノードを取得する必要はありません。ただし、適切なCookieを送信することにより、個々のノードを監視するためにも使用できます。したがって、存在しない場合は、haproxyサーバー定義にCookieを追加します。

cookie SERVERID insert indirect nocache
server webA1 10.0.0.1:80 cookie S1 
server WebA2 10.0.0.2:80 cookie S2 

次に、何をチェックするのが最も理にかなっているのかを理解する必要があります。これについては、何が最も理にかなっているのか、nagiosの素晴らしいcheck_httpを使用してそれをチェックする方法を理解するために、自分で考えていじる必要があります。完全を期すために、バックエンドWebサービスに対してPOSTをテストする方法の複雑な例を以下に示します。このシナリオ例の要件は次のとおりです。

 - Post data should be <echo>Hello</echo>
 - A successful execution will return the echo string back
 - Disable any cache through HTTP headers
 - Set content-type to text/xml and expect the same back
 - SSL should be used
 - Host name is example.com
 - Port is 443
 - URI is /service
 - Max response time is 3 seconds

これは、check_http(Cent OS6では/ usr/lib64/nagios/plugins/check_http)に対する次の引数によって処理されます。

-P "<echo>Hello</echo>"
-r 'Hello'
-k "Cache-Control: no-cache" -k "Pragma: no-cache"
-k "Content-Type: text/xml; charset=UTF-8" -k "Accept: text/xml"
-S 
-H example.com
-p 443
-u /service
-t 3

さて、これをすべてまとめると、Nice OKの出力が得られるはずです。まず、これを機能させてください。

次に、Cookieを介したノード選択を有効にし、オプションで、パッシブデータセンターを介したパスを確認する場合にDNSをオーバーライドするために使用できるIPを送信できるようにするいくつかのカスタムアスペクトの時間です。これを行うために、check_httpの周りに小さなシェルスクリプトラッパーを記述します。これは、バックエンドノードのホスト名として1つのパラメーターを取り(便宜上、icingaがホスト名と見なすものを使用します)、オプションのパラメーターをオーバーライドします。チェックするサーバーのIP(DNSルックアップをバイパス)。これにより、シェルスクリプトは次のようになります(/ usr/lib64/nagios/plugins /に配置し、他のプラグインと同様にchown、chmodすることをお勧めします)。

#/bin/bash

if [  -z "$1" ]
  then
    echo "Usage: $0 Host-name [haproxy-ip]"
  exit 2
fi

if [[ $# -eq 2 ]]; then
    APPEND_OPTS=" -I $2"
fi

#Map icinga/nagios Host names to haproxy node names in case these differ and you don't want to expose them on the internetz
declare -A nodes
nodes=(["webA1"]="S1"
        ["webA2"]="S2"
        ["webB1"]="S3"
        ["webB2"]="S4")
node=${nodes["$1"]}


/usr/lib64/nagios/plugins/check_http -P "<echo>Hello</echo>" -r 'Hello' -k "Cache-Control: no-cache" -k "Pragma: no-cache" -k "Content-Type: text/xml; charset=UTF-8" -k "Accept: text/xml" -S -H example.com -p 443 -u /service -t 3 -k "Cookie: SERVERID=$node" $APPEND_OPTS

SERVERIDは、haproxyで設定されたCookieの名前であることに注意してください。

これが整ったら、次のようなnagiosチェックコマンドを定義できます。

#Check path through av A fw and haproxy
define command{
        command_name    check_node_external_a
        command_line    $USER1$/check_node '$HOSTNAME$' '<A external IP>'
        }

ここで、check_nodeはラッパースクリプトの名前であり、「外部IP」はデータセンターAのシステムに到達するために使用されるIPです。

これでここ数日はかなりの時間を節約できたので、正しい方向に送ってくれることを願っています。

1
Kristofer