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
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
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