A munin működése

A Unix/Linux szerverek üzemeltetése wikiből

A munin egy olyan programcsomag, amivel egy gép könnyedén lekérdezheti sok másik gép teljesítményadatait és grafikonokat rajzolhat belőlük.

Össze lehet kapcsolni a nagios-szal; ebben az esetben riasztást kapunk arról, ha valamely lekérdezett teljesítményadat meghalad egy küszöbértéket.

Tartalomjegyzék

1 Architektúra

A munin alapvetően kétféle gépet különböztet meg:

  • munin-"szerver".
    • Ez gyűjti a teljesítményadatokat és rajzol belőlük grafikont.
    • Azért idézőjel, mert TCP-értelemben kliensként viselkedik.
    • Nincs állandóan futó része: ötpercenként elindul, lekérdezi az adatokat, és frissíti a grafikonokat.
  • munin-node
    • TCP-értelemben szerver.
    • A munin-"szerver" kapcsolódik rá és lekérdezi, amit le lehet.
    • Hogy mit lehet lekérdezni, azt az dönti el, hogy milyen pluginek aktívak a munin-node-on.
      • Egy plugin aktívvá tételéhez csak be kell symlinkelnünk a plugins könyvtárba (és újra kell indítanunk a munin-node-ot).
    • Egy plugin outputja részben a hozzá tartozó grafikonok beállításait, részben az aktuális mért adatokat tartalmazza.

2 A grafikonok

Így fognak kinézni:

Wifi.tmit-iostat-day.png Ircszerver-if eth0-week.png

  • A grafikonokat az RRDTool rajzolja és az adatokat is ő tárolja; a munin igazából csak egy perl wrapper az RRDtool köré.
  • RRD: round-robin database (man rrd-beginners, man rrdtutorial - ebben van SNMP is, ha valakit érdekel)
    • Sosem nő a mérete, lényegében egy körpuffer
  • Adatforrások típusa (man rrdcreate; a lényeg: a típus a kiolvasott adat jellemzőiből következik, nem szabadon választható!):
    • GAUGE: egy olyan érték, amelynek nem az idő szerinti deriváltját szeretnénk ábrázolni; pl. hőmérséklet
    • COUNTER: számláló, ami sosem csökken (kivéve túlcsorduláskor); pl. hálózati forgalom
      • Ha bármi miatt resetelődik a számlálónk, tüskés lesz a grafikon, mert az RRDTool túlcsordulást feltételez és ennek megfelelően korrigálja az értéket. Létezik egy killspike.pl nevű script, amivel utólag megtisztíthatjuk az adatbázisokat, de jobb eleve elkerülni a tüske létrejöttét pl. úgy, hogy azt is megadjuk, legfeljebb mekkora érték hihető.
      • Az RRDTool a grafikonban nem a számláló mindenkori értékét ábrázolja, hanem a számláló növekedésének az ütemét (a számláló idő szerinti deriváltját).
    • DERIVE: olyan számláló, aminél sosem feltételezünk túlcsordulást.
      • A két egymást követő értéket összekötő szakasz meredekségét fogja ábrázolni.
      • Ez lehet negatív is, tehát számlálóknál érdemes alulról korlátozni az értelmezési tartományt.
    • ABSOLUTE: olyan számláló, amit a kiolvasás aktusa nulláz. Egyébként úgy viselkedik, mint a COUNTER.
  • Adatforrások további tulajdonságai:
    • min, max: érdemes megadni, ha meg tudjuk, mert így az rrdtool el tudja dobni a hibás adatokat (pl. nem lesz az ADSL-ünkön gigabit/s-os forgalmi tüske a grafikon szerint)
    • Az adatok értéke lehet "ismeretlen", ami nem ugyanaz, mint a nulla
    • Ha a megadottnál hosszabb ideig nem kerül új adat az rrd-be, akkor arra az időszakra ismeretlen lesz az érték
  • Grafikonok lehetőségei, a teljesség igénye nélkül:
    • Görbék
    • "kitöltött görbék" (area)
    • Ezek stackelhetők
    • Berakhatók fix vízszintes vonalak
    • Származtatott értékek ("CDEF")
    • Címkék

3 Konfiguráció

A munin-"szervert" a /etc/munin/munin.conf file-ban kell konfigurálni.

Pl:

dbdir   /var/lib/munin
htmldir /var/www/munin
logdir  /var/log/munin
rundir  /var/run/munin

# Where to look for the HTML templates
tmpldir /etc/munin/templates

# a simple host tree
[saját.magunk.domain]
    address 127.0.0.1

[másik.gép.domain]
    address 192.168.0.4

[harmadik.gép.domain2]
    address 10.0.0.2
    port 49494

[domain;negyedik.gép.valahol]
    address 172.16.2.3

[domain;névváltós.gép.valahol]
    address 1.2.3.4
    use_node_name yes

A monitorozott gép konfigurációja egyrészt a /etc/munin/munin-node.conf file-ban, másrészt pluginek symlinkelésével történik.

Példaconfig (runitos futtatáshoz):

log_level 4
log_file /var/log/munin/munin-node.log
port 4949
pid_file /var/run/munin/munin-node.pid
#background 1
#setsid yes
host *
user root
group root
host_name névváltós.gép.valahol
allow ^127\.0\.0\.1$
allow ^192\.168\.10\.3$

A plugineket a /etc/munin/plugins könyvtárba kell symlinkelni. Vannak generikus pluginek, amik a symlink nevéből találják ki, mit is kell csinálniuk; pl:

  • /etc/munin/plugins/if_eth0 -> /usr/share/munin/plugins/if_
  • /etc/munin/plugins/sensors_fan -> /usr/share/munin/plugins/sensors_
  • /etc/munin/plugins/ping_1.2.3.4 -> /usr/share/munin/plugins/ping_

A pluginek viselkedését külön configfile-okban szabályozhatjuk a /etc/munin/plugin-conf.d könyvtárban elhelyezett file-okkal; pl.:

[mysql*]
user root
env.mysqlopts --defaults-extra-file=/etc/mysql/debian.cnf

[exim_mailstats]
group mail, adm

[ldap_*]
env.binddn cn=munin,dc=foo,dc=bar
env.bindpw secret

[snmp_*]
env.community SecretSNMPCommunityString

4 Riasztások küldése

Egyfelől lehet a nagioson át.

Másfelől lehet önállóan.

Ehhez csak a következőket kell írni a munin.conf-ba:

contacts admin
contact.admin.command mail -s "Munin notification ${var:host}" admin@email.cime
contact.admin.always_send warning critical

[saját.magunk.domain]
    address 127.0.0.1
    # a HTML-ből lehet kipuskázni az alábbi mezőneveket:
    df._dev_sda1.warning 95
    df._dev_sda1.critical 99
    hddtemp.hda.critical 50

A valóságban nekem 2004. körül nem nagyon működött a riasztások küldése; sok vakriasztás volt, és nem sikerült rájönni, mi okozza őket. Azóta nem próbáltam.

5 Egyéb lehetőségek

6 Pluginek írása

Példaplugin:

HDDTEMP=/usr/sbin/hddtemp

if [ "$1" = "autoconf" ]; then
        if [ -x "$HDDTEMP" ]; then
                echo yes
                exit 0
        else
                echo no
                exit 1
        fi
fi

if [ "$1" = "config" ]; then

        echo 'graph_category sensors'
        echo 'graph_title HDD temperature'
        echo 'graph_args --base 1000 -l 0'
        echo 'graph_vlabel temp in °C'
        echo "graph_width 600"
        echo "graph_height 200"
        for a in $drives; do
                echo "$a.label $a"
                echo "$a.min 20"
                echo "$a.max 95"
        done
        exit 0
fi

function gettemp() {
        (
        if hddtemp -q $1 | grep '[0-9].C$'; then
                for i in 1 2; do
                        sleep 1
                        hddtemp -q $1 | grep '[0-9].C$' || exit
                done
        fi
        ) \
                | sed 's/.*: \([0-9][0-9]*\).C$/\1/' \
                | sort -n \
                | head -2 \
                | tail -1
}

cd /dev

for a in ${drives:-[hs]d[a-z]}; do
        echo "$a.value " $(gettemp $a) | egrep ' [0-9]+$' &
done
wait

7 Ajánlott irodalom

8 Potenciális ZH-kérdések

  • Hogy néz ki a munin architektúrája? Milyen elemekből áll, és ezek hogyan kapcsolódnak egymáshoz? (A válaszban ki kell térni legalább a munin-node-ra, a munin-"szerverre", az rrdtoolra és a pluginekre.)
  • Milyen esetben érdemes COUNTER helyett DERIVE típusúnak definiálni egy adatot a munin (rrdtool) számára, és miért?
Személyes eszközök