Eenvoudige monitoring van DFS-replicatie in Zabbix

Introductie

Met een vrij grote en gedistribueerde infrastructuur die DFS gebruikt als enig toegangspunt tot gegevens en DFSR voor gegevensreplicatie tussen datacentra en filiaalservers, rijst de vraag hoe de status van deze replicatie moet worden bewaakt.
Toevallig zijn we vrijwel onmiddellijk nadat we DFSR begonnen te gebruiken, begonnen met de implementatie van Zabbix met als doel de bestaande dierentuin te vervangen door verschillende tools en de monitoring van de infrastructuur naar een meer informatieve, complete en logische vorm te brengen. We zullen het hebben over het gebruik van Zabbix om DFS-replicatie te controleren.

Allereerst moeten we beslissen welke gegevens over DFS-replicatie moeten worden verkregen om de status ervan te controleren. De meest relevante indicator is de achterstand. Het bevat bestanden die niet zijn gesynchroniseerd met andere leden van de replicatiegroep. U kunt de grootte ervan bekijken met behulp van het hulpprogramma dfsrdiag, geïnstalleerd met de DFSR-rol. In een normale replicatiestatus zou de backloggrootte bijna nul moeten zijn. Dienovereenkomstig duiden grote aantallen bestanden in de achterstand op problemen met replicatie.

Nu over de praktische kant van de kwestie.

Om de omvang van de achterstand via Zabbix Agent te monitoren, hebben we het volgende nodig:

  • Script dat de uitvoer parseert dfsrdiag om definitieve waarden voor de achterstandsgrootte aan Zabbix te verstrekken,
  • Een script dat bepaalt hoeveel replicatiegroepen er op de server zijn, welke mappen ze repliceren en welke andere servers daarin zijn opgenomen (we willen dit toch niet allemaal handmatig in Zabbix invoeren voor elke server?),
  • Door deze scripts als UserParameter toe te voegen aan de Zabbix-agentconfiguratie voor later bellen vanaf de monitoringserver,
  • De Zabbix-agentservice starten als een gebruiker die rechten heeft om de achterstand te lezen,
  • Een template voor Zabbix, waarin het detecteren van groepen, het verwerken van ontvangen gegevens en het geven van waarschuwingen daarop wordt geconfigureerd.

Scriptparser

Om de parser te schrijven, heb ik VBS gekozen als de meest universele taal die in alle versies van Windows Server aanwezig is. De logica van het script is eenvoudig: het ontvangt de naam van de replicatiegroep, de gerepliceerde map en de namen van de verzendende en ontvangende servers via de opdrachtregel. Deze parameters worden vervolgens doorgegeven aan dfsrdiag, en afhankelijk van de uitvoer produceert het:
Aantal bestanden - als er een bericht wordt ontvangen over de aanwezigheid van bestanden in de backlog,
0 — als er een bericht wordt ontvangen over de afwezigheid van bestanden in de achterstand (“Geen achterstand”),
-1 - als er een foutmelding wordt ontvangen dfsrdiag bij het uitvoeren van een verzoek ("[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

Ontdekkingsscript

Om ervoor te zorgen dat Zabbix alle replicatiegroepen op de server kan bepalen en alle parameters kan achterhalen die nodig zijn voor het verzoek (mapnaam, namen van naburige servers), moeten we eerst deze informatie verkrijgen en ten tweede deze presenteren in een formaat dat begrijpelijk is voor Zabbix. Het formaat dat de detectietool begrijpt, ziet er als volgt uit:

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

...

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

De eenvoudigste manier om de informatie te verkrijgen waarin we geïnteresseerd zijn, is via WMI, door deze uit de overeenkomstige secties van DfsrReplicationGroupConfig te halen. Als gevolg hiervan werd een script geboren dat een verzoek aan WMI genereert en een lijst met groepen, hun mappen en servers in het vereiste formaat uitvoert.

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

Ik ben het ermee eens dat het script misschien niet schittert met de elegantie van de code en dat sommige dingen erin zeker vereenvoudigd kunnen worden, maar het vervult zijn hoofdfunctie: het verstrekken van informatie over de parameters van replicatiegroepen in een formaat dat begrijpelijk is voor Zabbix.

Scripts toevoegen aan de Zabbix-agentconfiguratie

Alles is hier uiterst eenvoudig. Voeg de volgende regels toe aan het einde van het agentconfiguratiebestand:

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"

Uiteraard passen we de paden aan aan die waar we scripts hebben. Ik plaats ze in dezelfde map waarin de agent is geïnstalleerd.

Nadat u wijzigingen hebt aangebracht, start u de Zabbix-agentservice opnieuw op.

Het wijzigen van de gebruiker waaronder de Zabbix Agent-service draait

Om informatie te ontvangen via dfsrdiag, moet het hulpprogramma worden uitgevoerd onder een account dat beheerdersrechten heeft voor zowel de verzendende als de ontvangende leden van de replicatiegroep. De Zabbix-agentservice, die standaard onder het systeemaccount draait, kan een dergelijk verzoek niet uitvoeren. Ik heb een apart account in het domein aangemaakt, beheerdersrechten gegeven op de benodigde servers en de service geconfigureerd zodat deze op deze servers wordt uitgevoerd.

Je kunt het ook anders doen: omdat dfsrdiagwerkt in feite via dezelfde WMI, die u vervolgens kunt gebruiken Omschrijving, hoe je een domeinaccount de rechten kunt geven om het te gebruiken zonder beheerdersrechten te verlenen, maar als we veel replicatiegroepen hebben, zal het moeilijk zijn om rechten aan elke groep te verlenen. Als we echter de replicatie van het domeinsysteemvolume op domeincontrollers willen monitoren, kan dit de enige acceptabele optie zijn, aangezien het geven van domeinbeheerdersrechten aan het monitoringserviceaccount geen goed idee is.

Bewakingssjabloon

Op basis van de gegevens die ik heb ontvangen, heb ik een sjabloon gemaakt dat:

  • Voert één keer per uur automatische detectie van replicatiegroepen uit,
  • Controleert iedere 5 minuten de achterstandsgrootte per groep,
  • Bevat een trigger die een waarschuwing geeft wanneer de achterstand voor een groep gedurende 100 minuten groter is dan 30. De trigger wordt beschreven als een prototype dat automatisch wordt toegevoegd aan gedetecteerde groepen,
  • Bouwt grafieken voor de backloggrootte voor elke replicatiegroep.

U kunt de sjabloon voor Zabbix 2.2 downloaden hier.

Totaal

Nadat we de sjabloon in Zabbix hebben geïmporteerd en een account met de benodigde rechten hebben aangemaakt, hoeven we alleen de scripts te kopiëren naar de bestandsservers die we willen controleren op DFSR, twee regels toe te voegen aan de agentconfiguratie daarop en de Zabbix-agentservice opnieuw te starten , zodat het als het gewenste account wordt uitgevoerd. Er zijn geen andere handmatige instellingen vereist voor DFSR-monitoring.

Bron: www.habr.com

Voeg een reactie