Introduzione
Con un'infrastruttura abbastanza ampia e distribuita che utilizza DFS come singolo punto di accesso ai dati e DFSR per la replica dei dati tra data center e server delle filiali, sorge la questione del monitoraggio dello stato di questa replica.
Per coincidenza, quasi immediatamente dopo aver iniziato a utilizzare DFSR, abbiamo iniziato a implementare Zabbix con l'obiettivo di sostituire lo zoo esistente di vari strumenti e portare il monitoraggio delle infrastrutture in una forma più informativa, completa e logica. Parleremo dell'utilizzo di Zabbix per monitorare la replica DFS.
Prima di tutto, dobbiamo decidere quali dati sulla replica DFS è necessario ottenere per monitorarne lo stato. L’indicatore più rilevante è l’arretrato. Contiene file che non sono stati sincronizzati con altri membri del gruppo di replica. Puoi visualizzarne le dimensioni utilizzando l'utilità dfsrdiag, installato con il ruolo DFSR. In uno stato di replica normale, la dimensione del backlog dovrebbe avvicinarsi allo zero. Di conseguenza, un numero elevato di file nel backlog indica problemi con la replica.
Ora riguardo al lato pratico della questione.
Per monitorare la dimensione del backlog tramite Zabbix Agent, avremo bisogno di:
- Script che analizzerà l'output dfsrdiag fornire i valori finali delle dimensioni del backlog a Zabbix,
- Uno script che determinerà quanti gruppi di replica ci sono sul server, quali cartelle replicano e quali altri server sono inclusi in essi (non vogliamo inserire tutto questo in Zabbix manualmente per ciascun server, giusto?),
- Aggiungendo questi script come UserParameter alla configurazione dell'agente Zabbix per le successive chiamate dal server di monitoraggio,
- Avvio del servizio agente Zabbix come utente che ha i diritti per leggere il backlog,
- Un modello per Zabbix, in cui verrà configurato il rilevamento dei gruppi, l'elaborazione dei dati ricevuti e l'emissione di avvisi su di essi.
Analizzatore di script
Per scrivere il parser ho scelto VBS come linguaggio più universale presente in tutte le versioni di Windows Server. La logica dello script è semplice: riceve il nome del gruppo di replica, della cartella replicata e i nomi dei server di invio e ricezione tramite la riga di comando. Questi parametri vengono quindi passati a dfsrdiag, e a seconda del suo output produce:
Numero di file: se viene ricevuto un messaggio sulla presenza di file nel backlog,
0 - se viene ricevuto un messaggio sull'assenza di file nel backlog ("No Backlog"),
-1 - se viene ricevuto un messaggio di errore dfsrdiag durante l'esecuzione di una richiesta ("[ERRORE]").
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 di scoperta
Affinché Zabbix possa determinare tutti i gruppi di replica presenti sul server e trovare tutti i parametri richiesti per la richiesta (nome della cartella, nomi dei server vicini), dobbiamo innanzitutto ottenere queste informazioni e, in secondo luogo, presentarle in un formato comprensibile a Zabbix. Il formato riconosciuto dallo strumento di rilevamento è simile al seguente:
"data":[
{
"{#GROUP}":"Share1",
"{#FOLDER}":"Folder1",
"{#SENDING}":"Server1",
"{#RECEIVING}":"Server2"}
...
"{#GROUP}":"ShareN",
"{#FOLDER}":"FolderN",
"{#SENDING}":"Server1",
"{#RECEIVING}":"ServerN"}]}
Il modo più semplice per ottenere le informazioni che ci interessano è tramite WMI, estraendole dalle sezioni corrispondenti di DfsrReplicationGroupConfig. Di conseguenza, è nato uno script che genera una richiesta a WMI e restituisce un elenco di gruppi, relative cartelle e 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, lo script potrebbe non brillare per l'eleganza del codice e alcune cose in esso contenute potrebbero certamente essere semplificate, ma svolge la sua funzione principale: fornire informazioni sui parametri dei gruppi di replica in un formato comprensibile da Zabbix.
Aggiunta di script alla configurazione dell'agente Zabbix
Tutto qui è estremamente semplice. Aggiungi le seguenti 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, adattiamo i percorsi a quelli in cui abbiamo script. Li inserisco nella stessa cartella in cui è installato l'agente.
Dopo aver apportato le modifiche, riavvia il servizio agente Zabbix.
Modifica dell'utente con cui viene eseguito il servizio Zabbix Agent
Per ricevere informazioni tramite dfsrdiag, l'utilità deve essere eseguita con un account che disponga dei diritti amministrativi sia per i membri di invio che per quelli di ricezione del gruppo di replica. Il servizio agente Zabbix, eseguito per impostazione predefinita con l'account di sistema, non sarà in grado di eseguire tale richiesta. Ho creato un account separato nel dominio, gli ho concesso diritti amministrativi sui server necessari e ho configurato il servizio per l'esecuzione su questi server.
Puoi andare in un altro modo: perché dfsrdiag, infatti, funziona tramite lo stesso WMI, quindi puoi utilizzare
Modello di monitoraggio
Sulla base dei dati che ho ricevuto, ho creato un modello che:
- Esegue il rilevamento automatico dei gruppi di replica una volta all'ora,
- Controlla la dimensione del backlog per ciascun gruppo una volta ogni 5 minuti,
- Contiene un trigger che genera un avviso quando la dimensione del backlog per qualsiasi gruppo supera 100 per 30 minuti. Il trigger è descritto come un prototipo che viene aggiunto automaticamente ai gruppi rilevati,
- Crea grafici delle dimensioni del backlog per ogni 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, dovremo solo copiare gli script sui file server che vogliamo monitorare per DFSR, aggiungere su di essi due righe alla configurazione dell'agente e riavviare il servizio dell'agente Zabbix , impostandolo per l'esecuzione con l'account desiderato. Non sono necessarie altre impostazioni manuali per il monitoraggio DFSR.
Fonte: habr.com