Jednostavno praćenje DFS replikacije u Zabbixu

Uvod

S dovoljno velikom i distribuiranom infrastrukturom koja koristi DFS kao jedinstvenu točku pristupa podacima i DFSR za replikaciju podataka između podatkovnih centara i servera podružnica, postavlja se pitanje praćenja stanja te replikacije.
Slučajno se poklopilo da smo gotovo odmah nakon početka korištenja DFSR započeli implementaciju Zabbixa s ciljem zamjene postojećeg raznolike skupine alata i dovođenja monitoringa infrastrukture u informativniji, potpuni i logičniji oblik. O tome kako koristiti Zabbix za praćenje replikacije DFS bit će riječ.

Prvo, trebamo odrediti koje podatke o replikaciji DFS trebamo prikupljati za nadzor njenog stanja. Najvažniji pokazatelj je backlog. U njega dolaze datoteke koje nisu sinkronizirane s drugim članovima grupe replikacije. Njegovu veličinu možemo pogledati pomoću alata dfsrdiag, koji se instalira zajedno s DFSR rolom. U normalnom stanju replikacije, veličina backloga treba težiti nuli. Prema tome, velike vrijednosti broja datoteka u backlogu ukazuju na probleme s replikacijom.

Sada o praktičnom dijelu pitanja.

Da bismo pratili veličinu backloga putem Zabbix Agenta, bit će nam potrebni:

  • Skripta koja će parsirati izlaz dfsrdiag za pružanje krajnjih vrijednosti veličine backloga u Zabbix,
  • Skripta koja će odrediti koliko grupa replikacije postoji na serveru, koje mape one replikiraju i koji su još serveri uključeni (ne želimo sve to unositi ručno u Zabbix za svaki server, zar ne?),
  • Unos ovih skripti kao UserParameter u konfiguraciju Zabbix agenta za daljnje pozivanje sa servera za praćenje,
  • Pokretanje usluge Zabbix agenta pod imenom korisnika koji ima ovlasti za čitanje backloga,
  • Predložak za Zabbix, u kojem će biti postavljeno otkrivanje grupa, obrada prikupljenih podataka i izdavanje upozorenja o njima.

Parser skripta

Za pisanje parsera odabrao sam VBS kao najuniverzalniji jezik koji je prisutan u svim verzijama Windows Servera. Logika rada skripte je jednostavna: prima putem komandne linije ime grupe replikacije, mapu koja se replicira, te imena sending i receiving servera. Ti se parametri zatim prosljeđuju u dfsrdiag, a ovisno o njenom izlazu, izdaje se:
Broj datoteka — ako se primi poruka o prisutnosti datoteka u backlogu,
0 — ako je primljena poruka o nedostatku datoteka u backlogu («No Backlog»),
-1 — ako je primljena poruka o grešci dfsrdiag prilikom izvršavanja upita ("[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

Skripta za otkrivanje

Kako bi Zabbix automatski prepoznao sve grupe replikacije prisutne na poslužitelju i sam saznao sve potrebne parametre za upit (ime foldera, imena susjednih servera), trebamo te informacije, prvo, dobiti, a drugo, predstaviti ih u formatu koji Zabbix razumije. Format koji alat za otkrivanje razumije izgleda ovako:

        "data":[
                {
                        "{#GROUP}":"Share1",
                        "{#FOLDER}":"Folder1",
                        "{#SENDING}":"Server1",
                        "{#RECEIVING}":"Server2"}

...

                        "{#GROUP}":"ShareN",
                        "{#FOLDER}":"FolderN",
                        "{#SENDING}":"Server1",
                        "{#RECEIVING}":"ServerN"}]}

Informacije koje nas zanimaju najlakše je dobiti putem WMI, izvlačeći ih iz odgovarajućih sekcija DfsrReplicationGroupConfig. Na kraju je nastala skripta koja formira upit prema WMI i na izlazu daje popis grupa, njihovih foldera i servera u potrebnom formatu.

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

Slažem se, skripta možda nije najsloženija, ali svoju glavnu funkciju — pružanje informacija o parametrima grupa replikacije u formatu razumljivom Zabbixu — obavlja uspješno.

Uključivanje skripti u konfiguraciju Zabbix agenta

Ovdje je sve jednostavno. Na kraj datoteke konfiguracije agenta dodajemo sljedeće retke:

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"

Naravno, putanje prilagodite onima gdje su smještene skripte. Smjestio sam ih u istu mapu gdje je instaliran agent.

Nakon promjene, ponovo pokrećemo Zabbix agenta.

Promjena korisnika pod kojim radi Zabbix Agent

Kako bismo dobili informacije putem dfsrdiag, alat treba pokretati pod računom koji ima administratorska prava na sending i receiving članovima grupe replikacije. Zabbix agent, koji je po defaultu pokrenut pod sistemskim računom, neće moći izvršiti taj zahtjev. Stvorio sam poseban račun u domeni, dao mu administratorska prava na potrebnim poslužiteljima i postavio pokretanje usluge s tog računa na tim poslužiteljima.

Može se otići i drugim putem: budući da dfsrdiag, u osnovi, radi preko istog WMI-ja, može se iskoristiti opis, kako dati domenskom računu prava za njegovu upotrebu bez davanja administratorskih prava, ali ako imamo mnogo grupa replikacije, bit će teško dodijeliti prava svakoj grupi. Međutim, u slučaju da želimo nadzirati replikaciju Domain System Volume na kontrolerima domena, ovo bi mogla biti jedina prihvatljiva opcija, pošto davanje administratorskih prava za monitoring usluge domenskom računu nije najbolja ideja.

Monitoring predložak

Na temelju prikupljenih podataka, stvorio sam predložak koji:

  • Jednom na sat pokreće automatsko otkrivanje grupa replikacije,
  • Jednom svakih 5 minuta provjerava veličinu backlog-a za svaku grupu,
  • Sadrži okidač koji izdaje upozorenje kada veličina backlog-a za bilo koju grupu premaši 100 tijekom 30 minuta. Okidač je opisan kao prototip koji se automatski dodaje otkrivenim grupama,
  • Gradi grafikone veličine backlog-a za svaku grupu replikacije.

Možete preuzeti predložak za Zabbix 2.2 ovdje.

Zaključak

Nakon uvoza predloška u Zabbix i stvaranja računa s potrebnim pravima, bit će dovoljno samo kopirati skripte na datotečne poslužitelje koje želimo nadzirati u vezi DFSR-a, dodati dva retka u konfiguraciju agenta na njima i ponovo pokrenuti Zabbix agenta, postavljajući njegovu aktivaciju pod potrebnim računom. Nema drugih ručnih postavki za nadzor DFSR-a.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster