Administrare server open source

Platforma de hosting cu software liber, gratuit, open source.

Comentariile sunt închise pentru monit – Monitorizarea serviciilor

Orice administrator de sistem are obiceiul de a face multe scriptulete care asigura buna functionare a serviciilor puse la dispozitie de masina care o administreaza. In multe cazuri administratorii sunt tentati sa reinventeze roata, sa faca scule care exista deja sub licenta publice (GPL, BSD etc) si care sunt foate usor de folosit. O astfel de aplicatie este monit.

monit este un daemon care efectueaza verificari ciclice si monitorizeaza serviciile sistemului, fisierele, folderele sau device-urile din sistem. Mai mult de atat, cu ajutorul unor scripturi potrivite (care sunt considerate un deliciu de catre administratorii de sisteme), monit ne poate ajuta sa implementam cu usurinta politici de intretinere sau depanare automata.

Ca o mica prezentare, mentionez principalele actiuni care le poate lua monit si cateva din punctele forte ale acestui daemon:

  • poate porni un serviciu care nu ruleaza;
  • poate opri un serviciu daca indeplineste conditiile unei rulari defectuoase (consum mare de CPU sau memorie);
  • poate restarta un serviciu;
  • poate monitoriza fisiere;
  • poate monitoriza foldere;
  • poate monitoriza modificari de timestamp, md5/sha1 checksum sau marime;
  • poate monitoriza accesibilitatea unor servicii de pe sisteme remote;
  • permite rularea unor comenzi in diferite situatii date;
  • poate verifica conexiunea cu un sistem remote folosind ping;
  • permite vizualizarea statisticilor in format XML;
  • se poate conecta pe diferite porturi folosind mai multe protocoale (ftp,smtp,http,raw etc.);
  • ofera utilizatorului posibilitatea de a verifica statusul serviciilor monitorizate folosind un browser web;
  • poate forma grupuri de aplicatii/fisiere care depind unul de celalalt.

Dupa cum se poate vedea, e un serviciu foarte util si, mai ales, transparent. Este usor de instalat iar odata instalat si configurat corect putem uita de el. Este scris in C, deci consumul de resurse este mic. Fisierul binar ocupa putin peste 300KB memorie RAM (complet insesizabil chiar si pe un server vechi).

Instalare

Instalarea serviciului este usoara. In FreeBSD il putem instala din porturi. Intram in folderul /usr/ports/sysutils/monit si rulam comanda “make install clean“. In cateva minute totul e instalat si functional. Mai avem doar de adaugat in /etc/rc.conf linia:

monit_enable=”YES”

iar apoi putem trece la crearea fisierului de configurare, /usr/local/etc/monitrc.

In cazul in care se foloseste o distributie Linux pentru care nu exista aplicatia intr-un binar (deb, rpm etc) sau daca dorim neaparat sa instalam monit din surse va trebui sa downloadam ultima versiune stabila de la adresa http://www.tildeslash.com/monit/download/ iar apoi sa rulam urmatoarele comenzi ca root:

% tar zxvf monit-x.y.z.tar.gz
% cd monit-x.y.z
% ./configure
% make
% make install
% make clean

x.y.z se schimba cu versiunea downloadata (ex. 4.10.1). Pentru a vedea o lista completa de parametri ai comenzii ./configure putem rula comanda:

./configure –help

Dupa instalare binarul monit se poate gasi in /usr/local/bin.

Utilizare

Dupa instalare il putem folosi. La pornire monit cauta fisierul monitrc in folderul utilizatorului root, apoi in /etc/ daca nu il gaseste sau in /usr/local/etc. Se poate specifica fisierul de configurare la pornirea aplicatiei prin pasarea caii absolute folosind parametrul -c (ex. monit -c /usr/local/etc/monitrc).

Inainte de a porni serviciul sau inainte de a-l restarta dupa o modificare e bine sa verificam sintaxa. Sintaxa fisierului monitrc poate fi verificata pasand parametrul -t executabilului. De exemplu:

% monit -t
Control file syntax OK
%

Pentru a vedea ce se poate pune in fisierul monitrc sau pentru a prelua diferite moduri de configurare/verificare se poate urmari pagina de exemple de la adresa http://www.tildeslash.com/monit/doc/examples.php.

Pornirea serviciului se poate face din consola ruland comanda “monit“, dar e de preferat sa se foloseasca scriptul de initializare. In cazul FreeBSD scriptul de initializare arata asa:

#!/bin/sh
#
# PROVIDE: monit
# REQUIRE: NETWORKING SERVERS
# BEFORE: DAEMON
# KEYWORD: shutdown
 
#
# Add the following lines to /etc/rc.conf to enable monit:
# monit_enable (bool):        Set to “NO” by default.
#                             Set it to “YES” to enable monit
#
. /etc/rc.subr
 
name=”monit”
rcvar=`set_rcvar`
 
restart_precmd=”monit_checkconfig”
reload_precmd=”monit_checkconfig”
 
default_config=/usr/local/etc/monitrc
required_files=${default_config}
command=”/usr/local/bin/monit”
command_args=”-c ${default_config}pidfile=”/var/run/monit.pid”
 
[ -z "$monit_enable" ] && monit_enable=”NO”
 
load_rc_config $name
 
monit_checkconfig()
{
echo “Performing sanity check on monit configuration:”
${command} ${command_args} -t
}
 
extra_commands=”reload”
run_rc_command “$1

Configurare

Fisierul de configurare, monitrc, este impartit in doua parti: una pentru setari globale si una pentru servicii. Setarile globale sunt la inceputul fisierului si se foloseste cuvantul cheie set pentru a initializa un parametru. Setarile pentru servicii incep cu cuvantul cheie check urmat de tipul serviciului de monitorizat. O inregistrare de serviciu poate contine diferite verificari “if” – unele fiind valabile doar in cazul anumitor servicii, cum ar fi testul md5 care este valabil doar pentru fisiere.

O inregistrare pentru monitorizarea unui proces necesita calea absoluta catre fisierul care pastreaza PID-ul aplicatiei monitorizate. Un fisier, un folder sau un device necesita calea absoluta catre resursa de verificat.

Setarile generale pot arata de forma:

# Fisier de configurare
 
set daemon 30
set logfile syslog facility LOG_daemon
set mailserver mail.domeniu.ro
set alert admin@domeniu.ro
set httpd port 2812 address localhost
allow localhost
allow user:pass

Prima linie, care incepe cu #, e un comentariu. La fel ca in shell scripting liniile care incep cu # sunt ignorate. A doua linie, o linie goala, este de asemenea ignorata. Pe a treia linie se seteaza directiva daemon cu valoarea 30, ceea ce inseamna ca monit va rula ca daemon (modul recomandat) in cicluri de 30 de secunde. Valoarea setata poate fi modificata cu oricat, important e sa fie o valoare specificata in secunde. A patra linie seteaza directiva logfile si ii spune aplicatiei sa foloseasca syslog care se va ocupa de preluarea mesajelor. Tot aici se poate seta si un fisier in care se salveaza mesajele daca nu dorim folosirea serviciului syslog. Daca dupa directiva logfile se da calea absoluta catre un fisier (ex. /var/log/monit.log) toate mesajele vor fi scrise in acel fisier. A 5-a linie specifica serverul SMTP folosit pentru trimiterea de mailuri. Daca serverul de mail necesita autentificare se pot folosi cuvintele cheie username si password pentru a seta numele de utilizator si parola. Un alt exemplu de setare a directivei mailserver ar fi urmatorul:

mailserver domeniu.ro port 25 username “utilizator” password “parola” with timeout 15

Pe linia 6 e directiva alert care spune adresa la care se trimit mesajele. In cazul de fata, orice se intampla pe server se va trimite un mail pe adresa [email protected]. Pe linia 7 setam modul in care va functiona pagina de statistici. Daca setam directiva httpd se va activa panoul de vizualizare a statisticilor care poate fi vizualizat cu ajutorul unui browser web conectat la adresa specificata de cuvantul cheie address pe portul specificat de cuvatul cheie port. Folosind cuvantul cheie allow se pot specifica adresele carora li se va permite accesul la statistici. De asemenea, ca o protectie suplimentara, se poate seta un nume de utilizator si o parola care sunt necesare accesarii statisticilor.

Pentru monitorizarea unui proces este nevoie de un fisier care contine PID-ul procesului. De exemplu, in cazul in care dorim monitorizarea serverului web, putem folosi urmatoarele linii de configurare:

check process Apache with pidfile /usr/local/apache/logs/httpd.pid
start program = “/usr/local/etc/rc.d/apache.sh start”
stop program  = “/usr/local/etc/rc.d/apache.sh stop”
if children > 256 then restart
if loadavg(5min) greater than 5 for 5 cycles then restart
if cpu < 50% for 10 cycles then exec/usr/bin/renice 0 -p `/bin/cat /usr/local/apache/logs/httpd.pid`”
noalert admin@domeniu.ro
if cpu > 50% for 2  cycles then exec/usr/bin/renice 10 -p `/bin/cat /usr/local/apache/logs/httpd.pid`”
noalert admin@domeniu.ro
if cpu > 80% for 3  cycles then restart

In exemplul de mai sus specificam pe prima linie ca dorim urmarirea procesului Apache (numele il punem noi cum dorim) care are fisierul PID /usr/local/apache/logs/httpd.pid. Mai jos avem directivele “start program” si “stop program” care vor lua ca si valori comenzile pentru pornirea si oprirea serviciului. E important sa avem comenzile trecute cu ghilimele. Pe liniile 4 si 5 punem doua conditii. Daca serverul are mai mult de 256 thread-uri il restartam, 256 fiind o valoare foarte mare in majoritatea cazurilor – exceptie fac serverele web dedicate. De asemenea daca incarcarea serverului pe ultimele 5 minute este mai mare de 5, si timp de 5 cicluri se inregistreaza aceeasi depasire a incarcarii, serverul se va restarta – sunt mari sansele sa existe un consumator foarte mare pe server. Mai jos sunt inca 3 conditii care ne ajuta in stabilizarea unui server incarcat. Daca serverul web consuma mai mult de 50% din procesor timp de 2 cicluri de rulare folosim comanda renice pentru a schimba prioritatea acestuia. Daca timp de 3 cicluri de rulare consumul de procesor este peste 80% e cazul sa restartam serverul web pentru a opri consumatorii mari si astfel pentru a restabiliza serviciile. De asemenea este si o regula care, daca timp de 10 cicluri de rulare consumul de CPU este sub 50%, seteaza prioritatea serverului web pe 0 – prioritatea normala de rulare. In general nu ne intereseaza rezultatul conditiilor de stabilizare a serverului decat in cazuri extreme deci am folosit in doua dintre cazuri cuvantul cheie noalert care ne spune ca actiunea trebuie luata fara a se trimite un mesaj.

Un exemplu asemanator putem folosi in cazul in care dorim monitorizarea serverului MySQL. In cazul de fata se va incerca conectarea la localhost pe portul 3306. Daca nu se poate conecta, incercam o restartare a serviciului:

check process MySQL with pidfile /var/db/mysql/MyServer.pid
start program = “/usr/local/etc/rc.d/mysql-server.sh start”
stop program  = “/usr/local/etc/rc.d/mysql-server.sh stop”
if failed host 127.0.0.1 port 3306 protocol mysql then restart
if cpu &gt; 70% for 3 cycles then restart
noalert admin@domeniu.ro
if 5 restarts within 5 cycles then timeout

De asemenea putem pune si aici o conditie de consum a procesorului. Daca timp de 3 cicluri de rulare consumul de procesor depaseste 70% se restarteaza serverul MySQL. Daca dupa 5 restartari consecutive nu se rezolva problema se opreste monitorizarea.

Modul in care poate fi utilizat monit e foarte complex. Cu putina atentie il putem face sa preia peste 50% din atributiile administratorului de sistem, astfel scazand partea plictisitoare a administrarii si crescand productivitatea. Pentru mai multe detalii se poate vizita site-ul monit, pagina cu exemple si manualul de utilizare.

Linux

Comments are closed.