Introduzione
Con un'infrastruttura sufficientemente ampia e distribuita che utilizza DFS come unico punto di accesso ai dati e DFSR per la replica dei dati tra i Data Center e i server delle filiali, sorge la questione del monitoraggio dello stato di questa replica.
È stata una coincidenza che quasi subito dopo aver iniziato a utilizzare DFSR, abbiamo avviato l'implementazione di Zabbix con l'obiettivo di sostituire il variegato zoo di strumenti esistenti e portare il monitoraggio dell'infrastruttura a una forma più informativa, completa e logica. Di come utilizzare Zabbix per monitorare la replica del DFS si parlerà.
Innanzitutto, dobbiamo decidere quali dati sulla replica del DFS siano necessari per controllare il suo stato. L'indicatore più rilevante è il backlog. In esso si trovano i file che non sono stati sincronizzati con gli altri membri del gruppo di replica. La sua dimensione può essere controllata con l'utilità dfsrdiag, che si installa insieme al ruolo DFSR. In condizioni normali di replica, la dimensione del backlog dovrebbe tendere a zero. Di conseguenza, valori elevati del numero di file nel backlog indicano problemi con la replica.
Ora passiamo alla parte pratica.
Per monitorare la dimensione del backlog tramite Zabbix Agent, abbiamo bisogno di:
- Uno script che analizzi l'output dfsrdiag per fornire a Zabbix i valori finali della dimensione del backlog,
- Uno script che determini quante sono le gruppi di replica presenti sul server, quali cartelle stanno replicando e quali altri server ne fanno parte (non vogliamo dover inserire tutto questo in Zabbix manualmente per ogni server, giusto?),
- L'inserimento di questi script come UserParameter nella configurazione dell'agente Zabbix per una successiva chiamata dal server di monitoraggio,
- L'avvio del servizio agente Zabbix con l'utente che ha il diritto di leggere il backlog,
- Un template per Zabbix, in cui verrà configurata la scoperta dei gruppi, l'elaborazione dei dati ricevuti e la generazione di allerta.
Script di parsing
Per scrivere il parser ho scelto VBS come linguaggio più universale, presente in tutte le versioni di Windows Server. La logica di funzionamento dello script è semplice: riceve tramite la riga di comando il nome del gruppo di replica, la cartella replicata e i nomi dei server sending e receiving. Successivamente, questi parametri vengono trasferiti in dfsrdiag, e a seconda della sua output si fornisce:
Il numero di file - se viene ricevuto un messaggio riguardante la presenza di file nel backlog,
0 — se viene ricevuto un messaggio di assenza di file nel backlog («No Backlog»),
-1 — se viene ricevuto un messaggio di errore dfsrdiag nell'esecuzione della richiesta ("[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 di rilevamento
Per consentire a Zabbix di identificare automaticamente tutti i gruppi di replica presenti sul server e scoprire autonomamente tutti i parametri richiesti per la richiesta (nome della cartella, nomi dei server vicini), dobbiamo prima ottenere queste informazioni e, in secondo luogo, presentarle in un formato comprensibile per Zabbix. Il formato che comprende lo strumento di discovery appare così:
"data":[
{
"{#GROUP}":"Share1",
"{#FOLDER}":"Folder1",
"{#SENDING}":"Server1",
"{#RECEIVING}":"Server2"}
...
"{#GROUP}":"ShareN",
"{#FOLDER}":"FolderN",
"{#SENDING}":"Server1",
"{#RECEIVING}":"ServerN"}]}Le informazioni di nostro interesse possono essere ottenute più facilmente tramite WMI, estraendole dalle sezioni corrispondenti a DfsrReplicationGroupConfig. Da ciò è nato uno script che forma una richiesta a WMI e restituisce un elenco di gruppi, le loro cartelle e i server nel formato richiesto.
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
Sono d'accordo, il codice dello script potrebbe non essere il massimo in termini di eleganza e ci sono sicuramente cose che possono essere semplificate, ma la sua funzione principale — fornire informazioni sui parametri dei gruppi di replica in un formato comprensibile per Zabbix — la svolge con successo.
Inserimento di script nella configurazione dell'agente Zabbix
Qui è tutto estremamente semplice. Aggiungiamo queste righe alla fine del file di configurazione dell'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"
Naturalmente, modifichiamo i percorsi in base a dove abbiamo salvato gli script. Io li ho messi nella stessa cartella in cui è installato l'agente.
Dopo aver apportato modifiche, riavviamo il servizio dell'agente Zabbix.
Modifica dell'utente con cui funziona il servizio Zabbix Agent
Per ricevere informazioni tramite dfsrdiag, l'utilità deve essere eseguita con un account che abbia diritti amministrativi sia sui membri del gruppo di invio che su quelli di ricezione. Il servizio agente Zabbix, in esecuzione per impostazione predefinita con un account di sistema, non può eseguire tale richiesta. Ho creato un account separato nel dominio, gli ho dato diritti amministrativi sui server necessari e ho configurato l'avvio del servizio sotto di esso su questi server.
Puoi anche seguire un'altra strada: poiché dfsrdiag, in sostanza, funziona attraverso lo stesso WMI, puoi utilizzare , su come dare i diritti di utilizzo a un account di dominio senza concedere diritti amministrativi, ma se abbiamo molti gruppi di replica, concedere diritti a ciascun gruppo potrebbe risultare complicato. Tuttavia, nel caso volessimo monitorare la replica del Domain System Volume sui controller di dominio, questa potrebbe essere l'unica opzione accettabile, poiché concedere diritti di amministratore di dominio all'account del servizio di monitoraggio non è la migliore idea.
Modello di monitoraggio
Basandomi sui dati ottenuti, ho creato un modello che:
- Avvia ogni ora la scoperta automatica dei gruppi di replica,
- Controlla ogni 5 minuti la dimensione del backlog per ciascun gruppo,
- Contiene un trigger che emette un avviso quando la dimensione del backlog per un qualsiasi gruppo supera 100 per 30 minuti. Il trigger è descritto come un prototipo che viene aggiunto automaticamente ai gruppi scoperti,
- Costruisce grafici della dimensione del backlog per ciascun gruppo di replica.
Puoi scaricare il modello per Zabbix 2.2 .
Risultato
Dopo aver importato il modello in Zabbix e creato un account con i diritti necessari, ci basterà copiare gli script sui server файлов, che vogliamo monitorare per quanto riguarda il DFSR, aggiungere due righe nella configurazione dell'agente su di essi e riavviare il servizio agente Zabbix, configurandolo per l'avvio con l'account desiderato. Non saranno necessarie altre configurazioni manuali per monitorare il DFSR.
Fonte: habr.com
