ClusterControl přichází s řadou charakteristických výstrah (nebo alarmů), které v jiných monitorovacích systémech nenajdete. ClusterControl chápe topologii databázového klastru jako celek – všechny databázové uzly a vztahy mezi nimi, včetně závislých uzlů nebo klastrů, jako je slave cluster, reverzní proxy a uzly arbitrátoru. ClusterControl je například schopen detekovat a hlásit rozdělený cluster, časový posun mezi všemi uzly v clusteru, selhání obnovení clusteru, selhání replikace mezi clustery a mnoho dalších alarmů specifických pro celý cluster. Bylo by tedy skvělé, kdybychom mohli integrovat alarmy ClusterControl s jakýmkoli existujícím monitorovacím nebo stránkovacím systémem založeným na SNMP.
V této sérii blogů předvedeme důkaz konceptu, jak integrovat ClusterControl s protokolem SNMP. Na konci série blogů bychom nakonec byli schopni poslat SNMP past správci SNMP (Nagios, Zabbix atd.). V této části se budeme zabývat následujícími částmi:
- MIB (definice objektu SNMP)
- Agent SNMP (hlášení)
Architektura
V tomto příkladu máme jako správce SNMP server Nagios se serverem ClusterControl (agent SNMP) monitorujícím 3uzlový cluster Galera, jak je znázorněno na následujícím diagramu:
Všechny pokyny v tomto příspěvku jsou založeny na CentOS 7.
Instalace SNMP na server ClusterControl
1) Nainstalujte balíčky související s SNMP:
$ yum -y install net-snmp net-snmp-perl net-snmp-utils perl-Net-SNMP perl-CPAN
2) Ujistěte se, že obsah /etc/snmp/snmpd.conf má následující:
$ 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
Trochu vysvětlení:
-
MIB několika z nich je soukromá komponenta, proto musíme povolit pouze naši síť, 192.168.10.0/16 a localhost k dotazování na data SNMP. Definujeme to v sekci "com2sec".
-
Potom vytvoříme bezpečnostní skupinu s názvem "myGroup", která povoluje pouze připojení ze sítě "mynet" a přijímá protokol SNMP verze 2c.
-
Poté definujeme pohled (to, co lze vidět od žadatele). "all" znamená, že žadatel SNMP může vidět vše (od OID .1). "systemview" je omezeno pouze na bezpečné veřejně přístupné informace, jako je název hostitele, datum a čas atd., což je výchozí nastavení pro veřejné uživatele SNMP.
-
Potom umožníme "mojeskupině" mít zobrazení "vše".
3) Restartujte službu SNMP, aby se načetly změny:
$ systemctl restart snmpd
4) Nyní byste měli být schopni vidět některé MIB, pokud provedeme 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
Instalace ClusterControl MIB na server ClusterControl
MIB je zkratka pro Management Information Base. Jedná se o formátovaný textový soubor, který uvádí datové objekty používané konkrétním zařízením SNMP. Bez MIB nelze OID používané SNMP přeložit na „věc“. Definice SNMP MIB jsou napsány ve stručném formátu MIB v souladu s RFC 1212. Několik ninek má své vlastní soukromé podnikové číslo (PEN), 57397. Registrovanou databázi podnikových čísel můžete zkontrolovat zde.
1) Zkopírujte soubor SEVERALNINES-CLUSTERCONTROL-MIB.txt a vložte jej do /usr/share/snmp/mibs. Chcete-li zkontrolovat, kterou cestu MIB bude SNMP hledat, použijte tento příkaz:
$ net-snmp-config --default-mibdirs
2) K načtení našeho vlastního MIB musíme vytvořit nový konfigurační soubor na /etc/snmp/snmp.conf (upozornění bez "d") a přidat následující řádek:
mibs +SEVERALNINES-CLUSTERCONTROL-MIB
3) Přidejte následující řádek do /etc/sysconfig/snmpd, abyste umožnili vzdálený přístup ke službě SNMP:
OPTIONS="-Lsd -Lf /dev/null -p /var/run/snmpd.pid -a"
4) Restartujte démona SNMP pro načtení změny:
$ systemctl restart snmpd
5) Chcete-li zjistit, zda je MIB načten správně, použijte příkaz 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)
Výše uvedený výstup ukazuje, že jsme nahráli MIB našeho ClusterControl. Pro tento důkaz konceptu máme pouze jednu hlavní komponentu zvanou „alarmy“ a pod ní máme 3 dílčí komponenty vedle jejich datového typu:
-
alarmSummary – Přehled alarmů. Zobrazuje pouze kritické, varování a odpovídající ID clusteru.
-
alarmSummaryGroup – seskupení našich objektů SNMP.
-
alarmNotification – Toto je pro definici SNMP trapu. Bez toho náš SNMP trap nebude pro správce SNMP srozumitelný.
Číslování vedle označuje identifikátor objektu (OID). Například totalWarning OID je .1.3.6.1.4.1.57397.1.1.1.3 a kritické AlarmNotification OID je .1.3.6.1.4.1.57397.1.1.3.1. U soukromých organizací OID vždy začíná „.1.3.6.1.4.1“, za kterým následuje podnikové číslo (57397 je PEN několika ninů) a poté objekty MIB.
Instalace agenta SNMP na server ClusterControl
Abychom „obsluhovali“ výstup objektu SNMP (počet kritických alarmů, id clusteru atd.), musíme démona SNMP rozšířit o SNMP agenta. V SNMP nazývají tento protokol jako AgentX, který jsme definovali v snmpd.conf v této sekci:
master agentx
Pro tento důkaz konceptu jsem připravil skript napsaný v Perlu pro načtení a nahlášení souhrnu alarmu do formátu SNMP/OID.
1) Nainstalujte komponentu Perl SNMP:
$ yum install perl-Net-SNMP
2) Umístěte clustercontrol-snmp-agent.pl kamkoli, kam má proces SNMP přístup. Doporučuje se umístit jej do adresáře /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) Ve skriptu nakonfigurujte následující řádky (řádky 14 až 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) Nastavte skriptu oprávnění ke spuštění:
$ chmod 755 /usr/share/snmp/clustercontrol-snmp-agent.pl
5) Spusťte skript:
$ perl /usr/share/snmp/clustercontrol-snmp-agent.pl
NET-SNMP version 5.7.2 AgentX subagent connected
Ujistěte se, že vidíte řádek „subagent připojen“. V tomto okamžiku by měl být alarm ClusterControl správně hlášen prostřednictvím protokolu SNMP. Pro kontrolu jednoduše použijte příkaz snmpwalk a spusťte jej ze vzdáleného serveru, například ze serveru Nagios (snmpwalk poskytuje balíček 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
Alternativně můžete také místo toho použít název objektu MIB, což vede ke stejnému výsledku:
$ 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
Poslední myšlenky
Toto je jen velmi jednoduchý proof-of-concept (PoC) o tom, jak lze ClusterControl integrovat s protokolem SNMP. V další epizodě se podíváme na odesílání SNMP trapů ze serveru ClusterControl do správce SNMP, jako je Nagios, Zabbix nebo Sensu.