Einfache Überwachung der DFS-Replikation in Zabbix

Einführung

Bei einer ausreichend großen und verteilten Infrastruktur, die DFS als einzigen Zugangspunkt zu Daten und DFSR für die Datenreplikation zwischen Rechenzentren und Filialservern nutzt, stellt sich die Frage nach der Überwachung des Status dieser Replikation.
Es kam so, dass wir fast sofort nach Beginn der Nutzung von DFSR mit der Implementierung von Zabbix begonnen haben, um den bestehenden Zoo verschiedener Werkzeuge zu ersetzen und die Infrastrukturüberwachung zu einem informativen, vollständigen und nachvollziehbaren Ansatz zu bringen. Die Nutzung von Zabbix zur Überwachung der DFS-Replikation wird hier behandelt.

Zuerst müssen wir uns darüber im Klaren sein, welche Daten zur DFS-Replikation benötigt werden, um deren Zustand zu kontrollieren. Der aktuellste Indikator ist der Rückstand. Darin befinden sich Dateien, die nicht mit anderen Mitgliedern der Replikationsgruppe synchronisiert wurden. Seine Größe kann mit dem Dienstprogramm dfsrdiag, das zusammen mit der DFSR-Rolle installiert wird, überprüft werden. Im Normalbetrieb der Replikation sollte die Größe des Rückstands gegen Null tendieren. Entsprechend deuten große Werte der Anzahl von Dateien im Rückstand auf Probleme mit der Replikation hin.

Nun zur praktischen Seite der Frage.

Um die Größe des Rückstands über den Zabbix-Agenten zu überwachen, benötigen wir:

  • Ein Skript, das die Ausgabe parst, dfsrdiag um die endgültigen Werte der Rückstandgröße an Zabbix zu liefern,
  • Ein Skript, das bestimmt, wie viele Replikationsgruppen auf dem Server existieren, welche Ordner sie replizieren und welche weiteren Server darin enthalten sind (wir möchten das nicht alles manuell für jeden Server in Zabbix eingeben, richtig?),
  • Die Einbindung dieser Skripte als UserParameter in die Konfiguration des Zabbix-Agenten für den späteren Aufruf von der Monitoring-Server,
  • Den Zabbix-Agenten als Dienst unter dem Namen eines Benutzers starten, der das Recht hat, auf den Rückstand zuzugreifen,
  • Eine Vorlage für Zabbix, in der die Erkennung von Gruppen, die Verarbeitung der erhaltenen Daten und die Ausgabe von Alarmen darin konfiguriert wird.

Parser-Skript

Für die Erstellung des Parsers habe ich VBS gewählt, da es die universellste Sprache ist, die in allen Versionen von Windows Server vorhanden ist. Die Logik des Skripts ist einfach: Es erhält über die Eingabeaufforderung den Namen der Replikationsgruppe, des replizierten Ordners sowie die Namen der sendenden und empfangenden Server. Diese Parameter werden dann an dfsrdiag, und abhängig von dessen Ausgabe wird folgendes ausgegeben:
Anzahl der Dateien – wenn eine Nachricht über das Vorhandensein von Dateien im Rückstand erhalten wird,
0 — wenn die Nachricht über fehlende Dateien im Backlog („No Backlog“) empfangen wurde,
-1 — wenn eine Fehlermeldung empfangen wurde dfsrdiag bei der Ausführung der Anfrage ("[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

Erkennungsskript

Damit Zabbix selbst alle Replikationsgruppen erkennen kann, die auf dem Server vorhanden sind, und auch alle erforderlichen Parameter (Ordnernamen, Nachbarservernamen) für die Abfrage ermitteln kann, müssen wir diese Informationen zunächst erhalten und sie dann in einem für Zabbix verständlichen Format darstellen. Das Format, das das Entdeckungswerkzeug versteht, sieht folgendermaßen aus:

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

...

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

Die Informationen, die uns interessieren, lassen sich am einfachsten über WMI abrufen, indem wir sie aus den entsprechenden Abschnitten von DfsrReplicationGroupConfig extrahieren. Heraus kam ein Skript, das eine Abfrage an WMI formuliert und als Ausgabe eine Liste von Gruppen, deren Ordnern und Servern im benötigten Format bereitstellt.

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

Ich stimme zu, das Skript mag in Bezug auf Eleganz des Codes nicht glänzen und es gibt sicherlich Möglichkeiten zur Vereinfachung, aber die Hauptfunktion – Informationen über die Parameter der Replikationsgruppen in einem Format bereitzustellen, das Zabbix versteht – erfüllt es erfolgreich.

Integration von Skripten in die Zabbix-Agent-Konfiguration

Hier ist alles ganz einfach. Fügen Sie am Ende der Konfigurationsdatei des Agents folgende Zeilen hinzu:

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"

Die Pfade müssen natürlich auf die Orte angepasst werden, an denen sich unsere Skripte befinden. Ich habe sie in denselben Ordner gelegt, in dem der Agent installiert ist.

Nach den Änderungen starten wir den Zabbix-Agenten neu.

Änderung des Benutzers, unter dem der Zabbix-Agent-Dienst läuft

Um Informationen über zu erhalten dfsrdiag, das Dienstprogramm muss von einem Konto mit Administratorrechten sowohl auf den sending- als auch auf den receiving-Mitgliedern der Replikationsgruppe ausgeführt werden. Der Zabbix-Agent, der standardmäßig unter dem Systemkonto ausgeführt wird, kann diese Anfrage nicht ausführen. Ich habe ein separates Konto in der Domäne erstellt, ihm Administratorrechte auf den benötigten Servern gegeben und den Dienst auf diesen Servern so konfiguriert, dass er unter diesem Konto ausgeführt wird.

Es gibt auch einen anderen Weg: Da dfsrdiag, im Wesentlichen über dasselbe WMI arbeitet, kann man die Beschreibung, wie man einem Domänenkonto die Berechtigung zur Nutzung ohne Gewährung von Administratorrechten geben kann, aber wenn wir viele Replikationsgruppen haben, wird es schwierig sein, Berechtigungen für jede Gruppe zu vergeben. Wenn wir jedoch die Replikation des Domain System Volume auf den Domänencontrollern überwachen wollen, könnte dies die einzige akzeptable Option sein, da es keine gute Idee ist, der Monitoring-Dienstkonto Administratorrechte zu gewähren.

Überwachungsmuster

Auf der Grundlage der erhaltenen Daten habe ich ein Muster erstellt, das:

  • Einmal pro Stunde die automatische Erkennung von Replikationsgruppen startet,
  • Einmal alle 5 Minuten die Größe des Backlogs für jede Gruppe überprüft,
  • Einen Trigger enthält, der einen Alarm ausgibt, wenn die Größe des Backlogs für eine Gruppe mehr als 100 über einen Zeitraum von 30 Minuten beträgt. Der Trigger ist als Prototyp beschrieben, der automatisch zu den erkannten Gruppen hinzugefügt wird,
  • Diagramme über die Größe des Backlogs für jede Replikationsgruppe erstellt.

Das Muster für Zabbix 2.2 kann heruntergeladen werden hier.

Fazit

Nach dem Import des Musters in Zabbix und der Erstellung eines Kontos mit den erforderlichen Berechtigungen reicht es aus, die Skripte auf die Dateiserver, die wir in Bezug auf DFSR überwachen möchten, zu kopieren, zwei Zeilen in die Agenten-Konfiguration auf diesen Servern hinzuzufügen und den Zabbix-Agenten neu zu starten, während wir ihn so konfigurieren, dass er unter dem erforderlichen Konto läuft. Es sind keine weiteren manuellen Einstellungen zur Überwachung von DFSR erforderlich.

Quelle: habr.com

60GB SSD 8Gb DDR4