Простий моніторинг DFS Replication у Zabbix

Запровадження

При досить великій і розподіленій інфраструктурі, яка використовує 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, то можна скористатися описом, як дати доменного облікового запису права на його використання без видачі адміністративних прав, але якщо у нас багато груп реплікації, то видавати права на кожну групу буде важко. Однак якщо ми захочемо моніторити реплікацію Domain System Volume на контролерах домену, це може виявитися єдиним прийнятним варіантом, оскільки давати права адміністратора домену обліку служби моніторингу — не найкраща ідея.

Шаблон моніторингу

Ґрунтуючись на отриманих даних, я створив шаблон, який:

  • Щогодини запускає автоматичне виявлення груп реплікації,
  • Раз на 5 хвилин перевіряє розмір backlog для кожної групи,
  • Містить тригер, що видає алерт при розмірі backlog для будь-якої групи більше 100 протягом 30 хвилин. Тригер описаний як прототип, який автоматично додається до виявлених груп,
  • Будує графіки розміру backlog кожної групи реплікації.

Завантажити шаблон для Zabbix 2.2 можна тут.

Підсумок

Після імпорту шаблону в Zabbix і створення облікового запису з потрібними правами, нам буде достатньо лише скопіювати скрипти на файлові сервери, які ми хочемо моніторити в частині DFSR, додати два рядки в конфігурацію агента на них і перезапустити службу агента Zabbix, налаштувавши її запуск від імені необхідної облікового запису. Жодних інших ручних налаштувань для моніторингу DFSR не потрібно.

Джерело: habr.com

Додати коментар або відгук