導入
データへの単一アクセス ポイントとして DFS を使用し、データ センターとブランチ サーバー間のデータ レプリケーションに DFSR を使用する、かなり大規模な分散インフラストラクチャでは、このレプリケーションのステータスを監視するという問題が生じます。
偶然にも、DFSR の使用を開始したほぼ直後に、さまざまなツールの既存のツールを置き換え、インフラストラクチャの監視をより有益で完全かつ論理的な形式にすることを目的として、Zabbix の実装を開始しました。 Zabbix を使用して DFS レプリケーションを監視する方法について説明します。
まず最初に、DFS レプリケーションのステータスを監視するために、DFS レプリケーションに関するどのデータを取得する必要があるかを決定する必要があります。 最も関連性の高い指標はバックログです。 これには、レプリケーション グループの他のメンバーと同期されていないファイルが含まれています。 ユーティリティを使用してサイズを確認できます dfsrdiag、DFSR 役割とともにインストールされます。 通常のレプリケーション状態では、バックログ サイズはゼロに近づくはずです。 したがって、バックログ内の多数のファイルは、レプリケーションに問題があることを示しています。
Zabbix エージェントを通じてバックログのサイズを監視するには、以下が必要です。
- 出力を解析するスクリプト dfsrdiag 最終的なバックログ サイズ値を Zabbix に提供するため、
- サーバー上にレプリケーション グループがいくつあるか、それらがレプリケートするフォルダー、およびそれらに含まれる他のサーバーを決定するスクリプト (サーバーごとにこれらすべてを手動で Zabbix に入力したくありませんよね?)
- これらのスクリプトをUserParameterとしてZabbixエージェント設定に追加し、監視サーバーからの後続の呼び出しを実行します。
- バックログを読み取る権限を持つユーザーとして Zabbix エージェント サービスを開始します。
- Zabbix のテンプレート。グループの検出、受信データの処理、およびグループに対するアラートの発行が設定されます。
スクリプトパーサー
パーサーを作成するために、Windows Server のすべてのバージョンに存在する最も汎用的な言語として VBS を選択しました。 スクリプトのロジックは単純です。コマンド ラインを介して、レプリケーション グループの名前、レプリケート フォルダー、および送信サーバーと受信サーバーの名前を受け取ります。 これらのパラメータは次に渡されます。 dfsrdiag、その出力に応じて次のように生成されます。
ファイルの数 - バックログ内のファイルの存在に関するメッセージを受信した場合、
0 — バックログにファイルがないことに関するメッセージを受信した場合 (「バックログなし」)、
-1 - エラーメッセージを受信した場合 dfsrdiag リクエストの実行時 (「[エラー]」)。
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 が理解できる形式で。 検出ツールが理解できる形式は次のようになります。
"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の場合、このユーティリティは、レプリケーション グループの送信メンバーと受信メンバーの両方に対する管理者権限を持つアカウントで実行する必要があります。 Zabbix エージェント サービスは、デフォルトでシステム アカウントで実行されており、そのようなリクエストを実行できません。 ドメイン内に別のアカウントを作成し、必要なサーバー上で管理者権限を付与し、これらのサーバー上でそのアカウントで実行されるようにサービスを構成しました。
別の道に進むこともできます。 dfsrdiag実際、同じ WMI を通じて動作するため、次のように使用できます。
監視テンプレート
受け取ったデータに基づいて、次のようなテンプレートを作成しました。
- レプリケーション グループの自動検出を XNUMX 時間に XNUMX 回実行します。
- 各グループのバックログ サイズを 5 分ごとにチェックします。
- いずれかのグループのバックログ サイズが 100 分間で 30 を超えた場合にアラートを発行するトリガーが含まれています。 トリガーは、検出されたグループに自動的に追加されるプロトタイプとして説明されています。
- レプリケーション グループごとにバックログ サイズのグラフを作成します。
Zabbix 2.2のテンプレートをダウンロードできます。
合計
テンプレートを Zabbix にインポートし、必要な権限を持つアカウントを作成した後、DFSR を監視するファイル サーバーにスクリプトをコピーし、そのサーバーのエージェント構成に XNUMX 行を追加して、Zabbix エージェント サービスを再起動するだけです。 、目的のアカウントとして実行するように設定します。 DFSR 監視には他の手動設定は必要ありません。
出所: habr.com