Einfache Überwachung der DFS-Replikation in Zabbix

Einführung

Bei einer relativ großen und verteilten Infrastruktur, die DFS als einzigen Zugriffspunkt auf Daten und DFSR für die Datenreplikation zwischen Rechenzentren und Zweigstellenservern nutzt, stellt sich die Frage nach der Überwachung des Status dieser Replikation.
Zufälligerweise begannen wir fast unmittelbar nach Beginn der Nutzung von DFSR mit der Implementierung von Zabbix mit dem Ziel, den bestehenden Zoo verschiedener Tools zu ersetzen und die Infrastrukturüberwachung in eine informativere, vollständigere und logischere Form zu bringen. Wir werden über die Verwendung von Zabbix zur Überwachung der DFS-Replikation sprechen.

Zunächst müssen wir entscheiden, welche Daten zur DFS-Replikation abgerufen werden müssen, um ihren Status zu überwachen. Der relevanteste Indikator ist der Rückstand. Es enthält Dateien, die nicht mit anderen Mitgliedern der Replikationsgruppe synchronisiert wurden. Sie können die Größe mit dem Dienstprogramm anzeigen dfsrdiag, installiert mit der DFSR-Rolle. In einem normalen Replikationsstatus sollte die Backlog-Größe gegen Null gehen. Dementsprechend deuten große Mengen an Dateien im Backlog auf Probleme bei der Replikation hin.

Nun zur praktischen Seite des Problems.

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

  • Skript, das die Ausgabe analysiert dfsrdiag um Zabbix endgültige Backlog-Größenwerte bereitzustellen,
  • Ein Skript, das bestimmt, wie viele Replikationsgruppen es auf dem Server gibt, welche Ordner sie replizieren und welche anderen Server darin enthalten sind (wir wollen das alles nicht für jeden Server manuell in Zabbix eingeben, oder?),
  • Hinzufügen dieser Skripte als UserParameter zur Zabbix-Agentenkonfiguration für spätere Aufrufe vom Überwachungsserver,
  • Starten des Zabbix-Agentendienstes als Benutzer mit Rechten zum Lesen des Backlogs,
  • Eine Vorlage für Zabbix, in der die Erkennung von Gruppen, die Verarbeitung empfangener Daten und die Ausgabe von Warnungen für diese konfiguriert werden.

Skriptparser

Um den Parser zu schreiben, habe ich VBS als die universellste Sprache gewählt, die in allen Versionen von Windows Server vorhanden ist. Die Logik des Skripts ist einfach: Über die Befehlszeile erhält es den Namen der Replikationsgruppe, des replizierten Ordners sowie die Namen der sendenden und empfangenden Server. Diese Parameter werden dann an übergeben dfsrdiag, und je nach Ausgabe erzeugt es:
Anzahl der Dateien – wenn eine Nachricht über das Vorhandensein von Dateien im Backlog empfangen wird,
0 – wenn eine Nachricht über das Fehlen von Dateien im Backlog („No Backlog“) empfangen wird,
-1 – wenn eine Fehlermeldung empfangen wird dfsrdiag beim Ausführen einer 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

Discovery-Skript

Damit Zabbix alle auf dem Server vorhandenen Replikationsgruppen ermitteln und alle für die Anfrage erforderlichen Parameter (Ordnername, Namen benachbarter Server) ermitteln kann, müssen wir diese Informationen erstens beschaffen und zweitens präsentieren in einem für Zabbix verständlichen Format. Das Format, das das Erkennungstool versteht, sieht folgendermaßen aus:

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

...

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

Der einfachste Weg, die für uns interessanten Informationen zu erhalten, ist über WMI, indem man sie aus den entsprechenden Abschnitten von DfsrReplicationGroupConfig abruft. Als Ergebnis entstand ein Skript, das eine Anfrage an WMI generiert und eine Liste von Gruppen, deren Ordnern und Servern im erforderlichen 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 vielleicht nicht mit der Eleganz des Codes und einige Dinge darin könnten sicherlich vereinfacht werden, aber es erfüllt seine Hauptfunktion – die Bereitstellung von Informationen über die Parameter von Replikationsgruppen in einem für Zabbix verständlichen Format.

Hinzufügen von Skripten zur Zabbix-Agentenkonfiguration

Hier ist alles extrem einfach. Fügen Sie am Ende der Agent-Konfigurationsdatei die folgenden 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"

Natürlich passen wir die Pfade denen an, in denen wir Skripte haben. Ich habe sie im selben Ordner abgelegt, in dem der Agent installiert ist.

Nachdem Sie Änderungen vorgenommen haben, starten Sie den Zabbix-Agentendienst neu.

Ändern des Benutzers, unter dem der Zabbix Agent-Dienst ausgeführt wird

Um Informationen zu erhalten dfsrdiagmuss das Dienstprogramm unter einem Konto ausgeführt werden, das über Administratorrechte sowohl für sendende als auch für empfangende Mitglieder der Replikationsgruppe verfügt. Der Zabbix-Agentendienst, der standardmäßig unter dem Systemkonto ausgeführt wird, kann eine solche Anfrage nicht ausführen. Ich habe ein separates Konto in der Domäne erstellt, ihm Administratorrechte auf den erforderlichen Servern erteilt und den Dienst so konfiguriert, dass er unter diesem Konto auf diesen Servern ausgeführt wird.

Sie können auch einen anderen Weg gehen: weil dfsrdiagTatsächlich funktioniert es über dasselbe WMI, das Sie dann verwenden können Beschreibung, wie man einem Domänenkonto die Rechte gibt, es zu verwenden, ohne Administratorrechte zu erteilen, aber wenn wir viele Replikationsgruppen haben, wird es schwierig sein, jeder Gruppe Rechte zu erteilen. Wenn wir jedoch die Replikation des Domänensystemvolumens auf Domänencontrollern überwachen möchten, ist dies möglicherweise die einzig akzeptable Option, da es keine gute Idee ist, Domänenadministratorrechte für das Überwachungsdienstkonto zu vergeben.

Überwachungsvorlage

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

  • Führt einmal pro Stunde eine automatische Erkennung von Replikationsgruppen durch.
  • Überprüft die Backlog-Größe für jede Gruppe einmal alle 5 Minuten.
  • Enthält einen Auslöser, der eine Warnung ausgibt, wenn die Rückstandsgröße für eine Gruppe 100 Minuten lang mehr als 30 beträgt. Der Auslöser wird als Prototyp beschrieben, der automatisch zu erkannten Gruppen hinzugefügt wird.
  • Erstellt Diagramme zur Backlog-Größe für jede Replikationsgruppe.

Sie können die Vorlage für Zabbix 2.2 herunterladen hier.

Ergebnis

Nachdem wir die Vorlage in Zabbix importiert und ein Konto mit den erforderlichen Rechten erstellt haben, müssen wir nur noch die Skripte auf die Dateiserver kopieren, die wir auf DFSR überwachen möchten, zwei Zeilen zur Agentenkonfiguration hinzufügen und den Zabbix-Agentendienst neu starten und stellen Sie es so ein, dass es als gewünschtes Konto ausgeführt wird. Für die DFSR-Überwachung sind keine weiteren manuellen Einstellungen erforderlich.

Source: habr.com

Kommentar hinzufügen