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
Ö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
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