Monitoramento simples da replicação DFS no Zabbix

Introdução

Com uma infraestrutura bastante grande e distribuída que utiliza DFS como ponto único de acesso aos dados e DFSR para replicação de dados entre data centers e servidores de filiais, surge a questão de monitorar o status dessa replicação.
Coincidentemente, quase imediatamente após começarmos a usar o DFSR, começamos a implementar o Zabbix com o objetivo de substituir o zoológico existente de diversas ferramentas e trazer o monitoramento da infraestrutura de uma forma mais informativa, completa e lógica. Falaremos sobre o uso do Zabbix para monitorar a replicação DFS.

Primeiro de tudo, precisamos decidir quais dados sobre a replicação DFS precisam ser obtidos para monitorar seu status. O indicador mais relevante é o backlog. Contém arquivos que não foram sincronizados com outros membros do grupo de replicação. Você pode ver seu tamanho usando o utilitário dfsrdiag, instalado com a função DFSR. Em um estado de replicação normal, o tamanho do backlog deve se aproximar de zero. Conseqüentemente, um grande número de arquivos no backlog indica problemas de replicação.

Agora, sobre o lado prático da questão.

Para monitorar o tamanho do backlog através do Zabbix Agent, precisaremos de:

  • Script que analisará a saída dfsrdiag fornecer valores finais de tamanho do backlog para o Zabbix,
  • Um script que irá determinar quantos grupos de replicação existem no servidor, quais pastas eles replicam e quais outros servidores estão incluídos neles (não queremos inserir tudo isso no Zabbix manualmente para cada servidor, certo?),
  • Adicionando esses scripts como UserParameter à configuração do agente Zabbix para posterior chamada do servidor de monitoramento,
  • Iniciando o serviço do agente Zabbix como um usuário que tem direitos para ler o backlog,
  • Um template para Zabbix, no qual será configurada a detecção de grupos, processamento dos dados recebidos e emissão de alertas sobre eles.

Analisador de script

Para escrever o analisador, escolhi VBS como a linguagem mais universal presente em todas as versões do Windows Server. A lógica do script é simples: ele recebe o nome do grupo de replicação, a pasta replicada e os nomes dos servidores de envio e recebimento via linha de comando. Esses parâmetros são então passados ​​para dfsrdiag, e dependendo de sua saída, produz:
Número de arquivos - se for recebida uma mensagem sobre a presença de arquivos no backlog,
0 — se for recebida uma mensagem sobre a ausência de arquivos no backlog (“No Backlog”),
-1 - se uma mensagem de erro for recebida dfsrdiag ao executar uma solicitação ("[ERROR]").

get-Backlog.vbs

strReplicationGroup=WScript.Arguments.Item(0)
strReplicatedFolder=WScript.Arguments.Item(1)
strSending=WScript.Arguments.Item(2)
strReceiving=WScript.Arguments.Item(3)

Set WshShell = CreateObject ("Wscript.shell")
Set objExec = WSHshell.Exec("dfsrdiag.exe Backlog /RGName:""" & strReplicationGroup & """ /RFName:""" & strReplicatedFolder & """ /SendingMember:" & strSending & " /ReceivingMember:" & strReceiving)
strResult = ""
Do While Not objExec.StdOut.AtEndOfStream
	strResult = strResult & objExec.StdOut.ReadLine() & "\"
Loop

If InStr(strResult, "No Backlog") > 0 then
	intBackLog = 0
ElseIf  InStr(strResult, "[ERROR]") > 0 Then
    intBackLog = -1
Else
	arrLines = Split(strResult, "\")
	arrResult = Split(arrLines(1), ":")
	intBackLog = arrResult(1)
End If

WScript.echo intBackLog

Roteiro de descoberta

Para que o Zabbix determine todos os grupos de replicação presentes no servidor e descubra todos os parâmetros necessários para a requisição (nome da pasta, nomes dos servidores vizinhos), precisamos, em primeiro lugar, obter esta informação, e em segundo lugar, apresentá-la em um formato compreensível para o Zabbix. O formato que a ferramenta de descoberta entende é assim:

        "data":[
                {
                        "{#GROUP}":"Share1",
                        "{#FOLDER}":"Folder1",
                        "{#SENDING}":"Server1",
                        "{#RECEIVING}":"Server2"}

...

                        "{#GROUP}":"ShareN",
                        "{#FOLDER}":"FolderN",
                        "{#SENDING}":"Server1",
                        "{#RECEIVING}":"ServerN"}]}

A maneira mais fácil de obter as informações de nosso interesse é por meio do WMI, extraindo-as das seções correspondentes do DfsrReplicationGroupConfig. Como resultado, nasceu um script que gera uma solicitação ao WMI e exibe uma lista de grupos, suas pastas e servidores no formato desejado.

DFSRDiscovery.vbs


dim strComputer, strLine, n, k, i

Set wshNetwork = WScript.CreateObject( "WScript.Network" )
strComputer = wshNetwork.ComputerName

Set oWMIService = GetObject("winmgmts:\" & strComputer & "rootMicrosoftDFS")
Set colRGroups = oWMIService.ExecQuery("SELECT * FROM DfsrReplicationGroupConfig")
wscript.echo "{"
wscript.echo "        ""data"":["
n=0
k=0
i=0
For Each oGroup in colRGroups
  n=n+1
  Set colRGFolders = oWMIService.ExecQuery("SELECT * FROM DfsrReplicatedFolderConfig WHERE ReplicationGroupGUID='" & oGroup.ReplicationGroupGUID & "'")
  For Each oFolder in colRGFolders
    k=k+1
    Set colRGConnections = oWMIService.ExecQuery("SELECT * FROM DfsrConnectionConfig WHERE ReplicationGroupGUID='" & oGroup.ReplicationGroupGUID & "'")
    For Each oConnection in colRGConnections
      i=i+1
      binInbound = oConnection.Inbound
      strPartner = oConnection.PartnerName
      strRGName = oGroup.ReplicationGroupName
      strRFName = oFolder.ReplicatedFolderName
      If oConnection.Enabled = True and binInbound = False Then
        strSendingComputer = strComputer
        strReceivingComputer = strPartner
        strLine1="                {"    
        strLine2="                        ""{#GROUP}"":""" & strRGName & """," 
        strLine3="                        ""{#FOLDER}"":""" & strRFName & """," 
        strLine4="                        ""{#SENDING}"":""" & strSendingComputer & ""","                  
        if (n < colRGroups.Count) or (k < colRGFolders.count) or (i < colRGConnections.Count) then
          strLine5="                        ""{#RECEIVING}"":""" & strReceivingComputer & """},"
        else
          strLine5="                        ""{#RECEIVING}"":""" & strReceivingComputer & """}]}"       
        end if		
        wscript.echo strLine1
        wscript.echo strLine2
        wscript.echo strLine3
        wscript.echo strLine4
        wscript.echo strLine5	   
      End If
    Next
  Next
Next

Concordo que o script pode não brilhar com elegância de código e algumas coisas nele certamente poderiam ser simplificadas, mas cumpre sua função principal - fornecer informações sobre os parâmetros dos grupos de replicação em um formato compreensível pelo Zabbix.

Adicionando scripts à configuração do agente Zabbix

Tudo aqui é extremamente simples. Adicione as seguintes linhas ao final do arquivo de configuração do agente:

UserParameter=check_dfsr[*],cscript /nologo "C:Program FilesZabbix Agentget-Backlog.vbs" $1 $2 $3 $4
UserParameter=discovery_dfsr[*],cscript /nologo "C:Program FilesZabbix AgentDFSRDiscovery.vbs"

Claro, ajustamos os caminhos àqueles onde temos scripts. Coloquei-os na mesma pasta onde o agente está instalado.

Após fazer as alterações, reinicie o serviço do agente Zabbix.

Alterando o usuário sob o qual o serviço Zabbix Agent é executado

Para receber informações através dfsrdiag, o utilitário deverá ser executado em uma conta que tenha direitos administrativos para enviar e receber membros do grupo de replicação. O serviço do agente Zabbix, executado por padrão na conta do sistema, não será capaz de executar tal solicitação. Criei uma conta separada no domínio, concedi-lhe direitos administrativos nos servidores necessários e configurei o serviço para ser executado nesses servidores.

Você pode seguir outro caminho: porque dfsrdiag, na verdade, funciona através do mesmo WMI, então você pode usar Descrição, como conceder a uma conta de domínio os direitos de uso sem emitir direitos administrativos, mas se tivermos muitos grupos de replicação, será difícil emitir direitos para cada grupo. No entanto, caso desejemos monitorar a replicação do Volume do Sistema de Domínio em controladores de domínio, esta pode ser a única opção aceitável, uma vez que conceder direitos de administrador de domínio à conta do serviço de monitoramento não é uma boa ideia.

Modelo de monitoramento

Com base nos dados que recebi, criei um modelo que:

  • Executa a descoberta automática de grupos de replicação uma vez por hora,
  • Verifica o tamanho do backlog de cada grupo uma vez a cada 5 minutos,
  • Contém um gatilho que emite um alerta quando o tamanho do backlog de qualquer grupo é superior a 100 por 30 minutos. O gatilho é descrito como um protótipo que é adicionado automaticamente aos grupos detectados,
  • Constrói gráficos de tamanho de backlog para cada grupo de replicação.

Você pode baixar o modelo para Zabbix 2.2 aqui.

Total

Após importar o template para o Zabbix e criar uma conta com os direitos necessários, só precisaremos copiar os scripts para os servidores de arquivos que queremos monitorar para DFSR, adicionar duas linhas à configuração do agente neles e reiniciar o serviço do agente Zabbix , configurando-o para ser executado como a conta desejada. Nenhuma outra configuração manual é necessária para o monitoramento do DFSR.

Fonte: habr.com

Adicionar um comentário