Enkel övervakning av DFS-replikering i Zabbix

Introduktion

Vid en tillräckligt stor och distribuerad infrastruktur som använder DFS som en enhetlig accesspunkt för data och DFSR för replikering av data mellan datacenter och filialservrar, uppstår frågan om övervakning av tillståndet för denna replikering.
Det råkade så att nästan omedelbart efter att vi började använda DFSR, påbörjade vi implementeringen av Zabbix för att ersätta den befintliga djungeln av olika verktyg och göra övervakningen av infrastrukturen mer informativ, komplett och logisk. Vi kommer att diskutera användningen av Zabbix för att övervaka DFS-replikeringen.

Först och främst måste vi avgöra vilken data om DFS-replikeringen vi behöver hämta för att kontrollera dess tillstånd. Den mest relevanta indikatorn är backlog. Det omfattar filer som inte har synkroniserats med andra medlemmar i replikationsgruppen. Vi kan se dess storlek med hjälp av verktyget dfsrdiag, som installeras tillsammans med DFSR-rollen. I ett normalt tillstånd av replikering bör storleken på backlog sträva efter att vara noll. Stora värden av antalet filer i backlog indikerar därför problem med replikeringen.

Nu till den praktiska sidan av frågan.

För att övervaka storleken på backlog genom Zabbix Agent behöver vi:

  • Ett skript som kommer att parsa utdata dfsrdiag för att tillhandahålla slutvärden för storleken på backlog till Zabbix,
  • Ett skript som kommer att avgöra hur många replikationsgrupper som finns på servern, vilka mappar de replicerar och vilka andra servrar som ingår (vi vill ju inte mata in allt detta i Zabbix för varje server, eller hur?).
  • Inkludering av dessa skript som UserParameter i Zabbix-agentens konfiguration för senare anrop från övervakningsservern,
  • Körning av Zabbix-agentens tjänst under en användare som har rättigheter att läsa backlog,
  • En mall för Zabbix där upptäckten av grupper, bearbetning av mottagna data och utfärdande av varningar kommer att konfigureras.

Parser-skript

För att skriva parse-skriptet valde jag VBS som det mest mångsidiga språket som finns i alla versioner av Windows Server. Logiken i skriptet är enkel: det tar emot via kommandoraden namnet på replikationsgruppen, den replikerade mappen och namnen på avsändar- och mottagarservrarna. Därefter överförs dessa parametrar till dfsrdiag, och beroende på dess utdata skapas:
Antalet filer - om ett meddelande om förekomst av filer i backlog mottas.
0 — om meddelandet "No Backlog" visas om det inte finns några filer i backloggen,
-1 — om ett felmeddelande har mottagits dfsrdiag vid utförandet av begäran ("[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

Upptäcktskript

För att Zabbix ska kunna upptäcka alla replikationsgrupper som finns på servern och själv ta reda på alla nödvändiga parametrar för begäran (mappnamn, namn på närstående servrar), behöver vi först få denna information och sedan 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"}]}

Den information vi är intresserade av kan enklast hämtas via WMI, genom att hämta den från de aktuella sektionerna i DfsrReplicationGroupConfig. Resultatet blev ett skript som genererar en begäran till WMI och ger en lista över grupper, deras mappar och servrar i det önskade formatet.

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 om att skriptet kanske inte glänser med elegans och att vissa delar säkert kan förenklas, men det uppfyller sin huvudfunktion — att leverera information om parametrarna för replikationsgrupper i ett format som är förståeligt för Zabbix.

Integrering av skript i Zabbix-agentens konfiguration

Här är det enkelt. Vi lägger till rader i slutet av agentkonfigurationsfilen:

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 justerar vi sökvägarna till där våra skript ligger. Jag har lagt dem i samma mapp som agenten är installerad.

Efter att ha gjort ändringarna startar vi om Zabbix-agentens tjänst.

Ändring av användare för Zabbix-agentens tjänst

För att kunna få information genom dfsrdiag, verktyget måste köras av ett konto med administrativa rättigheter både på sending och receiving medlemmarna i replikeringsgruppen. Zabbix-agenttjänsten, som som standard körs under systemkontot, kan inte 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 det kontot.

Det finns också en annan väg att gå: eftersom dfsrdiag, i grunden fungerar via samma WMI, så kan du använda beskrivningen, hur man ger domänekontot rätt att använda den utan att ge administrativa rättigheter, men om vi har många replikeringsgrupper, blir det besvärligt att ge rättigheter för varje grupp. Men om vi vill övervaka replikeringen av Domain System Volume på domänkontrollerna, kan det vara det enda acceptabla alternativet, eftersom det kanske inte är den bästa idén att ge domänadministratörsrättigheter till tjänstekontot för övervakning.

Övervakningsmall

Baserat på de insamlade uppgifterna skapade jag en mall som:

  • Varsannat timme kör automatisk upptäckning av replikeringsgrupper,
  • Varsjätte minut kontrollerar storleken på backlogg för varje grupp,
  • Innehåller en trigger som ger ett alert om backloggstorleken för någon grupp överstiger 100 under 30 minuter. Triggern beskrivs som en prototyp som automatiskt läggs till de upptäckta grupperna,
  • Bygger diagram över backloggstorleken för varje replikeringsgrupp.

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

Resultat

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 vad gäller DFSR, lägga till två rader i agentkonfigurationen på dem och starta om Zabbix-agenttjänsten, konfigurerad att starta under det nödvändiga kontot. Inga andra manuella inställningar för övervakning av DFSR krävs.

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster