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 Apache Httpd 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.