ClusterControl viene con una serie de alertas (o alarmas) distintivas que no encontrará en otros sistemas de monitoreo. ClusterControl entiende la topología de un clúster de base de datos como un todo:todos los nodos de la base de datos y la relación entre ellos, incluidos los nodos o clústeres dependientes como el clúster esclavo, el proxy inverso y los nodos árbitros. Por ejemplo, ClusterControl puede detectar e informar un clúster particionado, la desviación de tiempo entre todos los nodos del clúster, fallas en la recuperación del clúster, fallas en la replicación de un clúster a otro y muchas más alarmas específicas para todo el clúster. Por lo tanto, sería genial si pudiéramos integrar las alarmas de ClusterControl con cualquier sistema de localización o monitoreo basado en SNMP existente.
En esta serie de blogs, mostraremos una prueba de concepto sobre cómo integrar ClusterControl con el protocolo SNMP. Al final de la serie de blogs, finalmente podremos enviar una trampa SNMP a un administrador SNMP (Nagios, Zabbix, etc.). En esta parte, vamos a cubrir las siguientes partes:
- MIB (definición de objeto SNMP)
- Agente SNMP (informes)
Arquitectura
En este ejemplo, tenemos un servidor Nagios como administrador SNMP, con un servidor ClusterControl (agente SNMP) monitoreando un clúster Galera de 3 nodos como se ilustra en el siguiente diagrama:

Todas las instrucciones de esta publicación se basan en CentOS 7.
Instalación de SNMP en el servidor de ClusterControl
1) Instalar paquetes relacionados con SNMP:
$ yum -y install net-snmp net-snmp-perl net-snmp-utils perl-Net-SNMP perl-CPAN
2) Asegúrese de que el contenido de /etc/snmp/snmpd.conf tenga lo siguiente:
$ 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 poco de explicación:
-
La MIB de Variosnines es un componente privado, por lo tanto, solo debemos permitir nuestra red, 192.168.10.0/16 y localhost para consultar los datos de SNMP. Esto lo definimos en la sección "com2sec".
-
Luego creamos un grupo de seguridad llamado "myGroup", que solo permite conexiones desde la red "mynet", y acepta el protocolo SNMP versión 2c.
-
Luego definimos la vista (lo que se puede ver desde el solicitante). "todo" significa que el solicitante SNMP puede ver todo (a partir de OID .1). "systemview" solo se limita a información segura para el público, como nombre de host, fecha y hora, etc., que es la predeterminada para los usuarios públicos de SNMP.
-
Luego permitimos que "miGrupo" tenga una vista de "todos".
3) Reinicie el servicio SNMP para cargar los cambios:
$ systemctl restart snmpd
4) Ahora, debería poder ver algunas MIB si realizamos 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
Instalación de MIB de ClusterControl en el servidor de ClusterControl
MIB significa Base de información de gestión. Es un archivo de texto formateado que enumera los objetos de datos utilizados por una pieza particular del equipo SNMP. Sin MIB, el OID utilizado por SNMP no se puede traducir a una "cosa". Las definiciones de MIB de SNMP están escritas en formato MIB conciso de acuerdo con RFC 1212. Variousnines tiene su propio Número de Empresa Privada (PEN), 57397. Puede consultar la base de datos de números de empresas registradas aquí.
1) Copie SEVERALNINES-CLUSTERCONTROL-MIB.txt y colóquelo en /usr/share/snmp/mibs. Para verificar qué ruta MIB buscaría SNMP, use este comando:
$ net-snmp-config --default-mibdirs
2) Para cargar nuestra MIB personalizada, debemos crear un nuevo archivo de configuración en /etc/snmp/snmp.conf (aviso sin la "d") y agregar la siguiente línea:
mibs +SEVERALNINES-CLUSTERCONTROL-MIB
3) Agregue la siguiente línea dentro de /etc/sysconfig/snmpd para permitir el acceso remoto al servicio SNMP:
OPTIONS="-Lsd -Lf /dev/null -p /var/run/snmpd.pid -a"
4) Reinicie el demonio SNMP para cargar el cambio:
$ systemctl restart snmpd
5) Para ver si la MIB se carga correctamente, use el 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)
El resultado anterior muestra que hemos cargado el MIB de nuestro ClusterControl. Para esta prueba de concepto, solo tenemos un componente principal llamado "alarmas" y, debajo, tenemos 3 subcomponentes junto con su tipo de datos:
-
alarmSummary - Resumen de alarmas. Solo muestra crítica, advertencia y el ID de clúster correspondiente.
-
alarmSummaryGroup - Agrupación de nuestros objetos SNMP.
-
alarmNotification:esto es para la definición de trampas SNMP. Sin esto, nuestra trampa SNMP no será comprensible para el administrador de SNMP.
La numeración al lado indica el identificador de objeto (OID). Por ejemplo, el OID de advertencia total es .1.3.6.1.4.1.57397.1.1.1.3 y el OID de notificación de alarma crítica es .1.3.6.1.4.1.57397.1.1.3.1. Para organizaciones privadas, el OID siempre comienza con ".1.3.6.1.4.1", seguido del número de la empresa (57397 es el PEN de Variousnines) y luego los objetos MIB.
Instalación del agente SNMP en el servidor ClusterControl
Para "servir" la salida del objeto SNMP (la cantidad de alarmas críticas, la identificación del clúster, etc.), necesitamos extender el demonio SNMP con un agente SNMP. En SNMP, llaman a este protocolo como AgentX, que hemos definido en snmpd.conf en esta sección:
master agentx
Para esta prueba de concepto, he preparado un script escrito en Perl para recuperar y reportar el resumen de la alarma en formato SNMP/OID.
1) Instale el componente SNMP de Perl:
$ yum install perl-Net-SNMP
2) Coloque clustercontrol-snmp-agent.pl en cualquier lugar accesible por el proceso SNMP. Se recomienda colocarlo en el directorio /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) Configure las siguientes líneas dentro del script (líneas 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) Configure el script con permiso ejecutable:
$ chmod 755 /usr/share/snmp/clustercontrol-snmp-agent.pl
5) Ejecute el script:
$ perl /usr/share/snmp/clustercontrol-snmp-agent.pl
NET-SNMP version 5.7.2 AgentX subagent connected
Asegúrese de ver la línea "subagente conectado". En este punto, la alarma de ClusterControl debe informarse correctamente a través del protocolo SNMP. Para verificar, simplemente use el comando snmpwalk y ejecútelo desde un servidor remoto, por ejemplo, desde el servidor de Nagios (el paquete net-snmp-utils proporciona snmpwalk):
$ 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
Alternativamente, también puede usar el nombre del objeto MIB que produce el mismo resultado:
$ 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
Reflexiones finales
Esta es solo una prueba de concepto (PoC) muy simple sobre cómo se puede integrar ClusterControl con el protocolo SNMP. En el próximo episodio, analizaremos el envío de trampas SNMP desde el servidor ClusterControl al administrador SNMP como Nagios, Zabbix o Sensu.