Enostavno spremljanje replikacije DFS v Zabbixu

Predstavitev

Z dokaj veliko in porazdeljeno infrastrukturo, ki uporablja DFS kot enotno točko dostopa do podatkov in DFSR za replikacijo podatkov med podatkovnimi centri in podružničnimi strežniki, se postavlja vprašanje spremljanja statusa te replikacije.
Po naključju smo skoraj takoj po začetku uporabe DFSR začeli z implementacijo Zabbixa s ciljem nadomestiti obstoječi živalski vrt različnih orodij in spraviti spremljanje infrastrukture v bolj informativno, popolno in logično obliko. Govorili bomo o uporabi Zabbixa za spremljanje replikacije DFS.

Najprej se moramo odločiti, katere podatke o replikaciji DFS je treba pridobiti za spremljanje njenega statusa. Najpomembnejši indikator je zaostanek. Vsebuje datoteke, ki niso bile sinhronizirane z drugimi člani skupine za podvajanje. Njegovo velikost si lahko ogledate s pomočjo pripomočka dfsrdiag, nameščen z vlogo DFSR. V normalnem stanju podvajanja bi se morala velikost zaostanka približati ničli. V skladu s tem veliko število datotek v zaostanku kaže na težave s podvajanjem.

Zdaj o praktični strani vprašanja.

Za spremljanje velikosti zaostankov prek agenta Zabbix bomo potrebovali:

  • Skript, ki bo razčlenil izhod dfsrdiag za zagotavljanje končnih vrednosti velikosti zaostankov Zabbixu,
  • Skript, ki bo določil, koliko replikacijskih skupin je na strežniku, katere mape replicirajo in kateri drugi strežniki so vključeni v njih (ne želimo vsega tega ročno vnesti v Zabbix za vsak strežnik, kajne?),
  • Dodajanje teh skriptov kot UserParameter v konfiguracijo agenta Zabbix za poznejši klic s strežnika za spremljanje,
  • Zagon agentske storitve Zabbix kot uporabnik, ki ima pravice do branja zaostankov,
  • Predloga za Zabbix, v kateri bo konfigurirano zaznavanje skupin, obdelava prejetih podatkov in izdajanje opozoril nanje.

Razčlenjevalnik skriptov

Za pisanje razčlenjevalnika sem izbral VBS kot najbolj univerzalen jezik, ki je prisoten v vseh različicah sistema Windows Server. Logika skripta je preprosta: prek ukazne vrstice prejme ime replikacijske skupine, podvojeno mapo ter imena pošiljateljskega in sprejemnega strežnika. Ti parametri se nato posredujejo v dfsrdiag, in glede na svojo proizvodnjo proizvede:
Število datotek - če prejmete sporočilo o prisotnosti datotek v zaostanku,
0 — če prejmete sporočilo o odsotnosti datotek v zaostanku (»No Backlog«),
-1 - če je prejeto sporočilo o napaki dfsrdiag pri izvajanju zahteve ("[NAPAKA]").

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

Scenarij za odkrivanje

Da bi lahko Zabbix določil vse replikacijske skupine, ki so prisotne na strežniku, in izvedel vse parametre, potrebne za zahtevo (ime mape, imena sosednjih strežnikov), moramo najprej pridobiti te informacije in drugič jih predstaviti v obliki, ki je razumljiva Zabbixu. Format, ki ga razume orodje za odkrivanje, je videti takole:

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

...

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

Informacije, ki nas zanimajo, najlažje dobimo prek WMI, tako da jih potegnemo iz ustreznih razdelkov DfsrReplicationGroupConfig. Kot rezultat se je rodil skript, ki ustvari zahtevo za WMI in izpiše seznam skupin, njihovih map in strežnikov v zahtevani obliki.

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

Strinjam se, skript morda ne sije z eleganco kode in nekatere stvari v njem bi zagotovo lahko poenostavili, vendar opravlja svojo glavno funkcijo - zagotavlja informacije o parametrih replikacijskih skupin v obliki, ki jo Zabbix razume.

Dodajanje skriptov v konfiguracijo agenta Zabbix

Tukaj je vse izjemno preprosto. Na konec konfiguracijske datoteke agenta dodajte naslednje vrstice:

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"

Seveda poti prilagodimo tistim, kjer imamo skripte. Dam jih v isto mapo, kjer je nameščen agent.

Po spremembah znova zaženite agentsko storitev Zabbix.

Spreminjanje uporabnika, pod katerim se izvaja storitev Zabbix Agent

Za prejemanje informacij prek dfsrdiag, mora biti pripomoček zagnan pod računom, ki ima skrbniške pravice za pošiljanje in sprejemanje članov replikacijske skupine. Storitev agenta Zabbix, ki se privzeto izvaja pod sistemskim računom, ne bo mogla izvesti takšne zahteve. Ustvaril sem ločen račun v domeni, mu podelil skrbniške pravice na potrebnih strežnikih in konfiguriral storitev za izvajanje pod njim na teh strežnikih.

Lahko greš drugače: ker dfsrdiag, pravzaprav deluje prek istega WMI, potem lahko uporabite opis, kako domenskemu računu podeliti pravice za uporabo, ne da bi izdali skrbniške pravice, če pa imamo veliko replikacijskih skupin, bo izdajanje pravic vsaki skupini težavno. Vendar pa je v primeru, da želimo spremljati replikacijo domenskega sistemskega nosilca na krmilnikih domene, to morda edina sprejemljiva možnost, saj dodelitev skrbniških pravic domene računu storitve nadzora ni dobra ideja.

Predloga za spremljanje

Na podlagi prejetih podatkov sem ustvaril predlogo, ki:

  • Zažene samodejno odkrivanje replikacijskih skupin enkrat na uro,
  • Vsakih 5 minut preveri velikost zaostanka za vsako skupino,
  • Vsebuje sprožilec, ki izda opozorilo, ko je velikost zaostanka za katero koli skupino večja od 100 za 30 minut. Sprožilec je opisan kot prototip, ki se samodejno doda zaznanim skupinam,
  • Gradi grafe velikosti zaostankov za vsako skupino podvajanja.

Lahko prenesete predlogo za Zabbix 2.2 tukaj.

Skupaj

Ko uvozimo predlogo v Zabbix in ustvarimo račun s potrebnimi pravicami, bomo morali samo kopirati skripte na datotečne strežnike, ki jih želimo spremljati za DFSR, dodati dve vrstici v konfiguracijo agenta na njih in znova zagnati storitev agenta Zabbix in ga nastavite tako, da se izvaja kot želeni račun. Za spremljanje DFSR niso potrebne druge ročne nastavitve.

Vir: www.habr.com

Dodaj komentar