Innledning
Med en ganske stor og distribuert infrastruktur som bruker DFS som et enkelt tilgangspunkt til data og DFSR for datareplikering mellom datasentre og filialservere, oppstår spørsmålet om å overvåke statusen til denne replikeringen.
Tilfeldigvis, nesten umiddelbart etter at vi begynte å bruke DFSR, begynte vi å implementere Zabbix med mål om å erstatte den eksisterende dyrehagen med ulike verktøy og bringe infrastrukturovervåking til en mer informativ, komplett og logisk form. Vi vil snakke om å bruke Zabbix til å overvåke DFS-replikering.
Først av alt må vi bestemme hvilke data om DFS-replikering som må innhentes for å overvåke statusen. Den mest relevante indikatoren er backlog. Den inneholder filer som ikke er synkronisert med andre medlemmer av replikeringsgruppen. Du kan se størrelsen ved hjelp av verktøyet dfsrdiag, installert med DFSR-rollen. I en normal replikeringstilstand bør etterslepstørrelsen nærme seg null. Følgelig indikerer et stort antall filer i backlog problemer med replikering.
Nå om den praktiske siden av saken.
For å overvåke størrelsen på etterslepet gjennom Zabbix Agent, trenger vi:
- Skript som vil analysere utdataene dfsrdiag for å gi endelige etterslepstørrelsesverdier til Zabbix,
- Et skript som vil bestemme hvor mange replikeringsgrupper det er på serveren, hvilke mapper de replikerer og hvilke andre servere som er inkludert i dem (vi ønsker ikke å legge inn alt dette i Zabbix for hånd for hver server, ikke sant?),
- Legge til disse skriptene som UserParameter til Zabbix-agentkonfigurasjonen for påfølgende anrop fra overvåkingsserveren,
- Å starte Zabbix-agenttjenesten som en bruker som har rettigheter til å lese etterslepet,
- En mal for Zabbix, der gjenkjenning av grupper, behandling av mottatte data og utstedelse av varsler om dem vil bli konfigurert.
Skriptparser
For å skrive parseren valgte jeg VBS som det mest universelle språket som finnes i alle versjoner av Windows Server. Logikken til skriptet er enkel: det mottar navnet på replikeringsgruppen, den replikerte mappen og navnene på sende- og mottaksserverne via kommandolinjen. Disse parameterne sendes deretter til dfsrdiag, og avhengig av produksjonen produserer den:
Antall filer - hvis det mottas en melding om tilstedeværelsen av filer i etterslepet,
0 — hvis det mottas en melding om fravær av filer i backloggen ("Ingen backlog"),
-1 - hvis en feilmelding mottas dfsrdiag når du utfører en forespørsel ("[FEIL]").
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
Oppdagelsesskript
For at Zabbix skal bestemme alle replikeringsgruppene som er tilstede på serveren og finne ut alle parameterne som kreves for forespørselen (mappenavn, navn på naboservere), må vi for det første skaffe denne informasjonen, og for det andre presentere den i et format som er forståelig for Zabbix. Formatet som oppdagelsesverktøyet forstår ser slik ut:
"data":[
{
"{#GROUP}":"Share1",
"{#FOLDER}":"Folder1",
"{#SENDING}":"Server1",
"{#RECEIVING}":"Server2"}
...
"{#GROUP}":"ShareN",
"{#FOLDER}":"FolderN",
"{#SENDING}":"Server1",
"{#RECEIVING}":"ServerN"}]}
Den enkleste måten å få informasjonen vi er interessert i er gjennom WMI, ved å trekke den ut fra de tilsvarende delene av DfsrReplicationGroupConfig. Som et resultat ble det født et skript som genererer en forespørsel til WMI og sender ut en liste over grupper, deres mapper og servere i det nødvendige 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
Jeg er enig i at skriptet kanskje ikke skinner med eleganse av kode, og noen ting i det kan sikkert forenkles, men det utfører hovedfunksjonen sin - å gi informasjon om parametrene til replikeringsgrupper i et format som Zabbix forstår.
Legger til skript til Zabbix-agentkonfigurasjonen
Alt her er ekstremt enkelt. Legg til følgende linjer på slutten av agentkonfigurasjonsfilen:
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"
Vi tilpasser selvfølgelig banene til de der vi har manus. Jeg legger dem i samme mappe der agenten er installert.
Etter å ha gjort endringer, start Zabbix-agenttjenesten på nytt.
Endre brukeren som Zabbix Agent-tjenesten kjører under
For å motta informasjon gjennom dfsrdiag, må verktøyet kjøres under en konto som har administrative rettigheter til både avsendende og mottakende medlemmer av replikeringsgruppen. Zabbix-agenttjenesten, som kjører som standard under systemkontoen, vil ikke kunne utføre en slik forespørsel. Jeg opprettet en egen konto i domenet, ga den administrative rettigheter på de nødvendige serverne og konfigurerte tjenesten til å kjøre under den på disse serverne.
Du kan gå en annen vei: fordi dfsrdiag, faktisk fungerer gjennom samme WMI, så kan du bruke
Overvåkingsmal
Basert på dataene jeg mottok, laget jeg en mal som:
- Kjører automatisk oppdagelse av replikeringsgrupper en gang i timen,
- Sjekker etterslepet for hver gruppe en gang hvert 5. minutt,
- Inneholder en utløser som gir et varsel når etterslepet for en gruppe er mer enn 100 i 30 minutter. Utløseren beskrives som en prototype som automatisk legges til oppdagede grupper,
- Bygger grafer for etterslepstørrelse for hver replikeringsgruppe.
Du kan laste ned malen for Zabbix 2.2
Total
Etter å ha importert malen til Zabbix og opprettet en konto med de nødvendige rettighetene, trenger vi bare å kopiere skriptene til filserverne som vi ønsker å overvåke for DFSR, legge til to linjer i agentkonfigurasjonen på dem og starte Zabbix-agenttjenesten på nytt , setter den til å kjøre som ønsket konto. Ingen andre manuelle innstillinger kreves for DFSR-overvåking.
Kilde: www.habr.com