Enkel övervakning av DFS-replikering i Zabbix

Inledning

Med en ganska stor och distribuerad infrastruktur som använder DFS som en enda åtkomstpunkt till data och DFSR för datareplikering mellan datacenter och filialservrar, uppstår frågan om att övervaka statusen för denna replikering.
Av en slump, nästan direkt efter att vi började använda DFSR, började vi implementera Zabbix med målet att ersätta den befintliga djurparken med olika verktyg och föra infrastrukturövervakning till en mer informativ, komplett och logisk form. Vi kommer att prata om att använda Zabbix för att övervaka DFS-replikering.

Först och främst måste vi bestämma vilken data om DFS-replikering som behöver erhållas för att övervaka dess status. Den mest relevanta indikatorn är eftersläpning. Den innehåller filer som inte har synkroniserats med andra medlemmar i replikeringsgruppen. Du kan se dess storlek med hjälp av verktyget dfsrdiag, installerad med rollen DFSR. I ett normalt replikeringstillstånd bör eftersläpningsstorleken närma sig noll. Följaktligen indikerar ett stort antal filer i backloggen problem med replikering.

Nu om den praktiska sidan av frågan.

För att övervaka storleken på eftersläpningen genom Zabbix Agent behöver vi:

  • Skript som kommer att analysera utdata dfsrdiag för att ge Zabbix slutgiltiga eftersläpningsstorleksvärden,
  • Ett skript som avgör hur många replikeringsgrupper som finns på servern, vilka mappar de replikerar och vilka andra servrar som ingår i dem (vi vill inte lägga in allt detta i Zabbix för hand för varje server, eller hur?),
  • Lägga till dessa skript som UserParameter till Zabbix-agentkonfigurationen för efterföljande anrop från övervakningsservern,
  • Starta Zabbix-agenttjänsten som en användare som har rättigheter att läsa eftersläpningen,
  • En mall för Zabbix, där detektering av grupper, bearbetning av mottagen data och utfärdande av varningar om dem kommer att konfigureras.

Skripttolkare

För att skriva parsern valde jag VBS som det mest universella språket som finns i alla versioner av Windows Server. Logiken i skriptet är enkel: det tar emot namnet på replikeringsgruppen, den replikerade mappen och namnen på de sändande och mottagande servrarna via kommandoraden. Dessa parametrar skickas sedan till dfsrdiag, och beroende på dess produktion producerar den:
Antal filer - om ett meddelande tas emot om förekomsten av filer i backloggen,
0 — om ett meddelande tas emot om frånvaron av filer i backloggen ("Ingen eftersläpning"),
-1 - om ett felmeddelande tas emot dfsrdiag när en begäran utförs ("[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 script

För att Zabbix ska kunna fastställa alla replikeringsgrupper som finns på servern och ta reda på alla parametrar som krävs för begäran (mappnamn, namn på närliggande servrar), måste vi för det första erhålla denna information och för det andra presentera den i ett format som Zabbix förstår. Formatet som upptäcktsverktyget förstår ser ut så här:

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

...

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

Det enklaste sättet att få informationen vi är intresserade av är genom WMI, dra ut den från motsvarande sektioner av DfsrReplicationGroupConfig. Som ett resultat föddes ett skript som genererar en begäran till WMI och matar ut en lista över grupper, deras mappar och servrar i det format som krävs.

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

Jag håller med, skriptet kanske inte lyser med elegans av kod och vissa saker i det kan säkert förenklas, men det utför sin huvudsakliga funktion - att tillhandahålla information om parametrarna för replikeringsgrupper i ett format som Zabbix förstår.

Lägger till skript till Zabbix-agentkonfigurationen

Allt här är extremt enkelt. Lägg till följande rader i slutet av agentens konfigurationsfil:

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"

Självklart anpassar vi vägarna till de där vi har manus. Jag lägger dem i samma mapp där agenten är installerad.

När du har gjort ändringar, starta om Zabbix-agenttjänsten.

Ändra den användare som Zabbix Agent-tjänsten körs under

För att få information genom dfsrdiag, måste verktyget köras under ett konto som har administrativa rättigheter till både skickande och mottagande medlemmar i replikeringsgruppen. Zabbix-agenttjänsten, som körs som standard under systemkontot, kommer inte att kunna utföra en sådan begäran. Jag skapade ett separat konto i domänen, gav det administrativa rättigheter på de nödvändiga servrarna och konfigurerade tjänsten att köras under den på dessa servrar.

Du kan gå en annan väg: eftersom dfsrdiag, faktiskt, fungerar genom samma WMI, då kan du använda beskrivning, hur man ger ett domänkonto rättigheter att använda det utan att utfärda administrativa rättigheter, men om vi har många replikeringsgrupper blir det svårt att utfärda rättigheter till varje grupp. Men om vi vill övervaka domänsystemvolymreplikering på domänkontrollanter kan detta vara det enda acceptabla alternativet, eftersom det inte är en bra idé att ge domänadministratörsrättigheter till övervakningstjänstkontot.

Övervakningsmall

Baserat på uppgifterna jag fick skapade jag en mall som:

  • Kör automatisk upptäckt av replikeringsgrupper en gång i timmen,
  • Kontrollerar eftersläpningsstorleken för varje grupp en gång var 5:e minut,
  • Innehåller en utlösare som avger en varning när eftersläpningsstorleken för en grupp är mer än 100 under 30 minuter. Utlösaren beskrivs som en prototyp som automatiskt läggs till i upptäckta grupper,
  • Bygger grafer för eftersläpningsstorlek för varje replikeringsgrupp.

Du kan ladda ner mallen för Zabbix 2.2 här.

Totalt

Efter att ha importerat mallen till Zabbix och skapat ett konto med nödvändiga rättigheter behöver vi bara kopiera skripten till filservrarna som vi vill övervaka för DFSR, lägga till två rader i agentkonfigurationen på dem och starta om Zabbix agenttjänst , ställ in att det körs som önskat konto. Inga andra manuella inställningar krävs för DFSR-övervakning.

Källa: will.com

Lägg en kommentar