ClusterControl viene fornito con una serie di avvisi (o allarmi) distintivi che non troverai in altri sistemi di monitoraggio. ClusterControl comprende la topologia di un cluster di database nel suo insieme:tutti i nodi di database e la relazione tra loro, inclusi i nodi dipendenti o i cluster come i nodi di cluster slave, proxy inverso e arbitro. Ad esempio, ClusterControl è in grado di rilevare e segnalare un cluster partizionato, spostamenti temporali tra tutti i nodi del cluster, errori di ripristino del cluster, errori di replica da cluster a cluster e molti altri allarmi specifici a livello di cluster. Pertanto, sarebbe fantastico se potessimo integrare gli allarmi ClusterControl con qualsiasi sistema di monitoraggio o paging basato su SNMP esistente.
In questa serie di blog, presenteremo un proof of concept su come integrare ClusterControl con il protocollo SNMP. Alla fine della serie di blog, alla fine saremmo in grado di inviare una trap SNMP a un manager SNMP (Nagios, Zabbix, ecc.). In questa parte, tratteremo le seguenti parti:
- MIB (definizione oggetto SNMP)
- Agente SNMP (report)
Architettura
In questo esempio, abbiamo un server Nagios come gestore SNMP, con un server ClusterControl (agente SNMP) che monitora un cluster Galera a 3 nodi come illustrato nel diagramma seguente:
Tutte le istruzioni in questo post sono basate su CentOS 7.
Installazione di SNMP sul server ClusterControl
1) Installare i pacchetti relativi a SNMP:
$ yum -y install net-snmp net-snmp-perl net-snmp-utils perl-Net-SNMP perl-CPAN
2) Assicurati che il contenuto di /etc/snmp/snmpd.conf abbia quanto segue:
$ grep -v '^\s*$\|^\s*\#' /etc/snmp/snmpd.conf
com2sec notConfigUser default public
com2sec mynet 192.168.10.0/16 private
com2sec mynet localhost private
group notConfigGroup v1 notConfigUser
group notConfigGroup v2c notConfigUser
group myGroup v2c mynet
view all included .1
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.25.1.1
access notConfigGroup "" any noauth exact systemview none none
access myGroup "" any noauth exact all all none
master agentx
syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root <[email protected]> (configure /etc/snmp/snmp.local.conf)
dontLogTCPWrappersConnects yes
Un po' di spiegazione:
-
Il MIB di Severalnines è un componente privato, quindi dobbiamo consentire solo la nostra rete, 192.168.10.0/16 e localhost per interrogare i dati SNMP. Lo definiamo nella sezione "com2sec".
-
Quindi creiamo un gruppo di sicurezza chiamato "myGroup", che consente solo connessioni dalla rete "mynet", e accetta il protocollo SNMP versione 2c.
-
Poi definiamo la vista (cosa può essere vista dal richiedente). "tutto" significa che il richiedente SNMP può vedere tutto (a partire da OID .1). "systemview" è limitato solo a informazioni sicure per il pubblico come nome host, data e ora, ecc., che è l'impostazione predefinita per gli utenti SNMP pubblici.
-
Allora consentiamo a "myGroup" di avere una vista "tutti".
3) Riavvia il servizio SNMP per caricare le modifiche:
$ systemctl restart snmpd
4) Ora dovresti essere in grado di vedere alcuni MIB se eseguiamo snmpwalk:
$ snmpwalk -v2c -cpublic localhost # should return limited entries
$ snmpwalk -v2c -cprivate localhost # should return thousands of entries because the private view starts with .1
Installazione dei MIB ClusterControl sul server ClusterControl
MIB sta per Management Information Base. Si tratta di un file di testo formattato che elenca gli oggetti dati utilizzati da un particolare dispositivo SNMP. Senza MIB, l'OID utilizzato da SNMP non può essere tradotto in una "cosa". Le definizioni SNMP MIB sono scritte in un formato MIB conciso in conformità con RFC 1212. Diversinines ha il proprio numero di impresa privata (PEN), 57397. Puoi controllare il database del numero di impresa registrato qui.
1) Copia il SEVERALNINES-CLUSTERCONTROL-MIB.txt e mettilo in /usr/share/snmp/mibs. Per verificare quale percorso MIB cercherà SNMP, utilizzare questo comando:
$ net-snmp-config --default-mibdirs
2) Per caricare il nostro MIB personalizzato, dobbiamo creare un nuovo file di configurazione in /etc/snmp/snmp.conf (avviso senza la "d") e aggiungere la seguente riga:
mibs +SEVERALNINES-CLUSTERCONTROL-MIB
3) Aggiungi la seguente riga all'interno di /etc/sysconfig/snmpd per consentire l'accesso remoto al servizio SNMP:
OPTIONS="-Lsd -Lf /dev/null -p /var/run/snmpd.pid -a"
4) Riavvia il demone SNMP per caricare la modifica:
$ systemctl restart snmpd
5) Per vedere se il MIB è caricato correttamente, utilizzare il comando snmptranslate:
$ snmptranslate -IR -On -Tp severalnines
+--severalnines(57397)
|
+--clustercontrolMIB(1)
|
+--alarms(1)
|
+--alarmSummary(1)
| |
| +-- -R-- Integer32 totalAlarms(1)
| | Range: 0..2147483647
| +-- -R-- Integer32 totalCritical(2)
| | Range: 0..2147483647
| +-- -R-- Integer32 totalWarning(3)
| | Range: 0..2147483647
| +-- -R-- Integer32 clusterId(4)
| Range: 0..2147483647
|
+--alarmSummaryGroup(2)
|
+--alarmNotification(3)
|
+--criticalAlarmNotification(1)
+--criticalAlarmNotificationEnded(2)
L'output sopra mostra che abbiamo caricato il MIB del nostro ClusterControl. Per questa prova di concetto, abbiamo solo un componente principale chiamato "allarmi" e sotto di esso abbiamo 3 sottocomponenti accanto al loro tipo di dati:
-
alarmSummary - Riepilogo allarmi. Mostra solo critico, avviso e l'ID cluster corrispondente.
-
alarmSummaryGroup - Raggruppamento dei nostri oggetti SNMP.
-
alarmNotification - Questo è per la definizione di trap SNMP. Senza questo, la nostra trap SNMP non sarà comprensibile dal gestore SNMP.
La numerazione accanto indica l'identificatore dell'oggetto (OID). Ad esempio, totalWarning OID è .1.3.6.1.4.1.57397.1.1.1.3 e criticalAlarmNotification OID è .1.3.6.1.4.1.57397.1.1.3.1. Per le organizzazioni private, l'OID inizia sempre con ".1.3.6.1.4.1", seguito dal numero dell'impresa (57397 è la PEN di Diversinines) e poi dagli oggetti MIB.
Installazione dell'agente SNMP sul server ClusterControl
Per "servire" l'output dell'oggetto SNMP (il numero di allarmi critici, l'ID del cluster e così via), è necessario estendere il demone SNMP con un agente SNMP. In SNMP, chiamano questo protocollo AgentX, che abbiamo definito in snmpd.conf in questa sezione:
master agentx
Per questa prova di concetto, ho preparato uno script scritto in Perl per recuperare e riportare il riepilogo dell'allarme nella formattazione SNMP/OID.
1) Installare il componente SNMP Perl:
$ yum install perl-Net-SNMP
2) Metti clustercontrol-snmp-agent.pl ovunque accessibile dal processo SNMP. Si consiglia di inserirlo nella directory /usr/share/snmp.
$ ls -al /usr/share/snmp/clustercontrol-snmp-agent.pl
-rwxr-xr-x 1 root root 2974 May 10 14:16 /usr/share/snmp/clustercontrol-snmp-agent.pl
3) Configura le seguenti righe all'interno dello script (dalla riga 14 alla riga 17):
my $clusterId = 23; # cluster ID that you want to monitor
my $totalAlarm = `/bin/s9s alarms --list --cluster-id=$clusterId --batch | wc -l`;
my $criticalAlarm = `/bin/s9s alarms --list --cluster-id=$clusterId --batch | grep CRITICAL | wc -l`;
my $warningAlarm = `/bin/s9s alarms --list --cluster-id=$clusterId --batch | grep WARNING | wc -l`;
4) Imposta lo script con autorizzazione eseguibile:
$ chmod 755 /usr/share/snmp/clustercontrol-snmp-agent.pl
5) Esegui lo script:
$ perl /usr/share/snmp/clustercontrol-snmp-agent.pl
NET-SNMP version 5.7.2 AgentX subagent connected
Assicurati di vedere la riga "subagente connesso". A questo punto l'allarme ClusterControl dovrebbe essere segnalato correttamente tramite protocollo SNMP. Per verificare, usa semplicemente il comando snmpwalk ed eseguilo da un server remoto, ad esempio dal server Nagios (snmpwalk è fornito dal pacchetto net-snmp-utils):
$ snmpwalk -v2c -c private 192.168.10.50 .1.3.6.1.4.1.57397.1.1.1
SEVERALNINES-CLUSTERCONTROL-MIB::totalAlarms = INTEGER: 3
SEVERALNINES-CLUSTERCONTROL-MIB::totalCritical = INTEGER: 2
SEVERALNINES-CLUSTERCONTROL-MIB::totalWarning = INTEGER: 1
SEVERALNINES-CLUSTERCONTROL-MIB::clusterId = INTEGER: 23
In alternativa, puoi anche utilizzare il nome dell'oggetto MIB invece che produce lo stesso risultato:
$ snmpwalk -v2c -c private 192.168.10.50 SEVERALNINES-CLUSTERCONTROL-MIB::alarmSummary
SEVERALNINES-CLUSTERCONTROL-MIB::totalAlarms = INTEGER: 3
SEVERALNINES-CLUSTERCONTROL-MIB::totalCritical = INTEGER: 2
SEVERALNINES-CLUSTERCONTROL-MIB::totalWarning = INTEGER: 1
SEVERALNINES-CLUSTERCONTROL-MIB::clusterId = INTEGER: 23
Pensieri finali
Questa è solo una semplicissima proof-of-concept (PoC) su come ClusterControl può essere integrato con il protocollo SNMP. Nel prossimo episodio, esamineremo l'invio di trap SNMP dal server ClusterControl al gestore SNMP come Nagios, Zabbix o Sensu.