Monitoraggio semplice della replicazione DFS in Zabbix

Introduzione

In un'infrastruttura sufficientemente grande e distribuita, che utilizza DFS come punto di accesso unico ai dati e DFSR per la replica dei dati tra i data center e i server delle filiali, sorge la necessità di monitorare lo stato di questa replicazione.
Proprio in quel periodo, dopo aver iniziato ad utilizzare DFSR, abbiamo avviato l'implementazione di Zabbix con l'obiettivo di sostituire il nostro attuale scenario di strumenti diversi e di rendere il monitoraggio dell'infrastruttura più informativo, completo e logico. Questo articolo tratterà dell'utilizzo di Zabbix per monitorare la replicazione DFS.

Per prima cosa, dobbiamo decidere quali dati sulla replicazione DFS raccogliere per controllarne lo stato. L'indicatore più rilevante è il backlog. Esso include i file non sincronizzati con gli altri membri del gruppo di replica. È possibile controllarne la dimensione utilizzando lo strumento dfsrdiag, che si installa insieme al ruolo di DFSR. In uno stato di replicazione normale, la dimensione del backlog dovrebbe tendere a zero. Pertanto, valori elevati del numero di file nel backlog segnalano problemi di replicazione.

Parliamo ora dell'aspetto pratico della questione.

Per monitorare la dimensione del backlog tramite Zabbix Agent, avremo 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 gruppi di replica ci sono sul server, quali cartelle stanno replicando e quali altri server ne fanno parte (non vogliamo digitare tutto questo in Zabbix a mano per ogni server, vero?)
  • L'aggiunta di questi script come UserParameter nella configurazione dell'agente Zabbix per un successivo richiamo dal server di monitoraggio,
  • L'avvio del servizio Zabbix Agent con un utente avente diritti di lettura sul backlog,
  • Un template per Zabbix, in cui sarà impostata la rilevazione dei gruppi, l'elaborazione dei dati ricevuti e l'emissione di avvisi su di essi.

Script di parsing

Per la scrittura del parser ho scelto VBS, in quanto è un linguaggio molto universale, presente in tutte le versioni di Windows Server. La logica del funzionamento dello script è semplice: riceve tramite la riga di comando il nome del gruppo di replica, la cartella replicata e i nomi dei server di invio e ricezione. Successivamente, questi parametri vengono passati a dfsrdiag, e a seconda della sua uscita viene restituito:
Numero di file - se si riceve un messaggio riguardante la presenza di file nel backlog,
0 - se si riceve un messaggio sulla mancanza di file nel backlog ("No Backlog"),
-1 - se si riceve 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 intBackLog

Script di rilevamento

Per consentire a Zabbix di identificare autonomamente tutti i gruppi di replicazione presenti sul server e determinare automaticamente tutti i parametri richiesti per la richiesta (nome della cartella, nomi dei server vicini), dobbiamo prima ottenere queste informazioni e poi presentarle in un formato comprensibile per Zabbix. Il formato che lo strumento di discovery comprende è il seguente:

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

...

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

Le informazioni che ci interessano possono essere ottenute più facilmente tramite WMI, estraendole dalle sezioni corrispondenti di DfsrReplicationGroupConfig. È nato così uno script che crea una query a WMI e restituisce un elenco di gruppi, le loro cartelle e server nel formato desiderato.

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

Accetto, lo script potrebbe non brillare per eleganza nel codice e ci sarà sicuramente qualcosa che può essere semplificato, ma la sua funzione principale di fornire informazioni sui parametri dei gruppi di replica in un formato comprensibile per Zabbix la svolge con successo.

Aggiunta di script alla configurazione dell'agente Zabbix

Qui tutto è estremamente semplice. Aggiungiamo le 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"

I percorsi, naturalmente, devono essere modificati in quelli dove abbiamo i nostri script. Io li ho messi nella stessa cartella in cui è stato installato l'agente.

Dopo aver apportato le modifiche, riavviamo il servizio dell'agente Zabbix.

Modifica dell'utente con cui opera il servizio Zabbix Agent

Per ricevere informazioni tramite dfsrdiag, l'utilità deve essere eseguita con un account che dispone di privilegi amministrativi sia sui membri sending che sui membri receiving 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 dato diritti amministrativi sui server necessari e ho configurato l'esecuzione del servizio su di essi.

Ci sono ulteriori strade da seguire: poiché dfsrdiag, in sostanza, funziona attraverso lo stesso WMI, possiamo sfruttare la descrizione, su come conferire all'account di dominio i diritti per il suo utilizzo senza fornire privilegi amministrativi, ma se abbiamo molti gruppi di replica, concedere diritti a ciascun gruppo può risultare difficile. Tuttavia, nel caso desiderassimo monitorare la replica del Domain System Volume sui controller di dominio, questo potrebbe rivelarsi l'unica opzione accettabile, poiché dare diritti di amministratore del dominio all'account del servizio di monitoraggio non è la scelta migliore.

Modello di monitoraggio

Basandomi sui dati ricevuti, ho creato un modello che:

  • Esegue automaticamente la scoperta dei gruppi di replica ogni ora,
  • Controlla la dimensione del backlog per ogni gruppo ogni 5 minuti,
  • Contiene un trigger che emette un avviso se la dimensione del backlog per un gruppo supera 100 per più di 30 minuti. Il trigger è descritto come un prototipo che viene automaticamente aggiunto ai gruppi rilevati,
  • Crea grafici delle dimensioni del backlog per ciascun gruppo di replicazione.

Puoi scaricare il template per Zabbix 2.2 qui.

Risultato

Dopo aver importato il template in Zabbix e creato un'account con i diritti necessari, sarà sufficiente copiare gli script sui server file che desideriamo monitorare per quanto riguarda DFSR, aggiungere due righe nella configurazione dell'agente su di essi e riavviare il servizio dell'agente Zabbix, impostandone l'avvio con l'account desiderato. Non sono necessarie ulteriori configurazioni manuali per monitorare DFSR.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster