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 監控不需要其他手動設定。

來源: www.habr.com

添加評論