Surveillance simple de la réplication DFS dans Zabbix

introduction

Avec une infrastructure suffisamment grande et distribuée qui utilise DFS comme point d'accès unique aux données et DFSR pour la réplication des données entre le centre de données et les serveurs de la filiale, la question se pose de surveiller l'état de cette réplication.
Par coïncidence, presque immédiatement après le début de l'utilisation de DFSR, nous avons commencé à implémenter Zabbix afin de remplacer le zoo existant de divers outils et d'apporter la surveillance de l'infrastructure sous une forme plus informative, complète et logique. Nous parlerons de l'utilisation de Zabbix pour surveiller la réplication DFS.

Tout d'abord, nous devons décider quelles données sur la réplication DFS nous devons recevoir afin de surveiller son statut. L'indicateur le plus pertinent est l'arriéré. Il contient des fichiers qui n'ont pas été synchronisés avec d'autres membres du groupe de réplication. Vous pouvez voir sa taille avec l'utilitaire dfsrdiaginstallé avec le rôle DFSR. Dans l'état normal de réplication, la taille du backlog devrait tendre vers zéro. Par conséquent, un grand nombre de fichiers dans le backlog indique des problèmes de réplication.

Parlons maintenant du côté pratique de la question.

Afin de surveiller la taille du backlog via Zabbix Agent, nous avons besoin de :

  • Script qui analysera la sortie dfsrdiag pour fournir les valeurs finales de la taille du backlog à Zabbix,
  • Un script qui déterminera combien de groupes de réplication il y a sur le serveur, quels dossiers ils répliquent et quels autres serveurs ils incluent (nous ne voulons pas conduire tout cela manuellement dans Zabbix pour chaque serveur, n'est-ce pas ?),
  • Saisie de ces scripts en tant que UserParameter dans la configuration de l'agent Zabbix pour un appel ultérieur depuis le serveur de surveillance,
  • Démarrage du service de l'agent Zabbix en tant qu'utilisateur disposant des droits de lecture du backlog,
  • Modèle pour Zabbix, dans lequel la découverte de groupe sera configurée, le traitement des données reçues et l'émission d'alertes à leur sujet.

Analyseur de script

Pour écrire l'analyseur, j'ai choisi VBS comme langage le plus universel présent dans toutes les versions de Windows Server. La logique du script est simple : il reçoit le nom du groupe de réplication, le dossier répliqué et les noms des serveurs d'envoi et de réception via la ligne de commande. Ces paramètres sont ensuite transmis à dfsrdiag, et selon sa sortie :
Nombre de fichiers - si un message sur la présence de fichiers dans le backlog est reçu,
0 - si un message a été reçu concernant l'absence de fichiers dans le backlog ("No Backlog"),
-1 - si un message d'erreur a été reçu dfsrdiag lors de l'exécution de la requête ("[ERREUR]").

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

Scénario de découverte

Pour que Zabbix puisse déterminer tous les groupes de réplication présents sur le serveur lui-même et connaître tous les paramètres nécessaires à la requête (nom du dossier, noms des serveurs voisins), nous devons d'une part obtenir ces informations, et d'autre part, les présenter dans un format que Zabbix comprend. Le format que l'outil de découverte comprend ressemble à ceci :

        "data":[
                {
                        "{#GROUP}":"Share1",
                        "{#FOLDER}":"Folder1",
                        "{#SENDING}":"Server1",
                        "{#RECEIVING}":"Server2"}

...

                        "{#GROUP}":"ShareN",
                        "{#FOLDER}":"FolderN",
                        "{#SENDING}":"Server1",
                        "{#RECEIVING}":"ServerN"}]}

Le moyen le plus simple d'obtenir les informations qui nous intéressent consiste à utiliser WMI, en les extrayant des sections correspondantes de DfsrReplicationGroupConfig. En conséquence, un script est né qui génère une demande à WMI et génère une liste de groupes, leurs dossiers et serveurs dans le format requis.

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

Je suis d'accord, le script peut ne pas briller avec l'élégance du code et quelque chose en lui peut certainement être simplifié, mais sa fonction principale - donner des informations sur les paramètres des groupes de réplication dans un format compréhensible par Zabbix - il fonctionne avec succès.

Ajouter des scripts à la configuration de l'agent Zabbix

Tout est extrêmement simple ici. Ajoutez les lignes suivantes à la fin du fichier de configuration de l'agent :

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"

Bien sûr, nous corrigeons les chemins vers ceux où nous avons des scripts. Je les ai mis dans le même dossier où l'agent est installé.

Après avoir apporté des modifications, redémarrez le service de l'agent Zabbix.

Changer l'utilisateur sous lequel le service Zabbix Agent s'exécute

Afin de recevoir des informations par dfsrdiag, l'utilitaire doit être exécuté pour le compte d'un compte disposant de droits d'administration sur les membres expéditeurs et destinataires du groupe de réplication. Le service d'agent Zabbix, exécuté par défaut sous le compte système, ne pourra pas répondre à une telle demande. J'ai créé un compte séparé dans le domaine, lui ai donné des droits d'administration sur les serveurs requis et configuré ces serveurs pour démarrer le service à partir de celui-ci.

Vous pouvez aussi aller dans l'autre sens : puisque dfsrdiag, en fait, fonctionne via le même WMI, vous pouvez utiliser la description, comment donner à un compte de domaine le droit de l'utiliser sans émettre de droits d'administration, mais si nous avons de nombreux groupes de réplication, il sera difficile d'attribuer des droits à chaque groupe. Cependant, si nous voulons surveiller la réplication du volume système du domaine sur les contrôleurs de domaine, cela peut être la seule option acceptable, car donner des droits d'administrateur de domaine au compte de service de surveillance n'est pas la meilleure idée.

Modèle de surveillance

Sur la base des données que j'ai reçues, j'ai créé un modèle qui :

  • Exécute la découverte automatique des groupes de réplication une fois par heure,
  • Une fois toutes les 5 minutes vérifie la taille du backlog pour chaque groupe,
  • Contient un déclencheur qui émet une alerte lorsque la taille du backlog d'un groupe est supérieure à 100 pendant 30 minutes. Le déclencheur est décrit comme un prototype qui est automatiquement ajouté aux groupes découverts,
  • Trace la taille du backlog pour chaque groupe de réplication.

Vous pouvez télécharger le modèle pour Zabbix 2.2 ici.

Total

Après avoir importé le modèle dans Zabbix et créé un compte avec les droits nécessaires, il nous suffit de copier les scripts sur les serveurs de fichiers que nous voulons surveiller pour DFSR, d'ajouter deux lignes à la configuration de l'agent et de redémarrer le service de l'agent Zabbix, en le configurant pour qu'il s'exécute au nom du compte souhaité. Aucun autre réglage manuel n'est requis pour surveiller le DFSR.

Source: habr.com

Ajouter un commentaire