Monitoraggio semplice della replica DFS in Zabbix

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 descrizione, come concedere a un account di dominio i diritti per utilizzarlo senza concedere diritti amministrativi, ma se disponiamo di molti gruppi di replica, sarà difficile concedere diritti a ciascun gruppo. Tuttavia, nel caso in cui desideriamo monitorare la replica del volume del sistema di dominio sui controller di dominio, questa potrebbe essere l'unica opzione accettabile, poiché concedere i diritti di amministratore di dominio all'account del servizio di monitoraggio non è una buona idea.

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

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

Aggiungi un commento