Zabbix中DFS Replication的简单监控

介绍

对于相当大的分布式基础架构,使用 DFS 作为数据的单点访问,并使用 DFSR 在数据中心和分支服务器之间进行数据复制,因此出现了监视此复制状态的问题。
巧合的是,几乎在我们开始使用 DFSR 后,我们就开始实施 Zabbix,目标是取代现有的各种工具,并使基础设施监控变得更加信息丰富、完整和逻辑化。 我们将讨论使用 Zabbix 来监控 DFS 复制。

首先,我们需要决定需要获取DFS复制的哪些数据来监控其状态。 最相关的指标是积压。 它包含尚未与复制组的其他成员同步的文件。 您可以使用该实用程序查看其大小 dfsr诊断,使用 DFSR 角色安装。 在正常的复制状态下,积压的大小应接近于零。 因此,积压中的大量文件表明复制存在问题。

现在谈谈问题的实际方面。

为了通过 Zabbix Agent 监控积压的大小,我们需要:

  • 将解析输出的脚本 dfsr诊断 向 Zabbix 提供最终的待办事项大小值,
  • 一个脚本,用于确定服务器上有多少个复制组、它们复制哪些文件夹以及其中包含哪些其他服务器(我们不想为每个服务器手动将所有这些输入到 Zabbix 中,对吧?),
  • 将这些脚本作为 UserParameter 添加到 Zabbix Agent 配置中,以便后续从监控服务器调用,
  • 以有权读取积压的用户身份启动 Zabbix 代理服务,
  • Zabbix 的模板,其中将配置组的检测、接收数据的处理以及对它们发出警报。

脚本解析器

为了编写解析器,我选择 VBS 作为所有版本的 Windows Server 中最通用的语言。 该脚本的逻辑很简单:它通过命令行接收复制组的名称、复制的文件夹以及发送和接收服务器的名称。 然后将这些参数传递给 dfsr诊断,并根据其输出产生:
文件数量 - 如果收到有关积压中存在文件的消息,
0 — 如果收到有关积压中没有文件的消息(“无积压”),
-1 - 如果收到错误消息 dfsr诊断 执行请求时(“[错误]”)。

获取-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 服务运行的用户

为了通过接收信息 dfsr诊断,该实用程序必须在对复制组的发送和接收成员都具有管理权限的帐户下运行。 默认情况下在系统帐户下运行的 Zabbix 代理服务将无法执行此类请求。 我在域中创建了一个单独的帐户,授予其对必要服务器的管理权限,并将服务配置为在这些服务器上在该帐户下运行。

你可以走另一条路:因为 dfsr诊断,事实上,通过相同的WMI工作,那么你可以使用 描述,如何在不授予管理权限的情况下赋予域帐户使用它的权限,但是如果我们有很多复制组,那么向每个组授予权限就会很困难。 但是,如果我们想要监视域控制器上的域系统卷复制,这可能是唯一可接受的选项,因为向监视服务帐户授予域管理员权限并不是一个好主意。

监控模板

根据我收到的数据,我创建了一个模板:

  • 每小时运行一次自动发现复制组,
  • 每 5 分钟检查一次每个组的待办事项大小,
  • 包含一个触发器,当任何组的待办事项大小超过 100 且持续 30 分钟时,该触发器会发出警报。 触发器被描述为自动添加到检测到的组中的原型,
  • 为每个复制组构建待办事项大小图表。

您可以下载 Zabbix 2.2 的模板 这里.

将模板导入 Zabbix 并创建具有必要权限的帐户后,我们只需将脚本复制到要监控 DFSR 的文件服务器,在其上的代理配置中添加两行,然后重新启动 Zabbix 代理服务,将其设置为作为所需帐户运行。 DFSR 监控不需要其他手动设置。

来源: habr.com

添加评论