Enkel overvåking av DFS-replikering i Zabbix

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 beskrivelse, hvordan gi en domenekonto rettighetene til å bruke den uten å utstede administrative rettigheter, men hvis vi har mange replikeringsgrupper, vil det være vanskelig å utstede rettigheter til hver gruppe. Men i tilfelle vi ønsker å overvåke domenesystemvolumreplikering på domenekontrollere, kan dette være det eneste akseptable alternativet, siden det ikke er en god idé å gi domeneadministratorrettigheter til overvåkingstjenestekontoen.

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 her.

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

Legg til en kommentar