Pemantauan sederhana Replikasi DFS di Zabbix

pengenalan

Dengan infrastruktur yang cukup besar dan terdistribusi yang menggunakan DFS sebagai satu titik akses data dan DFSR untuk replikasi data antara pusat data dan server cabang, muncul pertanyaan tentang pemantauan status replikasi ini.
Secara kebetulan, segera setelah kami mulai menggunakan DFSR, kami mulai menerapkan Zabbix dengan tujuan menggantikan berbagai alat yang ada di kebun binatang dan membawa pemantauan infrastruktur ke bentuk yang lebih informatif, lengkap, dan logis. Kami akan membahas tentang penggunaan Zabbix untuk memantau replikasi DFS.

Pertama-tama, kita perlu memutuskan data apa tentang replikasi DFS yang perlu diperoleh untuk memantau statusnya. Indikator yang paling relevan adalah backlog. Ini berisi file yang belum disinkronkan dengan anggota grup replikasi lainnya. Anda dapat melihat ukurannya menggunakan utilitas dfsrdiag, diinstal dengan peran DFSR. Dalam keadaan replikasi normal, ukuran backlog harus mendekati nol. Oleh karena itu, sejumlah besar file di backlog menunjukkan masalah replikasi.

Sekarang tentang sisi praktis dari masalah ini.

Untuk memantau ukuran backlog melalui Zabbix Agent, kita memerlukan:

  • Script yang akan mengurai output dfsrdiag untuk memberikan nilai ukuran backlog akhir ke Zabbix,
  • Sebuah skrip yang akan menentukan berapa banyak grup replikasi yang ada di server, folder apa yang mereka replikasi, dan server lain apa yang disertakan di dalamnya (kami tidak ingin memasukkan semua ini ke Zabbix secara manual untuk setiap server, bukan?),
  • Menambahkan skrip ini sebagai UserParameter ke konfigurasi agen Zabbix untuk panggilan selanjutnya dari server pemantauan,
  • Memulai layanan agen Zabbix sebagai pengguna yang memiliki hak membaca backlog,
  • Templat untuk Zabbix, yang akan mengonfigurasi pendeteksian grup, pemrosesan data yang diterima, dan mengeluarkan peringatan pada grup tersebut.

Pengurai skrip

Untuk menulis parser, saya memilih VBS sebagai bahasa paling universal yang ada di semua versi Windows Server. Logika skrip ini sederhana: ia menerima nama grup replikasi, folder yang direplikasi, dan nama server pengirim dan penerima melalui baris perintah. Parameter ini kemudian diteruskan ke dfsrdiag, dan bergantung pada keluarannya, ia menghasilkan:
Jumlah file - jika pesan diterima tentang keberadaan file di backlog,
0 β€” jika pesan diterima tentang tidak adanya file di backlog (β€œTidak Ada Backlog”),
-1 - jika pesan kesalahan diterima dfsrdiag saat menjalankan permintaan ("[ERROR]").

dapatkan-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

Skrip penemuan

Agar Zabbix dapat menentukan semua grup replikasi yang ada di server dan mengetahui semua parameter yang diperlukan untuk permintaan tersebut (nama folder, nama server tetangga), pertama-tama kita perlu memperoleh informasi ini, dan kedua, menyajikannya dalam format yang dapat dimengerti oleh Zabbix. Format yang dipahami oleh alat penemuan terlihat seperti ini:

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

...

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

Cara termudah untuk mendapatkan informasi yang kami minati adalah melalui WMI, mengambilnya dari bagian DfsrReplicationGroupConfig yang sesuai. Hasilnya, sebuah skrip lahir yang menghasilkan permintaan ke WMI dan menampilkan daftar grup, folder dan servernya dalam format yang diperlukan.

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

Saya setuju, skrip mungkin tidak bersinar dengan keanggunan kode dan beberapa hal di dalamnya tentu dapat disederhanakan, tetapi skrip menjalankan fungsi utamanya - memberikan informasi tentang parameter grup replikasi dalam format yang dapat dimengerti oleh Zabbix.

Menambahkan skrip ke konfigurasi agen Zabbix

Semuanya di sini sangat sederhana. Tambahkan baris berikut ke akhir file konfigurasi agen:

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"

Tentu saja, kami menyesuaikan jalurnya dengan jalur yang skripnya kami miliki. Saya meletakkannya di folder yang sama tempat agen diinstal.

Setelah melakukan perubahan, restart layanan agen Zabbix.

Mengubah pengguna di mana layanan Agen Zabbix berjalan

Untuk menerima informasi melalui dfsrdiag, utilitas harus dijalankan di bawah akun yang memiliki hak administratif untuk mengirim dan menerima anggota grup replikasi. Layanan agen Zabbix, yang berjalan secara default pada akun sistem, tidak akan dapat menjalankan permintaan tersebut. Saya membuat akun terpisah di domain tersebut, memberinya hak administratif di server yang diperlukan, dan mengonfigurasi layanan agar berjalan di bawahnya di server ini.

Anda dapat memilih cara lain: karena dfsrdiag, pada kenyataannya, bekerja melalui WMI yang sama, maka Anda dapat menggunakannya keterangan, bagaimana cara memberikan hak penggunaan pada akun domain tanpa mengeluarkan hak administratif, namun jika kita mempunyai banyak grup replikasi maka akan sulit untuk mengeluarkan hak pada setiap grup. Namun, jika kita ingin memantau replikasi Volume Sistem Domain pada pengontrol domain, ini mungkin satu-satunya pilihan yang dapat diterima, karena memberikan hak administrator domain ke akun layanan pemantauan bukanlah ide yang baik.

Templat pemantauan

Berdasarkan data yang saya terima, saya membuat template yang:

  • Menjalankan penemuan otomatis grup replikasi satu kali per jam,
  • Memeriksa ukuran simpanan untuk setiap grup setiap 5 menit sekali,
  • Berisi pemicu yang mengeluarkan peringatan ketika ukuran simpanan untuk grup mana pun lebih dari 100 selama 30 menit. Pemicunya digambarkan sebagai prototipe yang secara otomatis ditambahkan ke grup yang terdeteksi,
  • Membuat grafik ukuran backlog untuk setiap grup replikasi.

Anda dapat mengunduh template untuk Zabbix 2.2 di sini.

Total

Setelah mengimpor template ke Zabbix dan membuat akun dengan hak yang diperlukan, kita hanya perlu menyalin skrip ke server file yang ingin kita pantau untuk DFSR, menambahkan dua baris ke konfigurasi agen di dalamnya dan memulai ulang layanan agen Zabbix , mengaturnya agar dijalankan sebagai akun yang diinginkan. Tidak ada pengaturan manual lainnya yang diperlukan untuk pemantauan DFSR.

Sumber: www.habr.com

Tambah komentar