O ClusterControl vem com vários alertas distintos (ou alarmes) que você não encontrará em outros sistemas de monitoramento. ClusterControl entende uma topologia de cluster de banco de dados como um todo - todos os nós de banco de dados e a relação entre eles, incluindo os nós dependentes ou clusters como cluster escravo, proxy reverso e nós de arbitragem. Por exemplo, o ClusterControl é capaz de detectar e relatar um cluster particionado, desvio de tempo entre todos os nós do cluster, falha de recuperação de cluster, falha de replicação de cluster para cluster e muitos outros alarmes específicos para todo o cluster. Portanto, seria ótimo se pudéssemos integrar os alarmes do ClusterControl com qualquer sistema de monitoramento ou paginação baseado em SNMP existente.
Nesta série de blogs, mostraremos uma prova de conceito sobre como integrar o ClusterControl com o protocolo SNMP. No final da série de blogs, poderíamos enviar uma armadilha SNMP para um gerenciador SNMP (Nagios, Zabbix, etc). Nesta parte, vamos cobrir as seguintes partes:
- MIB (definição de objeto SNMP)
- Agente SNMP (relatórios)
Arquitetura
Neste exemplo, temos um servidor Nagios como gerenciador SNMP, com um servidor ClusterControl (agente SNMP) monitorando um Galera Cluster de 3 nós conforme ilustrado no diagrama a seguir:
Todas as instruções neste post são baseadas no CentOS 7.
Instalando o SNMP no servidor ClusterControl
1) Instale os pacotes relacionados ao SNMP:
$ yum -y install net-snmp net-snmp-perl net-snmp-utils perl-Net-SNMP perl-CPAN
2) Verifique se o conteúdo de /etc/snmp/snmpd.conf tem o seguinte:
$ 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
Um pouco de explicação:
-
O MIB de Severalnines é um componente privado, portanto, precisamos permitir apenas nossa rede, 192.168.10.0/16 e localhost para consultar os dados SNMP. Definimos isso na seção "com2sec".
-
Em seguida, criamos um grupo de segurança chamado "myGroup", que permite apenas conexões da rede "mynet" e aceita o protocolo SNMP versão 2c.
-
Depois definimos a visão (o que pode ser visto do solicitante). "all" significa que o solicitante do SNMP pode ver tudo (a partir de OID .1). "systemview" é limitado apenas a informações seguras para o público, como nome do host, data e hora, etc., que é o padrão para usuários SNMP públicos.
-
Então permitimos que "myGroup" tenha uma visualização "all".
3) Reinicie o serviço SNMP para carregar as alterações:
$ systemctl restart snmpd
4) Agora, você poderá ver alguns MIBs se executarmos 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
Instalando MIBs ClusterControl no servidor ClusterControl
MIB significa Management Information Base. É um arquivo de texto formatado que lista os objetos de dados usados por um determinado equipamento SNMP. Sem MIB, o OID usado pelo SNMP não pode ser traduzido em uma "coisa". As definições SNMP MIB são escritas em formato MIB conciso de acordo com a RFC 1212. A Manynines tem seu próprio Private Enterprise Number (PEN), 57397. Você pode verificar o banco de dados de número de empresa registrado aqui.
1) Copie o arquivo SEVERALNINES-CLUSTERCONTROL-MIB.txt e coloque-o em /usr/share/snmp/mibs. Para verificar qual caminho MIB o SNMP procuraria, use este comando:
$ net-snmp-config --default-mibdirs
2) Para carregar nossa MIB customizada, precisamos criar um novo arquivo de configuração em /etc/snmp/snmp.conf (aviso sem o "d") e adicionar a seguinte linha:
mibs +SEVERALNINES-CLUSTERCONTROL-MIB
3) Adicione a seguinte linha dentro de /etc/sysconfig/snmpd para permitir acesso remoto ao serviço SNMP:
OPTIONS="-Lsd -Lf /dev/null -p /var/run/snmpd.pid -a"
4) Reinicie o daemon SNMP para carregar a mudança:
$ systemctl restart snmpd
5) Para ver se o MIB está carregado corretamente, use o 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)
A saída acima mostra que carregamos o MIB do nosso ClusterControl. Para esta prova de conceito, temos apenas um componente principal chamado "alarmes" e, abaixo dele, temos 3 subcomponentes ao lado de seus tipos de dados:
-
alarmSummary - Resumo dos alarmes. Apenas mostrando crítico, aviso e o ID do cluster correspondente.
-
alarmSummaryGroup - Agrupamento de nossos objetos SNMP.
-
alarmNotification - Isto é para definição de interceptação SNMP. Sem isso, nossa armadilha SNMP não será compreendida pelo gerenciador SNMP.
A numeração ao lado indica o identificador de objeto (OID). Por exemplo, 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. Para organizações privadas, o OID sempre começa com ".1.3.6.1.4.1", seguido pelo número da empresa (57397 é o PEN de Vários Nines) e, em seguida, os objetos MIB.
Instalando o agente SNMP no servidor ClusterControl
Para "servir" a saída do objeto SNMP (o número de alarmes críticos, id do cluster e assim por diante), precisamos estender o daemon SNMP com um agente SNMP. No SNMP, eles chamam esse protocolo de AgentX, que definimos no snmpd.conf nesta seção:
master agentx
Para esta prova de conceito, preparei um script escrito em Perl para recuperar e relatar o resumo do alarme na formatação SNMP/OID.
1) Instale o componente Perl SNMP:
$ yum install perl-Net-SNMP
2) Coloque clustercontrol-snmp-agent.pl em qualquer lugar acessível pelo processo SNMP. Recomenda-se colocá-lo no diretório /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 as seguintes linhas dentro do script (linha 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) Defina o script com permissão executável:
$ chmod 755 /usr/share/snmp/clustercontrol-snmp-agent.pl
5) Execute o script:
$ perl /usr/share/snmp/clustercontrol-snmp-agent.pl
NET-SNMP version 5.7.2 AgentX subagent connected
Certifique-se de ver a linha "subagente conectado". Neste ponto, o alarme do ClusterControl deve ser relatado corretamente via protocolo SNMP. Para verificar, basta usar o comando snmpwalk e executá-lo de um servidor remoto, por exemplo, do servidor Nagios (o snmpwalk é fornecido pelo pacote 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
Alternativamente, você também pode usar o nome do objeto MIB que produz o mesmo 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
Considerações finais
Esta é apenas uma simples prova de conceito (PoC) sobre como o ClusterControl pode ser integrado ao protocolo SNMP. No próximo episódio, veremos como enviar traps SNMP do servidor ClusterControl para o gerenciador SNMP como Nagios, Zabbix ou Sensu.