Monitorizare simplă a replicării DFS în Zabbix

Introducere

Cu o infrastructură destul de mare și distribuită care folosește DFS ca punct unic de acces la date și DFSR pentru replicarea datelor între centrele de date și serverele de sucursale, se pune problema monitorizării stării acestei replici.
Întâmplător, aproape imediat după ce am început să folosim DFSR, am început să implementăm Zabbix cu scopul de a înlocui grădina zoologică existentă cu diverse instrumente și de a aduce monitorizarea infrastructurii într-o formă mai informativă, completă și logică. Vom vorbi despre utilizarea Zabbix pentru a monitoriza replicarea DFS.

În primul rând, trebuie să decidem ce date despre replicarea DFS trebuie să fie obținute pentru a-i monitoriza starea. Cel mai relevant indicator este restanța. Conține fișiere care nu au fost sincronizate cu alți membri ai grupului de replicare. Puteți vedea dimensiunea acestuia folosind utilitarul dfsrdiag, instalat cu rolul DFSR. Într-o stare normală de replicare, dimensiunea întârzierilor ar trebui să se apropie de zero. În consecință, un număr mare de fișiere din backlog indică probleme cu replicarea.

Acum despre partea practică a problemei.

Pentru a monitoriza dimensiunea restanțelor prin Zabbix Agent, vom avea nevoie de:

  • Script care va analiza rezultatul dfsrdiag pentru a furniza valorile finale ale mărimii restanțelor către Zabbix,
  • Un script care va determina câte grupuri de replicare există pe server, ce foldere replic și ce alte servere sunt incluse în ele (nu vrem să introducem toate acestea în Zabbix manual pentru fiecare server, nu?),
  • Adăugarea acestor scripturi ca UserParameter la configurația agentului Zabbix pentru apelarea ulterioară de la serverul de monitorizare,
  • Pornirea serviciului de agent Zabbix ca utilizator care are drepturi de citire a restanțelor,
  • Un șablon pentru Zabbix, în care se va configura detectarea grupurilor, procesarea datelor primite și emiterea de alerte asupra acestora.

Analizator de scripturi

Pentru a scrie analizatorul, am ales VBS ca cel mai universal limbaj prezent în toate versiunile de Windows Server. Logica scriptului este simplă: primește numele grupului de replicare, folderul replicat și numele serverelor de trimitere și de primire prin linia de comandă. Acești parametri sunt apoi transferați la dfsrdiag, iar în funcție de rezultatul său, produce:
Numărul de fișiere - dacă se primește un mesaj despre prezența fișierelor în stoc,
0 — dacă se primește un mesaj despre absența fișierelor din backlog („Fără Backlog”),
-1 - dacă este primit un mesaj de eroare dfsrdiag la executarea unei cereri ("[EROARE]").

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

Script de descoperire

Pentru ca Zabbix să determine toate grupurile de replicare prezente pe server și să afle toți parametrii necesari pentru cerere (numele folderului, numele serverelor învecinate), trebuie, în primul rând, să obținem aceste informații și, în al doilea rând, să le prezentăm într-un format pe înțeles de Zabbix. Formatul pe care îl înțelege instrumentul de descoperire arată astfel:

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

...

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

Cea mai ușoară modalitate de a obține informațiile care ne interesează este prin WMI, scoțându-le din secțiunile corespunzătoare din DfsrReplicationGroupConfig. Drept urmare, s-a născut un script care generează o solicitare către WMI și scoate o listă de grupuri, folderele și serverele acestora în formatul necesar.

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

Sunt de acord, scriptul poate să nu strălucească cu eleganța codului și unele lucruri din el ar putea fi cu siguranță simplificate, dar își îndeplinește funcția principală - oferind informații despre parametrii grupurilor de replicare într-un format ușor de înțeles de Zabbix.

Adăugarea de scripturi la configurația agentului Zabbix

Totul aici este extrem de simplu. Adăugați următoarele linii la sfârșitul fișierului de configurare a agentului:

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"

Desigur, ajustăm căile la cele în care avem scripturi. Le-am pus în același folder în care este instalat agentul.

După efectuarea modificărilor, reporniți serviciul agent Zabbix.

Schimbarea utilizatorului sub care rulează serviciul Zabbix Agent

Pentru a primi informații prin dfsrdiag, utilitarul trebuie să fie rulat sub un cont care are drepturi administrative atât pentru membrii expeditori, cât și pentru cei primitori ai grupului de replicare. Serviciul agent Zabbix, care rulează implicit sub contul de sistem, nu va putea executa o astfel de solicitare. Am creat un cont separat în domeniu, i-am acordat drepturi administrative pe serverele necesare și am configurat serviciul să ruleze sub acesta pe aceste servere.

Poți merge pe altă cale: pentru că dfsrdiag, de fapt, funcționează prin același WMI, apoi puteți utiliza Descriere, cum să acordăm unui cont de domeniu drepturile de utilizare fără a emite drepturi administrative, dar dacă avem multe grupuri de replicare, atunci emiterea drepturilor fiecărui grup va fi dificilă. Cu toate acestea, în cazul în care dorim să monitorizăm replicarea volumului sistemului de domeniu pe controlerele de domeniu, aceasta poate fi singura opțiune acceptabilă, deoarece acordarea drepturilor de administrator de domeniu contului de serviciu de monitorizare nu este o idee bună.

Șablon de monitorizare

Pe baza datelor primite, am creat un șablon care:

  • Rulează descoperirea automată a grupurilor de replicare o dată pe oră,
  • Verifică dimensiunea așteptărilor pentru fiecare grup o dată la 5 minute,
  • Conține un declanșator care emite o alertă atunci când dimensiunea întârzierilor pentru orice grup este mai mare de 100 timp de 30 de minute. Declanșatorul este descris ca un prototip care este adăugat automat la grupurile detectate,
  • Construiește grafice privind dimensiunea stocului de așteptare pentru fiecare grup de replicare.

Puteți descărca șablonul pentru Zabbix 2.2 aici.

Total

După importarea șablonului în Zabbix și crearea unui cont cu drepturile necesare, va trebui doar să copiem scripturile pe serverele de fișiere pe care dorim să le monitorizăm pentru DFSR, să adăugăm două linii la configurația agentului de pe ele și să repornim serviciul agent Zabbix. , setându-l să ruleze ca cont dorit. Nu sunt necesare alte setări manuale pentru monitorizarea DFSR.

Sursa: www.habr.com

Adauga un comentariu