はじめに
DFSを単一のデータアクセスポイントとして使用し、データセンターとブランチサーバー間のデータレプリケーションにDFSRを使用する十分に大規模な分散インフラストラクチャでは、このレプリケーションのステータスを監視する問題が発生します。
そのため、DFSRの使用開始のほぼ直後に、Zabbixの実装を開始し、既存の動物園をさまざまなツールに置き換えて、インフラストラクチャの監視をより有益で完全かつ論理的なビューにすることができました。 Zabbixを使用したDFSレプリケーションの監視について説明します。
まず、ステータスを監視するために必要なDFSレプリケーションのデータを決定する必要があります。 最も関連する指標はバックログです。 レプリケーショングループの他のメンバーと同期されなかったファイルは、そのグループに分類されます。 そのサイズは、DFSRロールと共にインストールされるdfsrdiagユーティリティで確認できます。 レプリケーションの通常の状態では、バックログのサイズはゼロになります。 したがって、バックログ内のファイル数の値が大きい場合、レプリケーションに問題があることを示しています。
次に、問題の実際的な側面について説明します。
Zabbixエージェントを介してバックログのサイズを監視するには、次のものが必要です。
- dfsrdiagの出力を解析して、バックログサイズの最終値をZabbixに提供するスクリプト。
- サーバー上に存在するレプリケーショングループの数、それらが複製するフォルダー、およびそれらに含まれる他のサーバーを決定するスクリプト(これらのすべてを各サーバーの手でZabbixに駆動したくないのですか?)
- 監視サーバーからの後続の呼び出しのために、これらのスクリプトをZabbixエージェント設定にUserParameterとして配置し、
- バックログを読み取る権利を持つユーザーとしてZabbixエージェントサービスを開始し、
- グループの検出、受信データの処理、およびそれらに対するアラートの発行が設定されるZabbixのテンプレート。
スクリプトパーサー
パーサーを作成するために、私はVBSをWindows Serverのすべてのバージョンで最も一般的な言語として選択しました。 スクリプトのロジックは単純です。コマンドラインを通じて、レプリケーショングループの名前、レプリケートフォルダー、および送信サーバーと受信サーバーの名前を受け取ります。 さらに、これらのパラメーターはdfsrdiagに渡され、その出力に応じて発行されます。
ファイル数-バックログ内のファイルの存在に関するメッセージを受信した場合、
0-バックログにファイルがないことに関するメッセージを受信した場合(「バックログなし」)、
-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が理解できる形式で提示してください。 検出ツールが理解する形式は次のとおりです。
"data":[ { "{#GROUP}":"Share1", "{#FOLDER}":"Folder1", "{#SENDING}":"Server1", "{#RECEIVING}":"Server2"} ... "{#GROUP}":"ShareN", "{#FOLDER}":"FolderN", "{#SENDING}":"Server1", "{#RECEIVING}":"ServerN"}]}
関心のある情報は、DfsrReplicationGroupConfigの対応するセクションから取得することにより、WMIを通じて最も簡単に取得できます。 その結果、WMIへの要求を生成し、グループ、そのフォルダー、およびサーバーのリストを目的の形式で出力するスクリプトが作成されました。
DFSRDiscovery.vbs
私は同意します、スクリプトにはコードの優雅さがなく、その中の何かは確かに単純化できますが、その主な機能-レプリケーショングループのパラメーターに関する情報をZabbixが理解できる形式で提供する-それは正常に実行されます。
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エージェントサービスを実行するユーザーを変更する
dfsrdiagを介して情報を受信するには、レプリケーショングループの送信メンバーと受信メンバーの両方に対する管理者権限を持つアカウントの代わりにユーティリティを実行する必要があります。 システムアカウントでデフォルトで起動されるZabbixエージェントサービスは、そのようなリクエストを実行できません。 ドメインに別のアカウントを作成し、必要なサーバーの管理者権限を付与し、これらのサーバー上のこれらのサーバーからのサービスの起動を構成しました。
別の方法もあります: dfsrdiagは実際には同じWMIを介して動作するため、管理者権限を発行せずにドメインアカウントに使用権限を与える方法の説明を使用できますが、レプリケーショングループが多数ある場合は、それぞれに権限を付与しますグループは難しいでしょう。 ただし、ドメインコントローラー上のドメインシステムボリュームのレプリケーションを監視する場合は、監視サービスアカウントにドメイン管理者権限を付与することは最善のアイデアではないため、これが唯一の受け入れ可能なオプションです。
監視パターン
データに基づいて、次のテンプレートを作成しました。
- 1時間に1回、レプリケーショングループの自動検出が開始されると、
- 5分ごとに、各グループのバックログサイズを確認し、
- 任意のグループのバックログサイズが30分間100を超えた場合にアラートを発行するトリガーが含まれます。 トリガーは、検出されたグループに自動的に追加されるプロトタイプとして記述され、
- 各レプリケーショングループのバックログサイズグラフを作成します。
こちらからZabbix 2.2のテンプレートをダウンロードしてください。
まとめ
テンプレートをZabbixにインポートし、必要な権限を持つアカウントを作成した後、DFSRを監視するファイルサーバーにスクリプトをコピーし、それらのエージェント構成に2行を追加し、Zabbixエージェントサービスを再起動して、希望のアカウント。 DFSRを監視するために他の手動設定は必要ありません。