Pull to refresh

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

Reading time 6 min
Views 14K

Введение


При достаточно большой и распределенной инфраструктуре, использующей 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 & "\root\MicrosoftDFS")
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 Files\Zabbix Agent\get-Backlog.vbs" $1 $2 $3 $4
UserParameter=discovery_dfsr[*],cscript /nologo "C:\Program Files\Zabbix Agent\DFSRDiscovery.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 не потребуется.
Tags:
Hubs:
+7
Comments 1
Comments Comments 1

Articles