Wprowadzenie
W przypadku dużej i rozproszonej infrastruktury, która używa DFS jako jednego punktu dostępu do danych i DFSR do replikacji danych między danymi centrami a serwerami oddziałów, pojawia się pytanie o monitorowanie stanu tej replikacji.
Zbiegiem okoliczności, że niemal natychmiast po rozpoczęciu korzystania z DFSR, rozpoczęliśmy wdrażanie Zabbix w celu zastąpienia istniejącego zróżnicowanego zestawu narzędzi i doprowadzenia monitoringu infrastruktury do bardziej informacyjnego, kompleksowego i logicznego kształtu. O użyciu Zabbix do monitorowania replikacji DFS będzie mowa.
Pierwszą rzeczą, którą musimy ustalić, jest to, jakie dane o replikacji DFS są potrzebne do nadzoru stanu tej replikacji. Najistotniejszym wskaźnikiem jest backlog. Wchodzą do niego pliki, które nie zostały zsynchronizowane z innymi członkami grupy replikacji. Jego rozmiar można sprawdzić przy pomocy narzędzia dfsrdiag, które jest instalowane razem z rolą DFSR. W normalnym stanie replikacji, rozmiar backlogu powinien dążyć do zera. W związku z tym, duże wartości liczby plików w backlogu świadczą o problemach z replikacją.
Teraz przejdźmy do praktycznej strony zagadnienia.
Aby monitorować rozmiar backlogu przez Zabbix Agent, potrzebujemy:
- Skryptu, który będzie analizować dane wyjściowe dfsrdiag w celu dostarczenia w Zabbix końcowych wartości rozmiaru backlogu,
- Skryptu, który określi, ile grup replikacji jest na serwerze, jakie foldery są replikowane oraz które inne serwery wchodzą w skład tych grup (nie chcemy wpisywać tego wszystkiego ręcznie w Zabbix dla każdego serwera, prawda?),
- Dodania tych skryptów jako UserParameter do konfiguracji agenta Zabbix, aby można je było później wywołać z serwera monitorującego,
- Uruchomienia usługi agenta Zabbix jako użytkownik, który ma prawo do odczytu backlogu,
- Szablonu dla Zabbix, w którym zostanie skonfigurowane wykrywanie grup, przetwarzanie otrzymanych danych oraz wydawanie alertów na ich podstawie.
Skrypt analizy
Do napisania skryptu analizy wybrałem VBS jako najuniwersalniejszy język, obecny we wszystkich wersjach Windows Server. Logika działania skryptu jest prosta: za pomocą wiersza polecenia otrzymuje on nazwę grupy replikacji, replikowanego folderu oraz nazwy serwerów sending i receiving. Następnie te parametry są przekazywane do dfsrdiag, a w zależności od jej wyników wydawane jest:
Liczba plików — jeśli otrzymano informację o obecności plików w backlogu,
0 — jeśli otrzymano komunikat o braku plików w backlogu („No Backlog”),
-1 — jeśli otrzymano komunikat o błędzie dfsrdiag podczas wykonywania zapytania ("[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 intBackLogSkrypt detekcji
Aby Zabbix mógł sam wykrywać wszystkie grupy replikacji obecne na serwerze i sam ustalać wszystkie wymagane parametry do zapytania (nazwa folderu, nazwy serwerów sąsiednich), musimy te informacje najpierw uzyskać, a następnie przedstawić je w zrozumiałym dla Zabbix formacie. Format, który rozumie narzędzie discovery, wygląda następująco:
"data":[
{
"{#GROUP}":"Share1",
"{#FOLDER}":"Folder1",
"{#SENDING}":"Server1",
"{#RECEIVING}":"Server2"}
...
"{#GROUP}":"ShareN",
"{#FOLDER}":"FolderN",
"{#SENDING}":"Server1",
"{#RECEIVING}":"ServerN"}]}Najłatwiej jest uzyskać interesujące nas informacje przez WMI, wyciągając je z odpowiednich sekcji DfsrReplicationGroupConfig. W rezultacie powstał skrypt, który formułuje zapytanie do WMI i na wyjściu zwraca listę grup, ich folderów i serwerów w wymaganym formacie.
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
Zgadzam się, skrypt może nie jest najdoskonalszy i na pewno można coś uprościć, ale swoją główną funkcję — dostarczanie informacji o parametrach grup replikacji w formacie zrozumiałym dla Zabbixa — wykonuje skutecznie.
Dodawanie skryptów do konfiguracji agenta Zabbix
Tutaj wszystko jest bardzo proste. Na końcu pliku konfiguracyjnego agenta dodajemy poniższe linie:
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"
Oczywiście, ścieżki należy dostosować do tych, w których znajdują się nasze skrypty. Położyłem je w tym samym folderze, co zainstalowany agent.
Po wprowadzeniu zmian restartujemy usługę agenta Zabbix.
Zmiana użytkownika, pod którym działa usługa Zabbix Agent
Aby uzyskać informacje przez dfsrdiag, narzędzie musi być uruchamiane z konta użytkownika, które ma uprawnienia administracyjne zarówno dla członków grupy wysyłającej, jak i odbierającej replikację. Domyślnie uruchamiana usługa agenta Zabbix na koncie systemowym nie będzie mogła zrealizować takiego żądania. Utworzyłem osobne konto w domenie, nadałem mu uprawnienia administracyjne na odpowiednich serwerach i skonfigurowałem uruchamianie usługi na tych serwerach z tego konta.
Można pójść i inną drogą: ponieważ dfsrdiag, w zasadzie, działa przez ten sam WMI, można skorzystać z , jak nadać domenowemu kontu użytkownika uprawnienia do jego użycia bez przyznawania uprawnień administracyjnych, ale jeśli mamy wiele grup replikacji, to nadawanie uprawnień każdej grupie może być problematyczne. Jednak w przypadku, gdy zechcemy monitorować replikację Domain System Volume na kontrolerach domeny, to może być jedyna akceptowalna opcja, ponieważ przyznawanie uprawnień administratora domeny kontu usługi monitorującej — to nie jest najlepszy pomysł.
Szablon monitorowania
Na podstawie zebranych danych stworzyłem szablon, który:
- Co godzinę uruchamia automatyczne wykrywanie grup replikacji,
- Co 5 minut kontroluje rozmiar backlogu dla każdej grupy,
- Zawiera wyzwalacz, który generuje alert, gdy rozmiar backlogu dla dowolnej grupy przekracza 100 przez 30 minut. Wyzwalacz opisany jest jako prototyp, który automatycznie dodaje się do wykrytych grup,
- Tworzy wykresy rozmiaru backlogu dla każdej grupy replikacji.
Można pobrać szablon dla Zabbix 2.2 .
Podsumowanie
Po imporcie szablonu do Zabbix i utworzeniu konta z odpowiednimi uprawnieniami wystarczy kopia skryptów na serwery plików, które chcemy monitorować w zakresie DFSR, dodanie dwóch linii do konfiguracji agenta na nich i ponowne uruchomienie usługi agenta Zabbix, konfigurowując jej uruchamianie z konta użytkownika. Żadne inne ręczne ustawienia do monitorowania DFSR nie będą potrzebne.
Źródło: habr.com
