Запровадження
При досить великій і розподіленій інфраструктурі, яка використовує 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. Логіка роботи скрипта проста: він отримує через командний рядок ім'я групи реплікації, папки, що реплікується, і імена sending і receiving серверів. Далі ці параметри передаються в 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 форматі. Формат, який розуміє інструмент discovery, виглядає так:
"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Утиліту слід запускати від імені облікового запису, що має адміністративні права як на sending, так і на receiving членах групи реплікації. Служба агента Zabbix, запущена за умовчанням під системним обліковим записом, такий запит виконати не зможе. Я створив окремий обліковий запис у домені, дав йому адміністративні права на потрібних серверах і налаштував на цих серверах запуск служби з-під нього.
Можна піти й іншим шляхом: оскільки dfsrdiag, по суті, працює через той же WMI, то можна скористатися
Шаблон моніторингу
Ґрунтуючись на отриманих даних, я створив шаблон, який:
- Щогодини запускає автоматичне виявлення груп реплікації,
- Раз на 5 хвилин перевіряє розмір backlog для кожної групи,
- Містить тригер, що видає алерт при розмірі backlog для будь-якої групи більше 100 протягом 30 хвилин. Тригер описаний як прототип, який автоматично додається до виявлених груп,
- Будує графіки розміру backlog кожної групи реплікації.
Завантажити шаблон для Zabbix 2.2 можна
Підсумок
Після імпорту шаблону в Zabbix і створення облікового запису з потрібними правами, нам буде достатньо лише скопіювати скрипти на файлові сервери, які ми хочемо моніторити в частині DFSR, додати два рядки в конфігурацію агента на них і перезапустити службу агента Zabbix, налаштувавши її запуск від імені необхідної облікового запису. Жодних інших ручних налаштувань для моніторингу DFSR не потрібно.
Джерело: habr.com