ClusterControl wordt geleverd met een aantal onderscheidende waarschuwingen (of alarmen) die u niet in andere bewakingssystemen zult vinden. ClusterControl begrijpt een databaseclustertopologie als geheel - alle databaseknooppunten en de relatie daartussen, inclusief de afhankelijke knooppunten of clusters zoals slavecluster, reverse-proxy en arbiterknooppunten. ClusterControl kan bijvoorbeeld een gepartitioneerd cluster detecteren en rapporteren, tijdafwijking tussen alle knooppunten in het cluster, clusterherstelfouten, cluster-naar-cluster replicatiefouten en nog veel meer clusterbrede specifieke alarmen. Daarom zou het geweldig zijn als we ClusterControl-alarmen zouden kunnen integreren met elk bestaand SNMP-gebaseerd monitoring- of pagingsysteem.
In deze blogserie gaan we een proof-of-concept laten zien over hoe je ClusterControl kunt integreren met het SNMP-protocol. Aan het einde van de blogreeks zouden we uiteindelijk een SNMP-trap naar een SNMP-manager (Nagios, Zabbix, enz.) kunnen sturen. In dit deel gaan we de volgende delen behandelen:
- MIB (SNMP-objectdefinitie)
- SNMP-agent (rapportage)
Architectuur
In dit voorbeeld hebben we een Nagios-server als SNMP-manager, met een ClusterControl-server (SNMP-agent) die een Galera-cluster met 3 knooppunten bewaakt, zoals geïllustreerd in het volgende diagram:
Alle instructies in dit bericht zijn gebaseerd op CentOS 7.
SNMP installeren op de ClusterControl-server
1) Installeer SNMP-gerelateerde pakketten:
$ yum -y install net-snmp net-snmp-perl net-snmp-utils perl-Net-SNMP perl-CPAN
2) Zorg ervoor dat de inhoud van /etc/snmp/snmpd.conf het volgende heeft:
$ 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
Een beetje uitleg:
-
Severalnines's MIB is een privécomponent, daarom moeten we alleen ons netwerk toestaan, 192.168.10.0/16 en localhost om de SNMP-gegevens op te vragen. We definiëren dit in de sectie "com2sec".
-
Vervolgens maken we een beveiligingsgroep met de naam "myGroup", die alleen verbindingen van het "mynet"-netwerk toestaat, en accepteert protocol SNMP versie 2c.
-
Vervolgens definiëren we de weergave (wat te zien is aan de aanvrager). "all" betekent dat de SNMP-aanvrager alles kan zien (vanaf OID .1). "systemview" is alleen beperkt tot veilig-naar-openbare informatie zoals hostnaam, datumtijd, enz., wat de standaard is voor openbare SNMP-gebruikers.
-
Vervolgens geven we "myGroup" een "all"-weergave.
3) Start de SNMP-service opnieuw om de wijzigingen te laden:
$ systemctl restart snmpd
4) Nu zou je enkele MIB's moeten kunnen zien als we snmpwalk uitvoeren:
$ snmpwalk -v2c -cpublic localhost # should return limited entries
$ snmpwalk -v2c -cprivate localhost # should return thousands of entries because the private view starts with .1
ClusterControl MIB's installeren op de ClusterControl-server
MIB staat voor Management Information Base. Het is een opgemaakt tekstbestand dat de gegevensobjecten vermeldt die door een bepaald stuk SNMP-apparatuur worden gebruikt. Zonder MIB kan de door SNMP gebruikte OID niet worden vertaald in een "ding". De SNMP MIB-definities zijn geschreven in beknopt MIB-formaat in overeenstemming met RFC 1212. Verscheidene negens heeft een eigen Private Enterprise Number (PEN), 57397. U kunt de database met geregistreerde ondernemingsnummers hier raadplegen.
1) Kopieer de SEVERALNINES-CLUSTERCONTROL-MIB.txt en plaats deze onder /usr/share/snmp/mibs. Gebruik deze opdracht om te controleren naar welk MIB-pad SNMP zou zoeken:
$ net-snmp-config --default-mibdirs
2) Om onze aangepaste MIB te laden, moeten we een nieuw configuratiebestand maken in /etc/snmp/snmp.conf (let op zonder de "d") en de volgende regel toevoegen:
mibs +SEVERALNINES-CLUSTERCONTROL-MIB
3) Voeg de volgende regel toe in /etc/sysconfig/snmpd om toegang op afstand tot de SNMP-service toe te staan:
OPTIONS="-Lsd -Lf /dev/null -p /var/run/snmpd.pid -a"
4) Start de SNMP-daemon opnieuw om de wijziging te laden:
$ systemctl restart snmpd
5) Gebruik het commando snmptranslate om te zien of de MIB correct is geladen:
$ 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)
De bovenstaande uitvoer laat zien dat we de MIB van onze ClusterControl hebben geladen. Voor deze proof-of-concept hebben we slechts één hoofdcomponent genaamd "alarmen", en daaronder hebben we 3 subcomponenten naast hun datatype:
-
alarmSummary - Samenvatting van alarmen. Toont alleen kritiek, waarschuwing en de bijbehorende cluster-ID.
-
alarmSummaryGroup - Groepering van onze SNMP-objecten.
-
alarmNotification - Dit is voor SNMP-trapdefinitie. Zonder dit is onze SNMP-trap niet begrijpelijk voor de SNMP-manager.
De nummering ernaast geeft de object-ID (OID) aan. TotalWarning OID is bijvoorbeeld .1.3.6.1.4.1.57397.1.1.1.3 en criticalAlarmNotification OID is .1.3.6.1.4.1.57397.1.1.3.1. Voor particuliere organisaties begint OID altijd met ".1.3.6.1.4.1", gevolgd door het ondernemingsnummer (57397 is de PEN van Meerderenines) en vervolgens de MIB-objecten.
De SNMP-agent installeren op de ClusterControl-server
Om de uitvoer van het SNMP-object (het aantal kritieke alarmen, cluster-ID enzovoort) te "bedienen", moeten we de SNMP-daemon uitbreiden met een SNMP-agent. In SNMP noemen ze dit protocol AgentX, wat we hebben gedefinieerd in snmpd.conf onder deze sectie:
master agentx
Voor deze proof-of-concept heb ik een script opgesteld dat in Perl is geschreven om de samenvatting van het alarm op te halen en te rapporteren in SNMP/OID-indeling.
1) Perl SNMP-component installeren:
$ yum install perl-Net-SNMP
2) Plaats clustercontrol-snmp-agent.pl overal waar het SNMP-proces toegankelijk is. Het wordt aanbevolen om het in de map /usr/share/snmp te plaatsen.
$ 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) Configureer de volgende regels in het script (regel 14 tot 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) Stel het script in met uitvoerbare toestemming:
$ chmod 755 /usr/share/snmp/clustercontrol-snmp-agent.pl
5) Voer het script uit:
$ perl /usr/share/snmp/clustercontrol-snmp-agent.pl
NET-SNMP version 5.7.2 AgentX subagent connected
Zorg ervoor dat u de regel "subagent connected" ziet. Op dit punt moet het ClusterControl-alarm correct worden gerapporteerd via het SNMP-protocol. Om dit te controleren, gebruikt u eenvoudig de opdracht snmpwalk en voert u deze uit vanaf een externe server, bijvoorbeeld vanaf de Nagios-server (snmpwalk wordt geleverd door het pakket 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
Als alternatief kunt u in plaats daarvan ook de MIB-objectnaam gebruiken, wat hetzelfde resultaat oplevert:
$ 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
Laatste gedachten
Dit is slechts een zeer eenvoudige proof-of-concept (PoC) over hoe ClusterControl kan worden geïntegreerd met het SNMP-protocol. In de volgende aflevering gaan we kijken naar het verzenden van SNMP-traps van de ClusterControl-server naar de SNMP-manager zoals Nagios, Zabbix of Sensu.