Célszerű feltenni egy monitorozó eszközt, amely megmutatja, hogy a szerverünk milyen állapotban van, grafikont rajzol az erőforrások kihasználtságáról – azok aktuális és trendszerű értékeiről. Több csomag közül választhatunk, nekem a Munin a kedvencem, amely rrdtool segítségével rajzol grafikonokat, illetve be lehet állítani riasztási küszöböket, amelyről levelet küld.
Telepítés
A munin telepítése egyszerű, kettő csomagot kell telepítenünk (amelyek függőségképpen hozhatnak több tucatnyi csomagot magukkal):
# yum install munin.noarch munin-node.noarch
Konfiguráció
A feltelepített munin igényel némi módosítást a beállításait illetően, ezt a fájlban tudjuk megejteni (a meglévő minták alapján a megfelelő helyre beszúrva):
contact.system.command mail -s "Munin notification" system@javaforum.hu
[javaforum.hu]
address 127.0.0.1
use_node_name yes
Hasonlóan kell eljárnunk a munin-node.conf fájl esetén:
host_name javaforum.hu
Futtatás
A fentiek után nincs más feladatunk, mint ellenőrizni, hogy a szolgáltatások elindulnak-e:
# /sbin/chkconfig --list | grep munin
munin-node 0:off 1:off 2:off 3:off 4:off 5:off 6:off
Látszólag nem, ezért állítsuk be a megfelelő futási szintekre:
# /sbin/chkconfig munin-node on
# /sbin/chkconfig --list | grep munin
munin-node 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Ettől a pillanattól kezdve a munin-node a rendszer indulásakor el fog indulni, ám jelen pillanatban célszerű kézzel elindítani a szolgáltatást:
# service munin-node status
munin-node is stopped
# service munin-node start
Starting Munin Node: [ OK ]
# service munin-node status
munin-node (pid 3362) is running...
Nincs más dolgunk, mint várni egy kicsit, amíg a cron által ötpercenként indított munin lekérdezi a rendszerünk jellemzőit.
Apache Httpd konfiguráció
A munin önállóan is nagyon jól elvan, a kényelmes használatához azonban célszerű egy vhost beállítása, például munin.javaforum.hu néven, mivel ekkor szabadabban tudjuk a szolgáltatást módosítani, konfigurálni és persze nem zavarja meg a többi bekonfigurált vhost-ot. Az alábbi konfiguráció előfeltétele az fejezetben leírtak elvégzése:
<VirtualHost *:80>
ServerAdmin auth.gabor@javaforum.hu
DocumentRoot /var/www/html/munin
ServerName munin.javaforum.hu
DirectoryIndex index.php index.html index.htm
<Directory /var/www/html/munin>
#AuthUserFile /etc/munin/munin-htpasswd
#AuthName "Munin"
#AuthType Basic
#Require valid-user
ExpiresActive On
ExpiresDefault M310
</Directory>
ProxyVia Off
ProxyPreserveHost On
</VirtualHost>
Ha nem szeretnénk idegenek számára elérhetővé tenni a grafikonokat, akkor kommentezzük ki az alábbi négy sort, illetve gondoskodjunk arról, hogy a munin-htpasswd tartalmazza a megfelelő felhasználóneveket és jelszavakat:
AuthUserFile /etc/munin/munin-htpasswd
AuthName "Munin"
AuthType Basic
Require valid-user
Saját plugin létrehozása
Idővel szükségünk lesz olyan méréseket végezni, amire nincs gyári plugin, ekkor létre kell hoznunk egy jól kitöltött perl programot, amely a munin lekérdezés során megfelelő tartalmat ad majd vissza (ennek a formátumát nem részletezném). Például a Java alkalmazások memória foglaltságára az alábbi plugin-t használom:
#!/usr/bin/perl
my $javabinhome = $ENV{'javabinhome'} || '/usr/bin';
if ( $ARGV[0] and $ARGV[0] eq "autoconf" )
{
print "yes\\n";
exit 0;
}
$0 =~ /jstat_(.+)*_(.+)$/;
my $jpsName = $1;
my $processName = $2;
if ( $ARGV[0] and $ARGV[0] eq "config" )
{
print "graph_title $processName memory usage in MBytes\\n";
print "graph_args --lower-limit 0\\n";
print "graph_vlabel in MBytes\\n";
print "graph_order perm old survivor0 survivor1\\n";
print "graph_info This graph shows memory usage of the $processName process.\\n";
print "survivor0.label Survivor0\\n";
print "survivor0.info Survivor0 generation\\n";
print "survivor0.draw STACK\\n";
print "survivor1.label Survivor1\\n";
print "survivor1.info Survivor1 generation\\n";
print "survivor1.draw STACK\\n";
print "old.label Old\\n";
print "old.info Old generation\\n";
print "old.draw STACK\\n";
print "old_capacity.label Old capacity\\n";
print "old_capacity.info Old generation capacity\\n";
print "old_capacity.draw LINE2\\n";
print "perm.label Permanent\\n";
print "perm.info Permanent generation\\n";
print "perm.draw AREA\\n";
print "perm_capacity.label Permanent capacity\\n";
print "perm_capacity.info Permanent generation capacity\\n";
print "perm_capacity.draw LINE2\\n";
print `whoami`;
exit 0;
}
my $result = `LANG="en_US.UTF-8";$javabinhome/jps -v`;
@result = split(/\\n/, $result);
$gc = "0";
foreach $line(@result)
{
if ( $line =~ /^(\\d+)\\s$jpsName.*$processName/ )
{
if ( $gc eq "0" )
{
$gc = `LANG="en_US.UTF-8";$javabinhome/jstat -gc $1`;
}
}
}
@lines = split(/\\n/, $gc);
@params = split(/\\s+/,$lines[1]);
$survivor0 = $params[2]/1024.0;
$survivor1 = $params[3]/1024.0;
$old = $params[7]/1024.0;
$perm = $params[9]/1024.0;
$perm_capacity = $params[8]/1024.0;
$old_capacity = $params[6]/1024.0+$perm_capacity;
print "survivor0.value ".$survivor0."\\n";
print "survivor1.value ".$survivor1."\\n";
print "old.value ".$old."\\n";
print "perm.value ".$perm."\\n";
print "old_capacity.value ".$old_capacity."\\n";
print "perm_capacity.value ".$perm_capacity."\\n";
Létre kell hozni egy konfigurációs állományt, amely megoldja, hogy az adott Java process nevében fusson a fenti script:
jstat_Bootstrap_confluence
user confluence
Majd egyszerűen létrehozzuk a megfelelő nevű symlink-et, újraindítjuk a munin-t, s végül leteszteljük:
# cd /etc/munin/plugins/
# ln -s /etc/munin/own-plugins/jstat jstat_Bootstrap_confluence
# service munin-node restart
# telnet localhost 4949
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
# munin node at javaforum.hu
fetch jstat_Bootstrap_confluence
survivor0.value 3.8513671875
survivor1.value 0
old.value 331.89404296875
perm.value 177.750390625
old_capacity.value 689.9375
perm_capacity.value 177.9375
.
quit
Connection closed by foreign host.
Az eredménynek a grafikonok között is meg kell jelennie a következő – öt percenkénti – lefutás után.
Mentés
Célszerű rendszeres időnként mentést készítenünk a munin adatbázisáról, ehhez két fontos könyvtárat kell a mentésbe vonnunk:
- /etc/munin – konfiguráció
- /var/lib/munin – adatok
Egyszerűen hozzunk létre a munin felhasználó nevében egy backup.sh nevű szkriptet:
# su - munin --shell=/bin/bash
$ mkdir bin
$ touch bin/backup.sh
$ chmod +x bin/backup.sh
Majd írjunk bele egy rövid programot:
#!/bin/bash
tar cjvf /home/backup/etc_munin.tar.bz2 /etc/munin/
tar cjvf /home/backup/var_lib_munin.tar.bz2 /var/lib/munin/
Majd próbáljuk ki, hogy fut-e és mennyi ideig fut:
$ time bin/backup.sh
tar: Removing leading `/' from member names
tar: Removing leading `/' from member names
real 0m4.719s
user 0m3.437s
sys 0m0.054s
$ ls -l /home/backup/*munin*
-rw-rw-r--. 1 munin munin 15081 Jun 23 12:57 /home/backup/etc_munin.tar.bz2
-rw-rw-r--. 1 munin munin 691845 Jun 23 12:57 /home/backup/var_lib_munin.tar.bz2
Hozzunk létre egy felhasználói cron bejegyzést a `crontab -e` parancs segítségével és időzítsük kedvünk szerint (ám kerüljük a túl kerek számokat):
MAILTO=root
3 13 * * * bin/backup.sh
Majd figyeljük a cron naplóját és a backup könyvtár tartalmát, hogy valóban lefut-e a mentés a megadott időben.