Como monitorar os nós do servidor da web por meio do proxy HA usando o Icinga / Nagios no CentOS 6

1

Neste guia, não estou me concentrando em configurar o proxy HA ou por que você gostaria de fazer isso. Se você tem isso e quer monitorá-lo corretamente usando Icinga, aqui está uma idéia de como você poderia fazer isso.

Então, aqui está um cenário em potencial:

  • 2 data centers A e B
  • 1 nó de proxy HA por data center
  • Cada proxy HA aponta para 2 servidores da web em cada data center A1, A2, B1, B2
  • Os servidores da Web nesse cenário são realmente um ponto de extremidade do serviço da Web e um simples HTTP GET para um URL não informa muito sobre a integridade real do sistema

Monitoramento sábio você pode se contentar com uma verificação externa (como pingdom ou qualquer outro) de seus nós ativos no momento. Isso teria algumas implicações:

  • Você não testaria nós passivos, o que significa que, antes de um switch de nó, você não tem certeza se os nós passivos estão funcionando
  • Uma falha de um nó não fornecerá uma indicação clara do que está errado

Então, aqui está uma abordagem de pessoas paranoicas:

  • Eu quero monitorar cada nó todo o caminho desde o (s) IP (s) externo (s), através do proxy HA e no sistema para detectar qualquer falha ao longo do caminho
  • Eu quero fazer uma chamada real do Serviço da Web para o serviço de back-end para verificar se ele está funcionando - obviamente, não aplicável se você estiver testando um site normal

Vamos chegar a ele então ...

    
por Kristofer 29.10.2014 / 12:18

1 resposta

1

Primeiro de tudo, você precisará ativar a inserção de cookies no haproxy e atribuir a cada nó de back-end sua chave exclusiva. Isso geralmente é usado para a viscosidade da sessão - ou seja, você quer que alguém que visita seu site sempre obtenha o mesmo nó de backend se ainda estiver disponível. Mas também pode ser usado para monitorar nós individuais enviando o cookie apropriado. Então, se não estiver presente, adicione cookies às definições do seu servidor haproxy:

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

Em segundo lugar, você precisará descobrir o que faz mais sentido verificar, sobre isso, você precisará pensar um pouco e mexer em si mesmo para descobrir o que faz mais sentido e como verificar isso usando o impressionante check_http do nagios. . Para completar, darei um exemplo complexo abaixo de como você poderia testar um POST em relação a um Serviço Web de back-end. Para este cenário de exemplo, os requisitos são:

 - 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

Isso seria resolvido pelos seguintes argumentos para check_http (/ usr / lib64 / nagios / plugins / check_http no Cent OS 6)

-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

Agora, tudo isso deve dar a você uma boa saída OK, faça isso funcionar primeiro.

Depois, é hora de alguns aspectos personalizados que permitem a seleção de nós por meio do cookie e também o envio opcional de um IP para substituir o DNS, caso você queira, por exemplo, verificar um caminho em um data center passivo. Para fazer isso, vamos escrever um pequeno wrapper de script de shell em torno de check_http que terá um parâmetro como o nome do host do nó de backend (por conveniência, vamos usar o que icinga considera o nome do host) e um parâmetro opcional substituindo o IP do servidor para verificar (ignorando a pesquisa de DNS). Isso tudo resulta em um shell script parecido com este (sugiro colocá-lo em / usr / lib64 / nagios / plugins / e chown, chmod-lo como por outros plugins lá):

#/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

Observe que SERVERID é o nome do conjunto de cookies no haproxy.

Uma vez que isto está no lugar, você pode definir seus comandos de verificação nagios semelhantes a:

#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>'
        }

Onde check_node é o nome do script wrapper e 'Um IP externo' é o IP usado para acessar o sistema no data center A.

Isso teria me poupado muito tempo nos últimos dias, então eu espero que isso possa te mandar na direção certa também.

    
por 29.10.2014 / 12:18