Inleiding
Bij een grote en gedistribueerde infrastructuur die DFS gebruikt als enkel toegangspunt tot gegevens en DFSR voor gegevensreplicatie tussen datacenters en filialen, rijst de vraag hoe de status van deze replicatie te monitoren.
Het toeval wilde dat we bijna direct na de start met DFSR begonnen met het implementeren van Zabbix met als doel een bestaande verscheidenheid aan tools te vervangen en de monitoring van de infrastructuur beter, vollediger en logischer te maken. We zullen het hebben over het gebruik van Zabbix voor het monitoren van de DFS-replicatie.
Allereerst moeten we bepalen welke gegevens over de DFS-replicatie we nodig hebben om de status ervan te controleren. De meest relevante indicator is de backlog. Hierin komen de bestanden terecht die niet zijn gesynchroniseerd met andere leden van de replicatiegroep. De grootte kan worden bekeken met de tool dfsrdiag, die samen met de DFSR-rol wordt geïnstalleerd. In normale replicatiestatus zou de grootte van de backlog naar nul moeten neigen. Grote aantallen bestanden in de backlog wijzen op problemen met de replicatie.
Laten we nu naar de praktische kant van de zaak kijken.
Om de grootte van de backlog via de Zabbix Agent te monitoren, hebben we nodig:
- Een script dat de uitvoer parseert dfsrdiag om de uiteindelijke waarden van de backloggrootte aan Zabbix te leveren,
- Een script dat bepaalt hoeveel replicatiegroepen er op de server zijn, welke mappen ze repliceren en welke andere servers daarbij horen (we willen dit niet handmatig in Zabbix invoeren voor elke server, toch?),
- Het toevoegen van deze scripts als UserParameter in de configuratie van de Zabbix-agent voor latere aanroep vanaf de monitoringserver,
- De Zabbix-agentservice uitvoeren onder een gebruiker met rechten om de backlog te lezen.
- Een sjabloon voor Zabbix waarin de ontdekking van groepen is ingesteld, de ontvangen gegevens worden verwerkt en waarschuwingen worden uitgegeven.
Parser-script
Voor het schrijven van de parser heb ik gekozen voor VBS, als de meest veelzijdige taal die in alle versies van Windows Server aanwezig is. De logica van het script is eenvoudig: het ontvangt via de opdrachtprompt de naam van de replicatiegroep, de te repliceren map en de namen van de verzendende en ontvangende servers. Deze parameters worden vervolgens doorgegeven aan dfsrdiag, en afhankelijk van de uitvoer wordt gegeven:
Het aantal bestanden — als er een melding binnenkomt over de aanwezigheid van bestanden in de backlog.
0 — als er een bericht wordt ontvangen dat er geen bestanden in de backlog zijn ("No Backlog").
-1 — als er een foutmelding is ontvangen dfsrdiag bij het uitvoeren van de aanvraag ("[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 intBackLogDetectiescript
Om ervoor te zorgen dat Zabbix automatisch alle replicatiegroepen op de server identificeert en de benodigde parameters voor de aanvraag (de naam van de map, de namen van de burenservers) zelf bepaalt, moeten we deze informatie ten eerste verkrijgen en ten tweede presenteren in een voor Zabbix begrijpelijk formaat. Het formaat dat het discovery-hulpmiddel begrijpt, ziet er als volgt uit:
"data":[
{
"{#GROUP}":"Share1",
"{#FOLDER}":"Folder1",
"{#SENDING}":"Server1",
"{#RECEIVING}":"Server2"}
...
"{#GROUP}":"ShareN",
"{#FOLDER}":"FolderN",
"{#SENDING}":"Server1",
"{#RECEIVING}":"ServerN"}]}De informatie die wij nodig hebben, kan het gemakkelijkst worden verkregen via WMI, door deze uit de desbetreffende secties van DfsrReplicationGroupConfig te halen. Het resultaat is een script dat een aanvraag naar WMI genereert en een lijst van groepen, hun mappen en servers in het vereiste formaat oplevert.
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 de elegantie van code heeft en dat er zeker iets kan worden vereenvoudigd, maar het vervult zijn hoofdrol – het verstrekken van informatie over de parameters van replicatiegroepen in een formaat dat begrijpelijk is voor Zabbix – met succes.
Scripts integreren in de configuratie van de Zabbix-agent
Hier is het heel eenvoudig. Voeg regels toe aan het einde van het configuratiebestand van de agent:
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"
De paden moeten uiteraard worden aangepast naar waar onze scripts zich bevinden. Ik heb ze in dezelfde map geplaatst als waar de agent is geïnstalleerd.
Na het aanbrengen van wijzigingen herstarten we de Zabbix-agentservice.
Het wijzigen van de gebruiker waarmee de Zabbix-agentservice werkt
Om informatie te ontvangen via dfsrdiag, de tool moet worden uitgevoerd met een account dat administratieve rechten heeft op zowel de sending- als receiving-leden van de replicatiegroep. De Zabbix-agentdienst, die standaard draait onder een systeemaccount, kan die aanvraag niet uitvoeren. Ik heb een apart account in het domein aangemaakt, dit account administratieve rechten gegeven op de benodigde servers en de dienst ingesteld om daaronder te draaien.
Er is ook een andere manier: aangezien dfsrdiag, in wezen, werkt via dezelfde WMI, kan gebruik worden gemaakt van , hoe een domeinaccount rechten te geven voor gebruik zonder administratieve rechten te verstrekken, maar als we veel replicatiegroepen hebben, kan het moeilijk zijn om rechten voor elke groep toe te kennen. Echter, als we de replicatie van de Domain System Volume op de domeincontrollers willen monitoren, kan dit de enige acceptabele optie blijken te zijn, omdat het geven van domeinadminrechten aan het monitoringaccount niet de beste keuze is.
Monitoringtemplate
Op basis van de ontvangen gegevens heb ik een template gemaakt die:
- Elke uur automatisch de ontdekking van replicatiegroepen start,
- Elke 5 minuten de backloggrootte voor elke groep controleert,
- Een trigger bevat die een alert genereert wanneer de backloggrootte voor een groep meer dan 100 is gedurende 30 minuten. De trigger is beschreven als een prototype dat automatisch aan de ontdekte groepen wordt toegevoegd,
- Grafieken van de backloggrootte voor elke replicatiegroep opbouwt.
Het template voor Zabbix 2.2 kan worden gedownload .
Conclusie
Na het importeren van het template in Zabbix en het aanmaken van een account met de benodigde rechten, hoeven we alleen maar de scripts naar de bestandservers te kopiëren die we willen monitoren op het gebied van DFSR, twee regels aan de configuratie van de agent op deze servers toe te voegen en de Zabbix-agentdienst opnieuw op te starten, waarbij deze wordt ingesteld om onder het juiste account te draaien. Geen andere handmatige instellingen voor DFSR-monitoring zijn nodig.
Bron: habr.com
