ClusterControl zawiera szereg charakterystycznych alertów (lub alarmów), których nie znajdziesz w innych systemach monitorowania. ClusterControl rozumie topologię klastra bazy danych jako całość — wszystkie węzły bazy danych i relacje między nimi, w tym węzły zależne lub klastry, takie jak klaster podrzędny, węzły odwrotnego proxy i węzły arbitra. Na przykład ClusterControl może wykryć i zgłosić klaster podzielony na partycje, rozbieżność czasu między wszystkimi węzłami w klastrze, awarię odzyskiwania klastra, awarię replikacji klastra do klastra i wiele innych alarmów specyficznych dla całego klastra. Dlatego byłoby wspaniale, gdybyśmy mogli zintegrować alarmy ClusterControl z dowolnym istniejącym systemem monitorowania lub przywołania opartym na SNMP.
W tej serii blogów pokażemy, jak zintegrować ClusterControl z protokołem SNMP. Pod koniec serii blogów, ostatecznie będziemy mogli wysłać pułapkę SNMP do menedżera SNMP (Nagios, Zabbix, itp.). W tej części omówimy następujące części:
- MIB (definicja obiektu SNMP)
- Agent SNMP (raportowanie)
Architektura
W tym przykładzie mamy serwer Nagios jako menedżera SNMP, z serwerem ClusterControl (agent SNMP) monitorującym 3-węzłowy klaster Galera, jak pokazano na poniższym diagramie:
Wszystkie instrukcje w tym poście są oparte na CentOS 7.
Instalacja SNMP na serwerze ClusterControl
1) Zainstaluj pakiety związane z SNMP:
$ yum -y install net-snmp net-snmp-perl net-snmp-utils perl-Net-SNMP perl-CPAN
2) Upewnij się, że zawartość /etc/snmp/snmpd.conf zawiera następujące elementy:
$ 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
Trochę wyjaśnienia:
-
MIB Severalnines jest komponentem prywatnym, dlatego musimy zezwolić tylko na naszą sieć, 192.168.10.0/16 i localhost do wysyłania zapytań o dane SNMP. Definiujemy to w sekcji „com2sec”.
-
Następnie tworzymy grupę bezpieczeństwa o nazwie "myGroup", która zezwala tylko na połączenia z sieci "mynet" i akceptuje protokół SNMP w wersji 2c.
-
Następnie definiujemy widok (co widać z requestera). „all” oznacza, że requester SNMP może zobaczyć wszystko (zaczynając od OID .1). "systemview" ogranicza się tylko do bezpiecznych dla publicznych informacji, takich jak nazwa hosta, data i godzina itp., które są domyślne dla publicznych użytkowników SNMP.
-
Potem zezwalamy grupie „myGroup” na widok „wszystkie”.
3) Uruchom ponownie usługę SNMP, aby załadować zmiany:
$ systemctl restart snmpd
4) Teraz powinieneś być w stanie zobaczyć niektóre MIB-y, jeśli wykonamy 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
Instalowanie ClusterControl MIB na serwerze ClusterControl
MIB to skrót od Management Information Base. Jest to sformatowany plik tekstowy, który zawiera listę obiektów danych używanych przez określone urządzenie SNMP. Bez MIB, OID używany przez SNMP nie może zostać przetłumaczony na "rzecz". Definicje SNMP MIB są napisane w zwięzłym formacie MIB zgodnie z RFC 1212. Manynines ma swój własny numer przedsiębiorstwa prywatnego (PEN), 57397. Tutaj możesz sprawdzić bazę danych zarejestrowanych numerów przedsiębiorstwa.
1) Skopiuj SEVERALNINES-CLUSTERCONTROL-MIB.txt i umieść go w /usr/share/snmp/mibs. Aby sprawdzić, jakiej ścieżki MIB szuka SNMP, użyj tego polecenia:
$ net-snmp-config --default-mibdirs
2) Aby załadować nasz niestandardowy MIB, musimy utworzyć nowy plik konfiguracyjny w /etc/snmp/snmp.conf (uwaga bez „d”) i dodać następujący wiersz:
mibs +SEVERALNINES-CLUSTERCONTROL-MIB
3) Dodaj następujący wiersz w /etc/sysconfig/snmpd, aby umożliwić zdalny dostęp do usługi SNMP:
OPTIONS="-Lsd -Lf /dev/null -p /var/run/snmpd.pid -a"
4) Zrestartuj demona SNMP, aby załadować zmiany:
$ systemctl restart snmpd
5) Aby sprawdzić, czy MIB jest poprawnie załadowany, użyj polecenia 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)
Powyższe dane wyjściowe pokazują, że załadowaliśmy MIB naszego ClusterControl. W przypadku tej weryfikacji koncepcji mamy tylko jeden główny komponent zwany „alarmami”, a pod nim mamy 3 podkomponenty wraz z ich typem danych:
-
alarmSummary - Podsumowanie alarmów. Pokazuje tylko krytyczne, ostrzeżenie i odpowiedni identyfikator klastra.
-
alarmSummaryGroup - Grupowanie naszych obiektów SNMP.
-
alarmNotification — służy do definicji pułapki SNMP. Bez tego nasza pułapka SNMP nie będzie zrozumiała dla menedżera SNMP.
Numeracja obok wskazuje identyfikator obiektu (OID). Na przykład OID totalWarning to .1.3.6.1.4.1.57397.1.1.1.3, a OID CriticalAlarmNotification to .1.3.6.1.4.1.57397.1.1.3.1. W przypadku organizacji prywatnych identyfikator OID zawsze zaczyna się od „.1.3.6.1.4.1”, po którym następuje numer przedsiębiorstwa (57397 to PEN Manynines), a następnie obiekty MIB.
Instalowanie agenta SNMP na serwerze ClusterControl
Aby "obsługiwać" dane wyjściowe obiektu SNMP (liczba alarmów krytycznych, identyfikator klastra itd.), musimy rozszerzyć demona SNMP o agenta SNMP. W SNMP nazywają ten protokół AgentX, który zdefiniowaliśmy w snmpd.conf w tej sekcji:
master agentx
W celu sprawdzenia koncepcji przygotowałem skrypt napisany w Perlu do pobierania i raportowania podsumowania alarmu w formacie SNMP/OID.
1) Zainstaluj komponent Perl SNMP:
$ yum install perl-Net-SNMP
2) Umieść clustercontrol-snmp-agent.pl w dowolnym miejscu dostępnym dla procesu SNMP. Zaleca się umieszczenie go w katalogu /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) Skonfiguruj następujące wiersze wewnątrz skryptu (wiersze od 14 do 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) Ustaw skrypt z uprawnieniami do wykonywania:
$ chmod 755 /usr/share/snmp/clustercontrol-snmp-agent.pl
5) Uruchom skrypt:
$ perl /usr/share/snmp/clustercontrol-snmp-agent.pl
NET-SNMP version 5.7.2 AgentX subagent connected
Upewnij się, że widzisz wiersz „podagent podłączony”. W tym momencie alarm ClusterControl powinien być poprawnie zgłaszany przez protokół SNMP. Aby to sprawdzić, po prostu użyj polecenia snmpwalk i wykonaj je ze zdalnego serwera, na przykład z serwera Nagios (snmpwalk jest dostarczany przez pakiet 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
Alternatywnie możesz również użyć zamiast tego nazwy obiektu MIB, co daje ten sam wynik:
$ 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
Ostateczne myśli
To jest tylko bardzo prosty dowód koncepcji (PoC) dotyczący integracji ClusterControl z protokołem SNMP. W następnym odcinku przyjrzymy się wysyłaniu pułapek SNMP z serwera ClusterControl do menedżera SNMP, takiego jak Nagios, Zabbix lub Sensu.