Como configurar MON para monitorar remotamente em sistemas Debian e controlar serviços locais

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