O
objetivo é configurar em sistemas Debian o programa "mon" para
monitorar REMOTAMENTE serviços e disparar ações conforme os eventos,
inclusive controlar serviços locais.
Mon possui vários scripts monitores e de ações em sua seção contrib do repositório em
do projeto MON
Os scripts podem ser complexos a ponto de
executarem queries pré-definidas em bancos de dados remotos ou também enviar emails de alerta ao sysadmin.
Escopo
Utilizaremos como exemplo, monitorar a disponibilidade de conexão de
rede TCP/IP com outra máquina remota. Se perder a conexão de rede, o mon
disparará um script que irá PARAR o serviço heartbeat na máquina local
SECUNDÁRIA do cluster de Alta Disponibilidade de serviço.
Isso para evitar uma situação de split brain no cluster, na falta de
um cabo cross over entre as máquinas ou uma conexão serial direta.
Foi decidido não reiniciar o serviço heartbeat em caso de reconexão,
recurso possível com o mon, para exigir verificação da situação pelo
sysadmin.
Com base nesses objetivos, alguns parâmetros foram configurados, como
a freqüência de execução e número de incidentes necessários para emitir
alerta.
Procedimentos
Instalar mon e suas dependências
debianpgcluster2:~# apt-get update
debianpgcluster2:~# apt-get upgrade
debianpgcluster2:~# apt-get install mon
Criar diretório onde guardaremos os logs e conceder propriedade
debianpgcluster2:~# mkdir -p /var/log/mon
debianpgcluster2:~# chown -R mon.mon /var/log/mon
Conceder direitos de execução alheia
Para que o mon possa disparar um script que pare serviços na máquina
local, terá de receber poderes de root SEM NECESSIDADE DE SENHA,
concedidos pelo sudo.
Edite o arquivo /etc/sudoers para restringir o acesso de mon apenas a um comando específico:
# User alias specification
User_Alias SERVICE_ADMINS = mon
# Cmnd alias specification
Cmnd_Alias HEARTBEAT_STOP_ALERT = /usr/lib/mon/alert.d/heartbeat_stop.alert
Cmnd_Alias INVOKE_HEARTBEAT_STOP = /usr/sbin/invoke-rc.d heartbeat stop
# User privilege specification
root ALL=(ALL) ALL
SERVICE_ADMINS ALL=(root) NOPASSWD: HEARTBEAT_STOP_ALERT, INVOKE_HEARTBEAT_STOP
Edite o arquivo /etc/mon/mon.cf
Muita atenção que linhas separadoras de seções em branco são importantes.
Usaremos um serviço ping, implementado por fping, executado com NO
MÍNIMO O DOBRO da freqüência de execução do heartbeat para o serviço de
interesse, para garantir que sempre será possível detetar a queda de
rede antes que o heartbeat identifique a falta de contato com o nó
secundário E vice-versa, e assim entre em situação de split brain.
Não é recomendável ping sobre o gateway, pois pode ficar saturado e não responder a tempo.
Haverá um registro de downtime em /var/log/mon/downtime.log mantido pelo próprio mon.
O período de verificação do monitor é nos dias da semana de Domingo à
Sábado, i.e., todos os dias. Week days; semana inicia domingo.
Versões recentes de mon não precisam ter tal especificação para esse
uso, bastando deixar o período em branco, mas você precisa testar.
Mon disparará 1 alerta após 1 ocorrência, pois o sistema precisa
detetar dentro do período definido pela freqüência e basta a primeira
vez, pois não reiniciará automaticamente.
# /etc/mon/mon.cf, configuration file for mon
#
# Run `/etc/init.d/mon reload' after editing this file in order for your
# changes to take effect.
# There is no default configuration for mon. The docs most useful for
# setting up your /etc/mon/mon.cf file are the mon(1) man page,
# /usr/share/doc/mon/README.hints*, /usr/share/doc/mon/README.monitors*
# and /usr/share/doc/mon/examples/mon.cf*.
# When you do configure your server, it's a good idea to include these
# settings (to restrict access to the server to the local machine):
#
# serverbind = localhost
# trapbind = localhost
# global options
serverbind = localhost
trapbind = localhost
alertdir = /usr/lib/mon/alert.d
mondir = /usr/lib/mon/mon.d
logdir = /var/log/mon
histlength = 100
#authfile = /etc/mon/auth.cf
dtlogging = yes
dtlogfile = downtime.log
#blank lines section separators are important!
hostgroup pingableservers
10.987.789.987
#blank lines section separators are important!
watch pingableservers
service ping
description verificar rede externa
interval 10s
monitor fping.monitor
period wd {Sun-Sat}
numalerts 1
alertafter 1
alert heartbeat_stop.alert
alert mail.alert -S "Network is down" admin@example.com
upalert mail.alert -S "Network is up" admin@example.com
# alert file.alert -d /var/log/mon network.log
Crie o arquivo de log /var/log/mon/heartbeat_stop.alert.log para o usuário mon
debianpgcluster2:~# touch /var/log/mon/heartbeat_stop.alert.log
debianpgcluster2:~# chown mon.mon /var/log/mon/heartbeat_stop.alert.log
Crie o arquivo /usr/lib/mon/alert.d/heartbeat_stop.alert
Mon, tal como cron, não executa scripts que gerem saída no console.
No script, redirecione toda saída de comandos para algum arquivo, em nosso caso usando sintaxe válida para bash.
No script que não precisa parâmetros, optamos por gerar logs separados, para o comando invocado e para o próprio script.
#!/bin/sh
#
echo "`date` $*" >> /var/log/mon/heartbeat_stop.alert.log
sudo invoke-rc.d heartbeat stop &>/var/log/mon/heartbeat_invoke.log
Depois conceda permissão de execução ao arquivo /usr/lib/mon/alert.d/heartbeat_stop.alert
debianpgcluster2:~# chmod a+x /usr/lib/mon/alert.d/heartbeat_stop.alert
Reinicie mon
debianpgcluster2:~# invoke-rc.d mon restart
Verifique o funcionamento do mon
debianpgcluster2:~# monshow --detail pingableservers,ping |less
Bibliografia
[0]
http://www.kernel.org/software/mon/
[1]
http://sourceforge.net/projects/mon/
[2]
http://mon.cvs.sourceforge.net/viewvc/mon/mon-contrib/monitors/postgres/postgresql/postgresql.monitor?view=log
[3]
http://www.debianhelp.co.uk/mon.htm
[4]
http://www.is.depaul.edu/_downloads/SampleMONConfigFile.txt
[5]
https://mon.wiki.kernel.org/index.php/Mon_Manual
[6]
http://foswiki.sigsegv.cx/bin/view/Net/MONStuff
Comentários
Postar um comentário