Введение
При достаточно большой и распределенной инфраструктуре, использующей 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]").
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 и на выходе выдает список групп, их папок и серверов в нужном формате.
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, настроив ее запуск от имени нужной учетной записи.
Автор: Vengant