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 intBackLogErkennungsskript
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 , 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 .
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
