การตรวจสอบการจำลองแบบ DFS ใน Zabbix อย่างง่ายดาย

การแนะนำ

ด้วยโครงสร้างพื้นฐานที่ค่อนข้างใหญ่และกระจายซึ่งใช้ DFS เป็นจุดเดียวในการเข้าถึงข้อมูลและ DFSR สำหรับการจำลองข้อมูลระหว่างศูนย์ข้อมูลและเซิร์ฟเวอร์สาขา คำถามจึงเกิดขึ้นในการตรวจสอบสถานะของการจำลองนี้
บังเอิญเกือบจะในทันทีหลังจากที่เราเริ่มใช้ DFSR เราเริ่มใช้งาน Zabbix โดยมีเป้าหมายเพื่อแทนที่สวนสัตว์ที่มีอยู่ของเครื่องมือต่างๆ และนำการตรวจสอบโครงสร้างพื้นฐานมาสู่รูปแบบที่ให้ข้อมูล สมบูรณ์ และสมเหตุสมผลมากขึ้น เราจะพูดถึงการใช้ Zabbix เพื่อตรวจสอบการจำลองแบบ DFS

ก่อนอื่น เราต้องตัดสินใจว่าจะต้องได้รับข้อมูลใดเกี่ยวกับการจำลองแบบ DFS เพื่อตรวจสอบสถานะ ตัวบ่งชี้ที่เกี่ยวข้องมากที่สุดคืองานในมือ ประกอบด้วยไฟล์ที่ไม่ได้รับการซิงโครไนซ์กับสมาชิกคนอื่นๆ ของกลุ่มการจำลองแบบ คุณสามารถดูขนาดได้โดยใช้ยูทิลิตี้ dfsrdiagติดตั้งด้วยบทบาท DFSR ในสถานะการจำลองแบบปกติ ขนาด Backlog ควรเข้าใกล้ศูนย์ ดังนั้น ไฟล์จำนวนมากใน Backlog บ่งชี้ปัญหาเกี่ยวกับการจำลองแบบ

ตอนนี้เกี่ยวกับด้านการปฏิบัติของปัญหา

ในการตรวจสอบขนาดของ Backlog ผ่าน Zabbix Agent เราจะต้อง:

  • สคริปต์ที่จะแยกวิเคราะห์ผลลัพธ์ dfsrdiag เพื่อมอบค่าขนาด Backlog สุดท้ายให้กับ Zabbix
  • สคริปต์ที่จะกำหนดจำนวนกลุ่มการจำลองแบบบนเซิร์ฟเวอร์ โฟลเดอร์ใดที่พวกเขาจำลองแบบ และเซิร์ฟเวอร์อื่น ๆ ที่รวมอยู่ในนั้น (เราไม่ต้องการป้อนทั้งหมดนี้ลงใน Zabbix ด้วยตนเองสำหรับแต่ละเซิร์ฟเวอร์ ใช่ไหม)
  • การเพิ่มสคริปต์เหล่านี้เป็น UserParameter ในการกำหนดค่าเอเจนต์ Zabbix สำหรับการเรียกจากเซิร์ฟเวอร์การมอนิเตอร์ในภายหลัง
  • การเริ่มต้นบริการตัวแทน Zabbix ในฐานะผู้ใช้ที่มีสิทธิ์อ่าน Backlog
  • เทมเพลตสำหรับ Zabbix ซึ่งการตรวจจับกลุ่ม การประมวลผลข้อมูลที่ได้รับ และการออกการแจ้งเตือนจะได้รับการกำหนดค่า

ตัวแยกวิเคราะห์สคริปต์

ในการเขียน parser ฉันเลือก VBS เป็นภาษาสากลที่สุดใน Windows Server ทุกเวอร์ชัน ตรรกะของสคริปต์นั้นเรียบง่าย: รับชื่อของกลุ่มการจำลองแบบ โฟลเดอร์ที่ถูกจำลองแบบ และชื่อของเซิร์ฟเวอร์การส่งและรับผ่านทางบรรทัดคำสั่ง จากนั้นพารามิเตอร์เหล่านี้จะถูกส่งไปยัง dfsrdiagและขึ้นอยู่กับผลลัพธ์ของมัน:
จำนวนไฟล์ - หากได้รับข้อความเกี่ยวกับการมีไฟล์อยู่ใน Backlog
0 — หากได้รับข้อความเกี่ยวกับการไม่มีไฟล์ใน Backlog (“No Backlog”)
-1 - หากได้รับข้อความแสดงข้อผิดพลาด dfsrdiag เมื่อดำเนินการตามคำขอ ("[ข้อผิดพลาด]")

รับ 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"}]}

วิธีที่ง่ายที่สุดในการรับข้อมูลที่เราสนใจคือผ่าน WMI โดยดึงข้อมูลออกจากส่วนที่เกี่ยวข้องของ DfsrReplicationGroupConfig เป็นผลให้เกิดสคริปต์ที่สร้างคำขอไปยัง WMI และส่งออกรายการกลุ่ม โฟลเดอร์ และเซิร์ฟเวอร์ในรูปแบบที่ต้องการ

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

ฉันยอมรับว่าสคริปต์อาจไม่เปล่งประกายด้วยโค้ดที่สวยงามและบางสิ่งในสคริปต์อาจทำให้ง่ายขึ้นได้อย่างแน่นอน แต่สคริปต์จะทำหน้าที่หลักโดยให้ข้อมูลเกี่ยวกับพารามิเตอร์ของกลุ่มการจำลองแบบในรูปแบบที่ Zabbix เข้าใจได้

การเพิ่มสคริปต์ในการกำหนดค่าเอเจนต์ Zabbix

ทุกสิ่งที่นี่เรียบง่ายมาก เพิ่มบรรทัดต่อไปนี้ที่ส่วนท้ายของไฟล์คอนฟิกูเรชันเอเจนต์:

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"

แน่นอนว่าเราปรับเส้นทางไปยังเส้นทางที่เรามีสคริปต์ ฉันวางไว้ในโฟลเดอร์เดียวกับที่ติดตั้งเอเจนต์

หลังจากทำการเปลี่ยนแปลง ให้รีสตาร์ทบริการตัวแทน Zabbix

การเปลี่ยนผู้ใช้ที่ใช้บริการ Zabbix Agent ทำงาน

เพื่อรับข้อมูลผ่านทาง dfsrdiagโปรแกรมอรรถประโยชน์นี้ต้องทำงานภายใต้บัญชีที่มีสิทธิ์ระดับผู้ดูแลทั้งส่งและรับสมาชิกของกลุ่มการจำลองแบบ บริการตัวแทน Zabbix ซึ่งทำงานตามค่าเริ่มต้นภายใต้บัญชีระบบ จะไม่สามารถดำเนินการตามคำขอดังกล่าวได้ ฉันสร้างบัญชีแยกต่างหากในโดเมน ให้สิทธิ์ผู้ดูแลระบบแก่เซิร์ฟเวอร์ที่จำเป็น และกำหนดค่าบริการให้ทำงานภายใต้โดเมนนั้นบนเซิร์ฟเวอร์เหล่านี้

คุณสามารถไปอีกทางหนึ่งได้: เพราะ dfsrdiagที่จริงแล้วทำงานผ่าน WMI เดียวกันคุณก็สามารถใช้งานได้ คำอธิบายจะให้สิทธิ์แก่บัญชีโดเมนได้อย่างไรโดยไม่ต้องออกสิทธิ์ผู้ดูแลระบบ แต่หากเรามีกลุ่มการจำลองแบบจำนวนมากการออกสิทธิ์ให้กับแต่ละกลุ่มก็จะทำได้ยาก อย่างไรก็ตาม ในกรณีที่เราต้องการตรวจสอบการจำลองแบบไดรฟ์ข้อมูลระบบโดเมนบนตัวควบคุมโดเมน นี่อาจเป็นตัวเลือกเดียวที่ยอมรับได้ เนื่องจากการมอบสิทธิ์ผู้ดูแลระบบโดเมนให้กับบัญชีบริการตรวจสอบไม่ใช่ความคิดที่ดี

เทมเพลตการตรวจสอบ

จากข้อมูลที่ฉันได้รับ ฉันได้สร้างเทมเพลตที่:

  • ดำเนินการค้นหากลุ่มการจำลองอัตโนมัติหนึ่งครั้งต่อชั่วโมง
  • ตรวจสอบขนาด Backlog ของแต่ละกลุ่มทุกๆ 5 นาที
  • ประกอบด้วยทริกเกอร์ที่แจ้งเตือนเมื่อขนาด Backlog สำหรับกลุ่มใดๆ มากกว่า 100 เป็นเวลา 30 นาที ทริกเกอร์ได้รับการอธิบายว่าเป็นต้นแบบที่ถูกเพิ่มไปยังกลุ่มที่ตรวจพบโดยอัตโนมัติ
  • สร้างกราฟขนาด Backlog สำหรับแต่ละกลุ่มการจำลอง

คุณสามารถดาวน์โหลดเทมเพลตสำหรับ Zabbix 2.2 ได้ ที่นี่.

ทั้งหมด

หลังจากนำเข้าเทมเพลตไปยัง Zabbix และสร้างบัญชีที่มีสิทธิ์ที่จำเป็นเราจะต้องคัดลอกสคริปต์ไปยังไฟล์เซิร์ฟเวอร์ที่เราต้องการตรวจสอบ DFSR เพิ่มสองบรรทัดในการกำหนดค่าตัวแทนในนั้นแล้วรีสตาร์ทบริการตัวแทน Zabbix โดยตั้งค่าให้ทำงานตามบัญชีที่ต้องการ ไม่จำเป็นต้องมีการตั้งค่าด้วยตนเองอื่นใดสำหรับการตรวจสอบ DFSR

ที่มา: will.com

เพิ่มความคิดเห็น