Ienfâldige tafersjoch fan DFS-replikaasje yn Zabbix

Ynlieding

Mei in frij grutte en ferspraat ynfrastruktuer dy't brûkt DFS as ien punt fan tagong ta gegevens en DFSR foar gegevens replikaasje tusken data sintra en branch tsjinners, de fraach ûntstiet fan tafersjoch op de status fan dizze replikaasje.
Tafallich, hast fuortendaliks nei't wy begon te brûken DFSR, begûnen wy Zabbix te ymplementearjen mei it doel om de besteande bistetún fan ferskate ark te ferfangen en ynfrastruktuermonitoring nei in mear ynformative, folsleine en logyske foarm te bringen. Wy sille prate oer it brûken fan Zabbix om DFS-replikaasje te kontrolearjen.

Alderearst moatte wy beslute hokker gegevens oer DFS-replikaasje moatte wurde krigen om de status te kontrolearjen. De meast relevante yndikator is efterstân. It befettet triemmen dy't net syngronisearre binne mei oare leden fan 'e replikaasjegroep. Jo kinne de grutte besjen mei it hulpprogramma dfsrdiag, ynstalleare mei de DFSR-rol. Yn in normale replikaasjetastân moat de efterstângrutte nul benaderje. Dêrtroch jouwe grutte oantallen bestannen yn 'e efterstân problemen mei replikaasje oan.

No oer de praktyske kant fan it probleem.

Om de grutte fan 'e efterstân fia Zabbix Agent te kontrolearjen, sille wy nedich wêze:

  • Skript dat de útfier sil parse dfsrdiag om definitive wearden fan efterstângrutte oan Zabbix te leverjen,
  • In skript dat sil bepale hoefolle replikaasjegroepen der binne op 'e tsjinner, hokker mappen se replikearje en hokker oare servers binne opnommen yn har (wy wolle dit alles net mei de hân ynfiere yn Zabbix foar elke server, toch?),
  • It tafoegjen fan dizze skripts as UserParameter oan 'e Zabbix-agentkonfiguraasje foar folgjende oprop fan' e monitorserver,
  • De Zabbix-agenttsjinst begjinne as in brûker dy't rjochten hat om de efterstân te lêzen,
  • In sjabloan foar Zabbix, wêryn de deteksje fan groepen, ferwurking fan ûntfongen gegevens en it útjaan fan warskôgings oer har wurde konfigureare.

Skript parser

Om de parser te skriuwen, keas ik VBS as de meast universele taal oanwêzich yn alle ferzjes fan Windows Server. De logika fan it skript is ienfâldich: it ûntfangt de namme fan 'e replikaasjegroep, de replikearre map, en de nammen fan' e ferstjoerende en ûntfangende tsjinners fia de kommandorigel. Dizze parameters wurde dan trochjûn oan dfsrdiag, en ôfhinklik fan syn útfier produsearret it:
Oantal bestannen - as in berjocht wurdt ûntfongen oer de oanwêzigens fan bestannen yn 'e efterstân,
0 - as in berjocht wurdt ûntfongen oer it ûntbrekken fan bestannen yn 'e efterstân ("Gjin efterstân"),
-1 - as in flater berjocht wurdt ûntfongen dfsrdiag by it útfieren fan in fersyk ("[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

Discovery skript

Om Zabbix te bepalen alle replikaasjegroepen oanwêzich op 'e tsjinner en om alle parameters te finen dy't nedich binne foar it fersyk (mapnamme, nammen fan oanbuorjende tsjinners), moatte wy earst dizze ynformaasje krije, en as twadde, presintearje it yn in foar Zabbix begryplik formaat. It formaat dat it ûntdekkingsark begrypt sjocht der sa út:

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

...

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

De maklikste manier om de ynformaasje te krijen wêryn wy ynteressearre binne, is fia WMI, en lûkt it út 'e oerienkommende seksjes fan DfsrReplicationGroupConfig. As resultaat waard in skript berne dat in fersyk oan WMI genereart en in list mei groepen, har mappen en servers yn it fereaske formaat útfiert.

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

Ik gean akkoard, it skript kin miskien net skine mei elegânsje fan koade en guon dingen dêryn kinne grif ferienfâldige wurde, mar it docht syn haadfunksje - it leverjen fan ynformaasje oer de parameters fan replikaasjegroepen yn in formaat dat begrypt wurdt troch Zabbix.

Skripten tafoegje oan 'e Zabbix-agentkonfiguraasje

Alles hjir is ekstreem ienfâldich. Foegje de folgjende rigels ta oan it ein fan it agentkonfiguraasjetriem:

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"

Fansels oanpasse wy de paden oan dyjingen wêr't wy skripts hawwe. Ik set se yn deselde map dêr't de agent is ynstallearre.

Nei it meitsjen fan wizigingen, start de Zabbix-agenttsjinst opnij.

It feroarjen fan de brûker ûnder dêr't de Zabbix Agent-tsjinst rint

Om ynformaasje te krijen fia dfsrdiag, it hulpprogramma moat wurde útfierd ûnder in akkount dat bestjoerlike rjochten hat foar sawol ferstjoerende as ûntfangende leden fan 'e replikaasjegroep. De Zabbix-agenttsjinst, dy't standert rint ûnder it systeemakkount, sil sa'n fersyk net kinne útfiere. Ik makke in apart akkount yn it domein, joech it bestjoerlike rjochten op de nedige servers, en konfigureare de tsjinst om derûnder op dizze servers te rinnen.

Jo kinne in oare kant op: omdat dfsrdiag, yn feite, wurket troch deselde WMI, dan kinne jo brûke beskriuwing, hoe't jo in domeinkonto de rjochten jaan om it te brûken sûnder bestjoerlike rjochten út te jaan, mar as wy in protte replikaasjegroepen hawwe, dan sil it útjaan fan rjochten foar elke groep dreech wêze. Lykwols, yn it gefal dat wy de replikaasje fan Domain System Volume wolle kontrolearje op domeincontrollers, kin dit de ienige akseptabele opsje wêze, om't it jaan fan domeinbehearderrjochten foar it kontrôletsjinstakkount gjin goed idee is.

Monitoring template

Op grûn fan de gegevens dy't ik krige, haw ik in sjabloan makke dat:

  • Rint automatyske ûntdekking fan replikaasjegroepen ien kear yn 'e oere,
  • Kontrolearret de efterstângrutte foar elke groep ien kear elke 5 minuten,
  • Befettet in trigger dy't in warskôging jout as de efterstângrutte foar elke groep mear is as 100 foar 30 minuten. De trigger wurdt beskreaun as in prototype dat automatysk wurdt tafoege oan ûntdutsen groepen,
  • Bout grafiken foar efterstângrutte foar elke replikaasjegroep.

Jo kinne it sjabloan downloade foar Zabbix 2.2 hjir.

It resultaat

Nei it ymportearjen fan it sjabloan yn Zabbix en it meitsjen fan in akkount mei de nedige rjochten, hoege wy allinich de skripts te kopiearjen nei de triemservers dy't wy wolle kontrolearje foar DFSR, foegje twa rigels ta oan 'e agentkonfiguraasje op har en starte de Zabbix-agenttsjinst opnij , it ynstellen om te rinnen as it winske akkount. Gjin oare hânmjittige ynstellingen binne nedich foar DFSR-monitoring.

Boarne: www.habr.com

Add a comment