Úvod
Při dostatečně velké a rozptýlené infrastruktuře, která používá DFS jako jediný přístupový bod k datům a DFSR pro replikaci dat mezi datovými centry a pobočkovými servery, se vynořuje otázka monitorování stavu této replikace.
Tak se stalo, že téměř hned po zahájení používání DFSR jsme začali implementovat Zabbix s cílem nahradit stávající směsici různých nástrojů a přivést monitorování infrastruktury k informativnějšímu, úplnému a logičtějšímu stavu. O využití Zabbixu pro sledování replikace DFS bude řeč.
Nejprve se musíme rozhodnout, jaká data o replikaci DFS potřebujeme shromažďovat pro kontrolu jejího stavu. Nejaktuálnějším ukazatelem je backlog. Ten zahrnuje soubory, které nebyly synchronizovány s ostatními členy replikace. Jeho velikost lze zjistit pomocí nástroje dfsrdiag, který se instaluje spolu s rolí DFSR. V normálním stavu replikace by velikost backlog měla směřovat k nule. Naopak, vysoké hodnoty počtu souborů v backlogu svědčí o problémech s replikací.
Teď se podíváme na praktickou stránku věci.
Abychom mohli monitorovat velikost backlogu přes Zabbix Agent, budeme potřebovat:
- Skript, který bude analyzovat výstup dfsrdiag pro poskytování konečných hodnot velikosti backlogu do Zabbixu,
- Skript, který určí, kolik replikovaných skupin je na serveru, jaké složky replikují a které další servery do nich patří (nechceme přece zadávat všechna tato data do Zabbixu ručně pro každý server, že?),
- Zahrnutí těchto skriptů jako UserParameter do konfigurace agenta Zabbix pro následné volání z monitorovacího serveru,
- Spuštění Zabbix agenta pod uživatelským jménem, které má práva číst backlog,
- Šablona pro Zabbix, ve které bude nastavena detekce skupin, zpracování přijatých dat a vydávání upozornění na ně.
Skript pro analýzu
Pro napsání parseru jsem zvolil VBS jako nejuniverzálnější jazyk, který je přítomen ve všech verzích Windows Server. Logika skriptu je jednoduchá: přijímá přes příkazový řádek název replikované skupiny, složky a názvy odesílajících a přijímajících serverů. Tyto parametry jsou následně předávány do dfsrdiag, a na základě jejího výstupu je vyhodnoceno:
Počet souborů – pokud bylo obdrženo oznámení o přítomnosti souborů v backlogu,
0 — pokud jste obdrželi zprávu o absenci souborů v backlogu („No Backlog“),
-1 — pokud jste obdrželi zprávu o chybě dfsrdiag při provádění požadavku ("[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 intBackLogSkript pro detekci
Aby Zabbix sám určoval všechny skupiny replikace přítomné na serveru a aby zároveň zjistil všechny potřebné parametry pro požadavek (název složky, názvy sousedních serverů), musíme tyto informace jednak získat, a jednak je představit ve formátu, který Zabbix rozumí. Formát, který chápe nástroj rozpoznávání, vypadá takto:
"data":[
{
"{#GROUP}":"Share1",
"{#FOLDER}":"Folder1",
"{#SENDING}":"Server1",
"{#RECEIVING}":"Server2"}
...
"{#GROUP}":"ShareN",
"{#FOLDER}":"FolderN",
"{#SENDING}":"Server1",
"{#RECEIVING}":"ServerN"}]}Potřebné informace získáme nejlépe přes WMI, vytažením z příslušných sekcí DfsrReplicationGroupConfig. Výsledkem je skript, který vytváří dotaz k WMI a na výstupu poskytuje seznam skupin, jejich složek a serverů v požadovaném formátu.
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
Souhlasím, skript možná nezáří elegance kódu a něco v něm určitě lze zjednodušit, ale jeho hlavní funkci — poskytovat informace o parametrech skupin replikace ve formátu srozumitelném pro Zabbix — plní úspěšně.
Přidání skriptů do konfigurace agenta Zabbix
Zde je to naprosto jednoduché. Na konci konfiguračního souboru agenta přidáme řádky:
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"
Cesty samozřejmě upravíme na ty, kde máme skripty. Dal jsem je do té samé složky, kam je nainstalován agent.
Po provedení změn restartujeme službu agenta Zabbix.
Změna uživatele, pod kterým běží služba Zabbix Agent
Abychom mohli získávat informace prostřednictvím dfsrdiag, je nutné spustit nástroj pod uživatelským účtem, který má administrativní práva jak na sending, tak na receiving členech skupiny replikace. Služba agenta Zabbix, spuštěná ve výchozím nastavení pod systémovým účtem, tento požadavek nemůže splnit. Vytvořil jsem samostatný účet v doméně, dal mu administrativní práva na požadovaných serverech a na těchto serverech jsem nastavil spuštění služby pod ním.
Můžeme jít také jinou cestou: protože dfsrdiag, v podstatě funguje přes stejný WMI, můžeme využít , jak přidělit doménovému uživatelskému účtu práva na jeho použití bez udělení administrativních práv, ale pokud máme mnoho skupin replikace, bude obtížné přidělovat práva na každou skupinu. Nicméně pokud budeme chtít monitorovat replikaci Domain System Volume na doménových kontrolerech, může to být jediná přijatelná varianta, protože udělování práva doménového administrátora účtu monitorovací služby není nejlepší nápad.
Šablona monitorování
Na základě získaných údajů jsem vytvořil šablonu, která:
- Jednou za hodinu spouští automatické zjištění skupin replikace,
- Každých 5 minut kontroluje velikost backlogu pro každou skupinu,
- Obsahuje spouštěč, který generuje upozornění, pokud je velikost backlogu pro nějakou skupinu větší než 100 po dobu 30 minut. Spouštěč je popsán jako prototyp, který se automaticky přidává k zjištěným skupinám,
- Vytváří grafy velikosti backlogu pro každou skupinu replikace.
Šablonu pro Zabbix 2.2 lze stáhnout .
Výsledek
Po importu šablony do Zabbixu a vytvoření účtu s potřebnými právy, stačí pouze zkopírovat skripty na souborové servery, které chceme monitorovat ohledně DFSR, přidat dvě řádky do konfigurace agenta na nich a restartovat službu agenta Zabbix, nastavujíc její spuštění pod potřebným účtem. Nepotřebujeme žádná další manuální nastavení pro monitorování DFSR.
Zdroj: habr.com
