Monitorare i database con Zabbix

Zabbix e' un potente stumento di monitoraggio dei sistemi Open Source noto per la ricchezza di funzionalita'.
Questo documento descrive, in termini pratici, come utilizzare Zabbix per monitorare i piu' diffusi database.
Il documento fa riferimento alla versione 2.2 LTS di Zabbix su Linux ma e', mutatis mutandis, valido anche per le altre versioni [NdA in realta' ora e' passato un po' troppo tempo: i concetti di base ed i link sono ancora validi ma le integrazioni verso i database sono ora molto piu' complete e verso molti piu' prodotti; temo che prima o poi dovro' riscrivere questa paginetta...].
Dopo una breve introduzione sui principali elementi dell'archittettura di Zabbix, vengono analizzati le principali statistiche prestazionali e strumenti di monitoraggio disponibili per ogni database. Ecco i principali capitoli: Zabbix (da saltare se conoscete gia' Zabbix), Monitoraggio Database, MySQL, PostgreSQL, Oracle, MongoDB, ... Varie ed eventuali

Zabbix

Zabbiz e' uno dei piu' diffusi e completi strumenti di network e system monitoring. Zabbiz ha un'interfaccia completa, ha la possibilita' di personalizzare la console, e mantiene i dati su un DB (tipicamente MySQL). Zabbix puo' essere utilizzato come strumento di Monitoraggio aziendale e, grazie alla memorizzazione dei dati e alla loro semplice presentazione, anche come strumento di Performance e Capacity Management.
Zabbix e' un Open Source rilasciato con licenza GNU. Sono disponibili ulteriori plugin (tipicamente anch'essi Open Source) ed eventualmente il supporto.

Zabbix presenta con una serie di mappe e di grafici i dati raccolti dai sistemi controllati rendendo semplice ed efficace il monitoraggio di una realta' aziendale anche molto complessa.

I controlli piu' semplici (ping, SMTP, HTTP) possono essere eseguiti senza installare nulla sui sistemi da controllare. Per disporre delle funzionalita' piu' complete Zabbix richiede l'installazione di agenti e l'apertura di porte specifiche.
Nel caso in cui non vengano installati Agent e' possibile utilizzare i controlli di tipo Simple oppure una serie di altri controlli che sfruttano protocolli standard (eg. SNMP, SSH ecc.) oppure script esterni. Nel caso in cui vengano utilizzati controlli di tipo simple sara' possibile controllare la presenza di un server (eg. ping) o di un servizio (eg. telnet hostname 1521) ma non e' possibile raccogliere ulteriori informazioni.
Con l'installazione di un agent e' possibile utilizzare due tipi di controlli: Active o Passive. I controlli di tipo Passive sono guidati dal server Zabbix. Il traffico dati avviene sulla porta TCP/10050 ed e' zabbix-server ad interrogare gli Agent sui sistemi controllati. Il controllo di tipo Active viene utilizzato quando, ad esempio per ragioni di sicurezza, i sistemi da controllare non possono essere raggiunti dall'esterno e sono quindi loro a farsi carico della trasmissione dei dati. Il traffico avviene sulla porta TCP/10051.

Oltre ai Check tramite Zabbix Agent, il sistema e' in grado di effettuare il monitoraggio tramite molti altri protocolli, per esempio via SSH, SNMP o tramite ODBC verso i Database (appoggiandosi a Linux ODBC). E' anche in grado di acquisire metriche di monitoraggio tramite External Check.

Per ogni metrica raccolta e' possibile configurare uno o piu' triggers. Ad ogni trigger e' possibile associare un livello di gravita' (che regola il colore con cui verra' cerchiato l'host sulla mappa) e una soglia in base alla quale si possono definire le azioni (invio mail, invio sms, esecuzione di uno script ecc..). Sia i trigger che le azioni possono essere create in base a condizioni molto sofisticate.

Per garantire una gestione completamente automatizzata Zabbix fornisce una completa interfaccia API. Le API di Zabbix usano il protocollo JSON-RPC 2.0. Forniscono un ricco insieme di metodi separati tra di essi, tramite i quali si puo' interagire col server sotto ogni aspetto. Le richieste alle API e le risposte da esse sono in formato JSON. Si riporta per completezza un esempio di una semplice richiesta in formato JSON. Utilizzando il metodo apiinfo.version inviamo una richiesta di versione alle API e ne otteniamo la relativa risposta:

Request: { "jsonrpc": "2.0", "method": "apiinfo.version", "params": [], "id": 1, "auth": "16a46baf18aaa602e1687f3110abf8a" } Response: { "jsonrpc": "2.0", "result": "2.2.8", "id": 1 }

Zabbix Agent

La configurazione degli agenti zabbix si esegue agendo sul file di configurazione del demone zabbix_agentd.conf (di default disponibile in /etc/zabbix).

Non e' raro utilizzare file di configurazione aggiuntivi in cui inserire particolari personalizzazioni o parametri specifici per Items e Template Custom. Tramite l'uso della direttiva "Include" in zabbix_agentd.conf abbiamo la possibilita' di includere path specifici dove andare ad aggiungere file di configurazione conteneti personalizzazioni e customizzazioni (eg Include= /etc/zabbix/zabbix_agentd.d/). In questi file possiamo aggiungere degli user parameter custom: delimitati da virgola (,) abbiamo il riferimento all'Items Zabbix a sinistra e il comando da eseguire a destra.

Un semplice esempio: in /etc/zabbix/zabbix_agentd.d/ abbiamo aggiunto il file userparameter_mysql.conf. All'interno troviamo la seguente direttiva:

UserParameter=mysql.version,mysql -V

Questo UserParameter, configurando opportunamente l'Item sul server Zabbix, ci restituira' la versione di MySql in uso.

Tipologie di Controlli Zabbix (Items Type)

Zabbix Server, di default, fornisce un piccolo insieme di template di controlli per monitorare i servizi/applicazioni/S.O. piu' diffusi (S.O. Linux, Windows, MySQL ecc). Se il servizio/applicazione/S.O. che dovete monitorare nella vostra realta' non e' compreso nell'elenco dei template di default di Zabbix, avete solo 2 possibilita': o scaricate e importate un Template scritto da qualcun'altro (per esempio dalla sezione zabbix-community-repos di github) oppure vi potete scrivere il vostro Template. Scrivere un Template di controlli Zabbix non e' difficile, occorre naturalmente conoscere bene Zabbix, il sistema remoto da monitorare e avere a disposizione un po' di tempo per testare e far funzionare il tutto.

Prima di entrare nel dettaglio delle configurazioni per ogni tipologia di Database descritta in questo documento, occorre definire le principali tipologie di Items (quelle utilizzate per il nostro scopo), ovvero il sistema con cui acquisire le metriche dai sistemi remoti monitorati.

Sul sito Zabbix sono disponibili l'elenco dei Template ufficiali e quello dei piu' utilizzati Template DB.

Controllo porte di accesso ai database

Nei prossimi capitoli si vedra' come personalizzare la configurazione standard per inserire il monitoraggio per i database piu' diffusi.

E' ovvio, ma non per questo va trascurato, che e' possibile effettuare il monitoraggio della sola raggiungibilita' di un database con un controllo di tipo Simple: basta verificare la porta TCP di accesso alla base dati. La tabella seguente riporta le porte di default utilizzate dai database descritti in questo documento (ed altri molto diffusi):

DatabasePorta (default)
MySQL3306
PostgreSQL5432
Oracle1521
MongoDB27017
SQL Server1433
DB26789
Hive10000
Firebird3050
Sybase5000
ClickHouse8123

Il controllo di raggiungibilita' della porta del database non effettua un'autenticazione corretta verso la base dati e, in qualche caso, puo' essere scambiata dall'RDBMS come un port scan o un DOS... Generalmente non e' un problema, ma va tenuto in conto.
Nei prossimi capitoli vedremo le configurazioni degli agenti necessarie per monitorare i piu' diffusi database. Le configurazioni descritte nel seguito effettuano accessi corretti alla base dati e consentono la raccolta di metriche significative e non solo il controllo della raggiungibilita' della base dati.

Monitoraggio Database

Ogni database fornisce un'ampia serie di statistiche e di strumenti per consentirne il monitoraggio ed il tuning.
Da questo punto di vista uno strumento come Zabbix non potra' mai sostituirsi agli strumenti nativi che risulteranno sempre piu' affidabili e completi. Dove diventa effettivamente utile una console comune quando e' necessario correlare elementi relativi al sistema operativo, alla rete, all'architettura applicativa, ... ed ai database.
A questo punto la flessibilita' e completezza di Zabbix diventano utilissimi per fornire un ambiente unico che consenta il monitoraggio, il controllo delle performance e la valutazione dei trend di crescita di tutti i componenti di una complessa realta' aziendale.

Principali metriche

Per raccogliere metriche relative ai database ospitati sui sistemi in monitoraggio e' necessario installare un agente. Ogni agente raccogliera' le metriche previste per la base dati per cui e' stato sviluppato. Naturalmente le metriche dipendono dalla base dati, ma vi sono ovviamente analogie [NdE perche' spesso hanno un'anatomia comparabile]. Tra tipologie di metriche piu' importanti ricordiamo:

Un'avvertenza importante: la frequenza di campionamento deve essere ragionevole! Se una verifica della raggiungibilita' e del corretto funzionamento del database puo' e deve essere frequente al contrario altre statistiche risulterebbero inutilmente pesanti se eseguite con alta frequenza.

MySQL

Il Template di controlli scelto e' quello a corredo con l'installazione di Zabbix ("Template App MySQL"). Questo template utilizza Items di tipo Zabbix Agent.

Configurazione Server Zabbix

E' sufficiente andare in configurazione host, selezionare l'host che ospita i Database MySQL da monitorare e collegare il Template denominato "Template App MySQL" all'host stesso.

Configurazione Database Host

Si da per scontata l'installazione dell'agente Zabbix sull'host da monitorare. Creare il file di configurazione /etc/zabbix/.my.cnf contenente le credenziali MySQL usate da Zabbix per collegarsi al Database:
[mysql]
user=zabbix_monitor
password=my_strong_password
[mysqladmin]
user=zabbix_monitor
password=my_strong_password

Verificare ora che il file di configurazione del demone (zabbix_agentd.conf) contenga la direttiva "Include=/etc/zabbix/zabbix_agentd.d/". Se non presente, aggiungerla ed eventualmente creare opportunamente la dir zabbix_agentd.d. Copiare ora il file di configurazione userparameter_mysql.conf in questo path (lo userparameter per mysql viene fornito con l'installazione dell'agente, lo su puo' trovare in /usr/share/doc/zabbix22-agent-2.2.X/userparameter_mysql.conf). Editare ora il file userparameter_mysql.conf e modificare la variabile HOME in modo coerente al PATH in cui abbiamo creato il nostro .my.cnf.
Eseguire il restart dell'agente.

L'agent utilizza fondamentalmente il comando SHOW VARIABLES per raccogliere lo stato del database. Su MySQL tale comando non richiede alcun privilegio. Nel caso si estenda lo userparameter_mysql.conf con altre selezioni dati e' sufficiente fornire i GRANT relativi. Per ragioni di sicurezza e controllo si consiglia la creazione di un utente specifico per il monitoraggio:

grant select on performance_schema.* to zabbix_monitor@'%'; grant process on *.* to zabbix_monitor@'%'; set password for zabbix_monitor@'%'=password('my_strong_password');

PostgreSQL

Il Template di controlli per PostgreSQL non e' fornito con i template di default di Zabbix. In rete si trovano diversi template, dal diverso funzionamento. Questo documento descrive l'installazione del template pgCayenne PostgreSQL disponibile su GitHub in zabbix-community-repos che e' un'ottima sorgente di template [NdE la versione piu' recente e' pubblicata su GitHub]. Abbiamo scelto questo template in quanto vengono monitorate di base le principali e piu' significative metriche di Postgres, perche' utilizza Items di tipo Zabbix Agent, e perche' utilizza SOLO il comando psql (standard PostgreSQL client utility). Questo aspetto rende semplice qualunque personalizzazione, modifica o aggiunta di nuove funzionalita' al template stesso.

Attenzione: questo template utilizza per alcuni check le extensions pg_buffercache e pg_stat_statements. Si consiglia l'installazione di queste extensions sui database da monitorare poiche' consentono l'estrazione di metriche molto significative.

Scaricare quindi il template (.xml) e il file di configurazione dell'agente (.conf).

Configurazione Server Zabbix

Importare il Template in Zabbix.

Editare coerentemente tutte le MACRO del template: In modo particolare prestare attenzione alla MACRO {$PG_CONNINFO} che contiene i parametri che verranno passati a psql in fase di connessione al Database.

E' ora sufficiente andare in configurazione host, selezionare l'host che ospita il Database PostgreSQL da monitorare e collegare il Template appena importato all'host stesso.

Configurazione Database Host

Si da per scontata l'installazione dell'agente Zabbix sull'host da monitorare. Verificare che il file di configurazione del demone (zabbix_agentd.conf) contenga la direttiva "Include=/etc/zabbix/zabbix_agentd.d/" (se non presente, aggiungerla ed eventualmente creare opportunamente la dir zabbix_agentd.d). Copiare ora il file di configurazione postgresql.conf in questo path (il file contenente gli userparameter per postgres).

Eseguire il restart dell'agente.

Editare ora il file contenente le regole di accesso di PostgreSQL (pg_hba.conf). Il template utilizza psql e questi non consente l'inserimento della password d'accesso da linea di comando (in modo non interattivo). Il template e' quindi pensato per funzionare con un'utenza settata in trust:

host    db_production   postgres    127.0.0.1/32    trust

Se per ragioni di sicurezza si vuole evitare un'utenza settata in trust e' possibile una configurazione alternativa. Se il vostro utente e' un utente di sistema e ha una home, create il .pgpass per l'utente, altrimenti create il vostro .pgpass sotto /etc/zabbix

localhost:*:*:zabbix_monitor:my_strong_password

Settare le opportune permission al .pgpass (nell'esempio di seguito settiamo come owner zabbix:zabbix in quanto il nostro utente non e' un utente di sistema):

chown zabbix:zabbix .pgpass 
chmod 600 .pgpass

Se non utilizziamo una utenza di sistema avremo anche necessita' di passare il path del .pgpass file in fase di collegamento al Database. Possiamo farlo settando una variabile d'ambiente:

export PGPASSFILE="/etc/zabbix/.pgpass"

Per rendere l'impostazione persistente al reboot aggiungere in /etc/environment

PGPASSFILE="/etc/zabbix/.pgpass"

Per ragioni di sicurezza e controllo si consiglia la creazione di un utente specifico per il monitoraggio nella base dati:

CREATE USER zabbix_monitor WITH login password 'my_strong_password';
Il monitoraggio per PostgreSQL e' ora attivo su Zabbix.

Oracle

Il Template di controlli per Oracle non e' fornito con i template di default di Zabbix. In rete si trovano diversi template realizzati con tecniche differenti. Alcuni di essi sono template che usano controlli di tipo "Database Monitor" (via unixODBC). Se volete utilizzare un template di questo tipo occorre prima di tutto aver abilitato (in fase di compilazione di Zabbix) i check via ODBC, e poi occorre configurare opportunamente unixODBC in base ai Database che si vuole monitorare. Fatto questo, importate il Template, collegatelo all'host interessato e il gioco e' fatto.

Questo documento descrive invece l'installazione del template PYORA per Oracle. Questo Template utilizza Items di tipo External Check, puo' essere eseguito sia sul Server Zabbix che sull'host monitorato, semplificando l'installazione e la configurazione. Si basa su uno script in python, questo aspetto rende semplice la personalizzazione, modifica o aggiunta di nuove funzionalita' al template stesso.

I pre-requisiti dello script sono: python 2.6 o 2.7, cx-Oracle==5.1.2 e python-argparse.

Configurazione Server Zabbix

Importare il Template in Zabbix. Installare i prerequisiti python. Accertarsi che il file di configurazione di Zabbix Server (zabbix_server.conf) contenga la direttiva relativa al path che contiene gli external scripts (Eg. ExternalScripts=/etc/zabbix/externalscripts). Copiare pyora.py nel path settato per gli external scripts e settare opportunamente le permission la file.

Editare ora il template e creare le seguenti MACRO assegnado valori coerenti al vostro Database Oracle: {$ADDRESS}, {$DATABASE}, {$USERNAME}, {$PASSWORD}.

Attenzione, non potrete utilizzare direttamente lo script python da Zabbix. Per far funzionare tutto dovrete scrivervi un semplice wrapper in bash.

Configurazione Database Host

Visto che si tratta di un Template basato su External Check, sul nodo che ospita il Database target non e' necessaria alcuna configurazione e' sufficiente la creazione di un utente.

Si consiglia la creazione di un utente specifico per il monitoraggio:

CREATE USER ZABBIX_MONITOR IDENTIFIED BY DEFAULT TABLESPACE SYSTEM TEMPORARY TABLESPACE TEMP PROFILE DEFAULT ACCOUNT UNLOCK; GRANT CONNECT TO ZABBIX_MONITOR; GRANT RESOURCE TO ZABBIX_MONITOR; ALTER USER ZABBIX_MONITOR DEFAULT ROLE ALL; GRANT SELECT ANY TABLE TO ZABBIX_MONITOR; GRANT CREATE SESSION TO ZABBIX_MONITOR; GRANT SELECT ANY DICTIONARY TO ZABBIX_MONITOR; GRANT UNLIMITED TABLESPACE TO ZABBIX_MONITOR; GRANT SELECT ANY DICTIONARY TO ZABBIX_MONITOR; GRANT SELECT ON V_$SESSION TO ZABBIX_MONITOR; GRANT SELECT ON V_$SYSTEM_EVENT TO ZABBIX_MONITOR; GRANT SELECT ON V_$EVENT_NAME TO ZABBIX_MONITOR; GRANT SELECT ON V_$RECOVERY_FILE_DEST TO ZABBIX_MONITOR;

MongoDB

Il Template di controlli per MongoDB non e' fornito con i template di default di Zabbix. Questo documento descrive l'installazione del template Mikoomi per MongoDB. Abbiamo scelto questo template in quanto vengono monitorate di base le principali e piu' significative metriche di MongoDB. Questo Template utilizza Items di tipo Zabbix Trapper, puo' essere eseguito sia sul Server Zabbix che sull'host monitorato. Si basa su uno script in php, questo aspetto rende semplice qualunque personalizzazione, modifica o aggiunta di nuove funzionalita' al template stesso.

I pre-requisiti sono: PHP5 e il driver PHP per MongoDB.

Configurazione Server Zabbix

Importare il Template in Zabbix. Installare i prerequisiti PHP. Accertarsi che il file di configurazione di Zabbix Server (zabbix_server.conf) contenga la direttiva relativa al path che contiene gli external scripts (Eg. ExternalScripts=/etc/zabbix/externalscripts). Copiare mikoomi-mongodb-plugin.php e mikoomi-mongodb-plugin.sh nel path settato per gli external scripts e settare opportunamente le permission ai file.

Editare il crontab dell'utente zabbix (crontab -u zabbix -e) e inserire una riga di questo tipo in base alle proprie esigenze:

* * * * * /etc/zabbix/externalscripts/mikoomi-mongodb-plugin.sh -h $DB_HOST -p $DB_PORT -u $DB_USER -x $DB_PASS -H $Z_SERVER -P $Z_PORT -z $Z_HOST

In questo esempio lo script verra' eseguito ogni minuto. Visto che si tratta di Items di tipo Zabbix Trapper, il server e' sempre in ascolto. La cadenza dei controlli quindi viene decisa in base all'esecuzione dello script.

Configurazione Database Host

Sul Database target non dovrete fare altro che creare un'utenza con sufficienti privilegi per poter eseguire il monitoraggio.

Varie ed Eventuali

Le integrazioni di Zabbix sono riportate su questa pagina del sito ufficiale.

Come descrizione generale sui database possono essere utili i seguenti documenti: Introduzione a MySQL, Introduzione a PostgreSQL, Introduzione a Oracle, Introduzione a MongoDB, ...
I documenti seguenti sono rivolti al monitoraggio e alle performances, ma anche un poco piu' specialistici: Statistiche prestazionali in Oracle, Statistiche prestazionali in PostgreSQL, Configurazione e tuning di MySQL, Oracle DBA SQL scripts, MySQL DBA SQL scripts, PostgreSQL DBA SQL scripts, ...

Le diverse versioni di Zabbix [NdA ed anche dei principali database] sono riportate in questo utile documento.


Titolo: Monitorare i database con Zabbix
Livello: Avanzato (3/5)
Data: 21 Settembre 2015
Versione: 1.0.1 - 1 Novembre 2015
Autore: mail [AT] meo.bogliolo.name, cristiano.merla [AT] xenialab.it