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