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 intBackLogScript 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 , 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 .
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
