Monitoramento simples de replicação DFS no Zabbix

Introdução

Com uma infraestrutura suficientemente grande e distribuída, usando DFS como um único ponto de acesso aos dados e DFSR para replicação de dados entre o DC e os servidores de filiais, surge a questão do monitoramento do estado dessa replicação.
Coincidentemente, quase imediatamente após o início da utilização do DFSR, começamos a implementar o Zabbix com o objetivo de substituir o arcabouço existente de várias ferramentas e tornar o monitoramento da infraestrutura mais informativo, completo e lógico. É sobre o uso do Zabbix para monitorar a replicação DFS que falaremos.

Primeiramente, precisamos determinar quais dados sobre a replicação DFS precisamos coletar para controlar seu estado. O indicador mais relevante é o backlog. Ele contém arquivos que não foram sincronizados com outros membros do grupo de replicação. Podemos verificar seu tamanho usando a ferramenta dfsrdiag, que é instalada junto com a função DFSR. Em um estado normal de replicação, o tamanho do backlog deve tender a zero. Portanto, grandes valores da quantidade de arquivos no backlog indicam 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:

  • Um script que irá analisar a saída dfsrdiag para fornecer ao Zabbix os valores finais do tamanho do backlog,
  • Um script que determinará quantos grupos de replicação existem no servidor, quais pastas eles replicam e quais outros servidores estão incluídos (não queremos inserir tudo isso no Zabbix manualmente para cada servidor, certo?),
  • A inclusão desses scripts como UserParameter na configuração do agente Zabbix para chamadas posteriores a partir do servidor de monitoramento,
  • A execução do serviço do agente Zabbix sob um usuário que tenha permissão para ler o backlog,
  • Um template para Zabbix, que terá a detecção de grupos configurada, o processamento dos dados recebidos e a emissão de alertas a partir deles.

Script analisador

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 através da linha de comando o nome do grupo de replicação, a pasta replicada e os nomes dos servidores sending e receiving. Em seguida, esses parâmetros são passados para dfsrdiag, e dependendo de sua saída, é emitido:
O número de arquivos — se uma mensagem sobre a presença de arquivos no backlog for recebida,
0 — se a mensagem "No Backlog" for recebida,
-1 — se uma mensagem de erro for recebida dfsrdiag durante a execução da 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

Script de detecção

Para que o Zabbix identifique automaticamente todos os grupos de replicação presentes no servidor e apure todos os parâmetros necessários para a solicitação (nome da pasta, nomes dos servidores vizinhos), precisamos obter essas informações e apresentá-las em um formato compreensível para o Zabbix. O formato que a ferramenta de descoberta entende é o seguinte:

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

...

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

As informações de nosso interesse podem ser obtidas mais facilmente por meio do WMI, extraindo-as das seções correspondentes do DfsrReplicationGroupConfig. No final, nasceu um script que forma uma solicitação ao WMI e, como saída, gera uma lista de grupos, suas pastas e servidores no formato necessário.

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 pela elegância do código e que há algo nele que pode ser simplificado, mas ele desempenha sua função principal — fornecer informações sobre os parâmetros dos grupos de replicação em um formato compreensível para o Zabbix — com sucesso.

Inserção de scripts na configuração do agente Zabbix

Aqui tudo é bastante simples. Adicionamos 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"

Os caminhos, naturalmente, devem ser ajustados para aqueles onde temos os scripts. Eu os coloquei na mesma pasta onde o agente está instalado.

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

Alteração do usuário sob o qual o serviço do Agente Zabbix está rodando

Para obter informações através de dfsrdiag, a ferramenta deve ser executada com uma conta que tenha privilégios administrativos tanto nos membros do grupo de envio quanto nos membros do grupo de recepção. O serviço do agente Zabbix, que por padrão é executado sob a conta do sistema, não conseguirá realizar essa solicitação. Eu criei uma conta separada no domínio, concedi privilégios administrativos nos servidores necessários e configurei o serviço para ser executado a partir dela nesses servidores.

É possível seguir outro caminho: uma vez que dfsrdiag, na essência, funciona através do mesmo WMI, podemos aproveitar a descrição, de como conceder à conta do domínio permissões para utilizá-lo sem a emissão de privilégios administrativos, mas se temos muitos grupos de replicação, conceder permissões a cada grupo pode ser complicado. No entanto, se quisermos monitorar a replicação do Volume do Sistema de Domínio nos controladores de domínio, isso pode ser a única opção aceitável, uma vez que conceder permissões administrativas a uma conta de serviço de monitoramento não é a melhor ideia.

Modelo de monitoramento

Com base nos dados recebidos, criei um modelo que:

  • Executa a descoberta automática de grupos de replicação a cada hora,
  • Verifica o tamanho do backlog para cada grupo a cada 5 minutos,
  • Contém um gatilho que envia um alerta quando o tamanho do backlog de algum grupo ultrapassa 100 durante 30 minutos. O gatilho é descrito como um protótipo, que é adicionado automaticamente aos grupos detectados,
  • Gera gráficos do tamanho do backlog para cada grupo de replicação.

O modelo para Zabbix 2.2 pode ser baixado aqui.

Resultado

Após a importação do modelo no Zabbix e a criação de uma conta com as permissões necessárias, será suficiente apenas copiar os scripts para os servidores de arquivos que desejamos monitorar em relação ao DFSR, adicionar duas linhas na configuração do agente neles e reiniciar o serviço do agente Zabbix, configurando-o para ser executado sob a conta necessária. Nenhuma outra configuração manual será necessária para o monitoramento do DFSR.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster