Въведение
При достатъчно голяма и разпределена инфраструктура, използваща DFS като единствена точка за достъп до данни и DFSR за репликация на данни между ЦОД и сървърите на филиалите, възниква въпросът за мониторинг на състоянието на тази репликация.
Случи се така, че почти веднага след започването на използването на DFSR, започнахме внедряването на Zabbix с цел да заменим съществуващия зоопарк от различни инструменти и да приведем мониторинга на инфраструктурата в по-информативен, пълен и логичен вид. Темата на използването на Zabbix за наблюдение на репликацията на DFS ще бъде разгледана.
Първо, трябва да определим какви данни за репликацията на DFS трябва да получаваме, за да контролираме нейното състояние. Най-актуалният индикатор е backlog. В него попадат файлове, които не са били синхронизирани с другите членове на репликационната група. Размерът му може да се види с помощта на утилитата dfsrdiag, която се инсталира заедно с ролята на DFSR. В нормални условия на репликация размерът на backlog трябва да стреми към нула. Следователно, големи стойности на броя файлове в backlog показват проблеми с репликацията.
Сега относно практическата страна на въпроса.
За да мониторим размера на backlog чрез Zabbix Agent, ще ни трябват:
- Скрипт, който ще парсва изхода dfsrdiag за предоставяне в Zabbix на окончателни стойности за размера на backlog,
- Скрипт, който ще определя колко репликационни групи има на сървера, какви папки репликират и какви още сървъри участват в тях (не искаме да въвеждаме всичко това в Zabbix ръчно за всеки сървър, нали?),
- Включването на тези скриптове като UserParameter в конфигурацията на агента Zabbix за последващо извикване от сървъра за мониторинг,
- Стартиране на услугата на агента Zabbix от име на потребител, който има права да чете backlog,
- Шаблон за Zabbix, в който ще бъде настроено откритие на групите, обработка на получените данни и издаване на аларми по тях.
Парсер скрипт
За написването на парсера избрах VBS като най-универсален език, присъстващ във всички версии на Windows Server. Логиката на работа на скрипта е проста: той получава през командния ред името на репликационната група, репликираната папка и имената на изпращащия и получаващия сървър. След това тези параметри се предават в dfsrdiag, и в зависимост от нейния изход се издава:
Броят на файловете — ако е получено съобщение за наличие на файлове в backlog,
0 — ако получиш съобщение за липсващи файлове в backlog („No Backlog“),
-1 — ако получиш съобщение за грешка dfsrdiag при изпълнение на заявка ("[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Скрипт за откриване
За да може Zabbix сам да определи всички групи за репликация, присъстващи на сървъра, и сам да установи всички необходими за заявка параметри (име на папка, имена на съседни сървъри), трябва първо да получим тази информация и след това да я представим в разбираем за Zabbix формат. Форматът, разбран от инструмента за откриване, изглежда така:
"data":[
{
"{#GROUP}":"Share1",
"{#FOLDER}":"Folder1",
"{#SENDING}":"Server1",
"{#RECEIVING}":"Server2"}
...
"{#GROUP}":"ShareN",
"{#FOLDER}":"FolderN",
"{#SENDING}":"Server1",
"{#RECEIVING}":"ServerN"}]}Най-лесно можем да получим необходимата информация чрез WMI, извличайки я от съответните раздели DfsrReplicationGroupConfig. В крайна сметка се създаде скрипт, който изгражда заявка към WMI и на изхода дава списък на групите, техните папки и сървъри в необходимия формат.
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
Съгласен, скриптът, вероятно, не е блестящ с елегантността на кода и нещо в него определено може да се опрости, но основната му функция — да предоставя информация за параметрите на групите за репликация в формат, понятен на Zabbix — я изпълнява успешно.
Включване на скриптове в конфигурацията на агента Zabbix
Тук всичко е пределно просто. Към края на файла с конфигурацията на агента добавяме редовете:
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"
Пътищата, разбира се, коригираме на тези, където се намират скриптовете. Поставих ги в същата папка, където е инсталиран агентът.
След направените промени рестартираме услугата на агента Zabbix.
Промяна на потребителя, от когото работи услугата Zabbix Agent
За да получавате информация чрез dfsrdiag, инструментът трябва да се стартира от името на сметка с администраторски права, както на групите по изпращане, така и на групите по получаване на репликация. Агентската услуга на Zabbix, стартирана по подразбиране под системната сметка, не може да изпълни тази заявка. Създадох отделна сметка в домейна, предоставих ѝ администраторски права на необходимите сървъри и конфигурирах да се стартира услугата от нея на тези сървъри.
Може да се поеме и по друг път: тъй като dfsrdiag, по същество, работи чрез същия WMI, може да се използва , как да се предоставят права на домейна за използването му без предоставяне на администраторски права, но ако имаме много групи за репликация, предоставянето на права на всяка група би било затруднително. Въпреки това, в случай че искаме да наблюдаваме репликацията на Domain System Volume на контролерите на домейнa, това може да се окаже единствено приемлив вариант, тъй като даването на права на администратор на домейна на сметката на мониторинга не е най-добрата идея.
Шаблон за мониторинг
Въз основа на получените данни, създадох шаблон, който:
- На всеки час стартира автоматично откритие на групите за репликация,
- На всеки 5 минути проверява размера на backlog за всяка група,
- Съдържа тригер, генериращ алерт при размер на backlog за някоя група над 100 в продължение на 30 минути. Тригерът е описан като прототип, който автоматично се добавя към откритите групи,
- Изгражда графики на размера на backlog за всяка група за репликация.
Шаблонът за Zabbix 2.2 може да се изтегли .
Резюме
След импортиране на шаблона в Zabbix и създаване на сметка с необходимите права, ще ни е достатъчно само да копираме скриптовете на файловите сървъри, които искаме да наблюдаваме относно DFSR, да добавим две реда в конфигурацията на агента на тях и да рестартираме службата на агента Zabbix, конфигурирайки я да се стартира от името на необходимата сметка. Няма да са нужни други ръчно настройки за наблюдение на DFSR.
Източник: habr.com
