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 zur Replikation von Daten zwischen Rechenzentren und Filialservern verwendet, stellt sich die Frage nach der Überwachung des Status dieser Replikation.
Es zufällig so kam, dass wir fast sofort nach der Einführung von DFSR mit der Implementierung von Zabbix begannen, um den vorhandenen Zoo verschiedener Tools zu ersetzen und die Überwachung der Infrastruktur informativer, umfassender und logischer zu gestalten. Dabei wird es um den Einsatz von Zabbix zur Überwachung der DFS-Replikation gehen.

Zunächst müssen wir klären, welche Daten zur DFS-Replikation benötigt werden, um ihren Status zu überwachen. Der relevanteste Indikator ist der Backlog. In diesen fließen Dateien ein, die nicht mit anderen Mitgliedern der Replikationsgruppe synchronisiert wurden. Die Größe kann mit dem Tool dfsrdiageingesehen werden, das zusammen mit der DFSR-Rolle installiert wird. Im normalen Zustand der Replikation sollte die Größe des Backlogs gegen null tendieren. Entsprechend deuten große Werte der Dateizahl im Backlog auf Probleme mit der Replikation hin.

Kommen wir nun zur praktischen Seite der Sache.

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

  • Ein Skript, das die Ausgabe analysiert, dfsrdiag um die endgültigen Werte der Backlog-Größe in Zabbix bereitzustellen,
  • Ein Skript, das bestimmt, wie viele Replikationsgruppen auf dem Server vorhanden sind, welche Ordner sie replizieren und welche anderen Server dazugehören (wir möchten das nicht manuell für jeden Server in Zabbix eingeben, oder?)
  • Integration dieser Skripte als UserParameter in die Konfiguration des Zabbix-Agenten, um sie später vom Überwachungsserver aufzurufen,
  • Den Zabbix-Agenten unter einem Benutzer auszuführen, der das Recht hat, die Backlog-Daten zu lesen,
  • Eine Vorlage für Zabbix, in der die Entdeckung von Gruppen, die Verarbeitung der erhaltenen Daten und die Ausgabe von Alarme eingerichtet sind.

Parser-Skript

Für das Schreiben des Parsers habe ich VBS gewählt, da es eine universelle Sprache ist, die in allen Versionen von Windows Server verfügbar ist. Die Logik des Skripts ist einfach: Es erhält über die Eingabeaufforderung den Namen der Replikationsgruppe, des replizierten Ordners und die Namen der sendenden und empfangenden Server. Diese Parameter werden dann an dfsrdiag, und je nach Ausgabe wird ausgegeben:
Anzahl der Dateien – falls eine Meldung über die Existenz von Dateien im Backlog empfangen wurde,
0 — wenn die Meldung über fehlende Dateien im Backlog („No Backlog“) erhalten 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

Erkennungs-Skript

Damit Zabbix selbst alle Replikationsgruppen auf dem Server erkennt und alle erforderlichen Parameter (Ordnernamen, Nachbar-Servernamen) herausfindet, müssen wir diese Informationen erstens abrufen und zweitens in einem für Zabbix verständlichen Format bereitstellen. Das Format, das das Discovery-Tool versteht, sieht so aus:

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

...

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

Die benötigten Informationen lassen sich am einfachsten über WMI abrufen, indem man sie aus den entsprechenden Abschnitten von DfsrReplicationGroupConfig extrahiert. So entstand ein Skript, das eine Anfrage an WMI stellt und eine Liste der Gruppen, ihrer Ordner und Server im benötigten Format ausgibt.

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 glänzt möglicherweise nicht mit eleganter Codequalität und es gibt sicher einige Dinge, die man vereinfachen kann, aber es erfüllt seine Hauptfunktion — die Bereitstellung von Informationen über die Parameter von Replikationsgruppen in einem für Zabbix verständlichen Format — erfolgreich.

Einfügen 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 passen wir selbstverständlich an die Stelle an, an der unsere Skripte liegen. Ich habe sie im selben Ordner gespeichert, in dem der Agent installiert ist.

Nach den Änderungen starten wir den Zabbix-Agent-Dienst neu.

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

Um Informationen zu erhalten über dfsrdiag, das Tool muss mit einem Konto gestartet werden, das über Administratorrechte sowohl auf den Sending- als auch auf den Receiving-Mitgliedern der Replikationsgruppe verfügt. Der Zabbix-Agent, der standardmäßig mit dem Systemkonto ausgeführt wird, kann diese Anforderung nicht erfüllen. Ich habe ein separates Konto in der Domäne erstellt, ihm Administratorrechte auf den erforderlichen Servern gegeben und die Dienstausführung auf diesen Servern unter diesem Konto konfiguriert.

Es gibt auch einen anderen Ansatz: da dfsrdiag, im Grunde funktioniert es über dasselbe WMI, kann man die Beschreibung nutzen,, um der Domänenanmeldung Rechte zur Nutzung zu geben, ohne Administratorrechte zu vergeben. Wenn wir jedoch viele Replikationsgruppen haben, wird es schwierig sein, für jede Gruppe Rechte zu vergeben. Im Falle, dass wir die Replikation des Domain System Volume auf den Domaincontrollern überwachen möchten, könnte dies die einzige akzeptable Option sein, da es keine gute Idee ist, der Überwachungsbenutzeranmeldung Domänenadministratorenrechte zu geben.

Überwachungsvorlage

Basierend auf den gesammelten Daten habe ich eine Vorlage erstellt, die:

  • einmal pro Stunde die automatische Erkennung der Replikationsgruppen ausführt,
  • Überprüft alle 5 Minuten die Größe des Backlogs für jede Gruppe.
  • Enthält einen Trigger, der einen Alarm ausgibt, wenn die Größe des Backlogs für eine Gruppe über 100 für 30 Minuten steigt. Der Trigger wird als Prototyp beschrieben, der automatisch zu entdeckten Gruppen hinzugefügt wird.
  • Erstellt Grafiken zur Größe des Backlogs für jede Replikationsgruppe.

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

Zusammenfassung

Nach dem Import des Templates in Zabbix und der Erstellung eines Kontos mit den erforderlichen Rechten reicht es aus, die Skripte auf die Dateiserver zu kopieren, die wir hinsichtlich DFSR überwachen möchten, zwei Zeilen in der Konfiguration des Agenten hinzuzufügen und den Zabbix-Agenten-Dienst neu zu starten, wobei wir ihn so konfigurieren, dass er mit dem erforderlichen Konto gestartet wird. Weitere manuelle Anpassungen für die Überwachung von DFSR sind nicht erforderlich.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster