簡易網絡性能監控系統設計

需求描述:

筆者的公司目前面臨這樣的情況,在國內有七八家分公司,分公司與總公司之間通過MPLS-***來進行連接。如何實時的掌握總公司與分支機構之間的網絡狀態是筆者目前面臨的一個問題。經常會遇到用戶反映網絡慢,無法收到郵件的問題。因MPLS線路屬於電信託管,本地IT沒有權限查看路由器狀態。

處理方案:

根據目前的實際,筆者決定採用Ping的方式,記錄實時的Ping值,通過Ping值的收集,來對網絡性能進行判斷。從一臺監控主機向各個地點發送Ping請求,根據各地的返回值,保存到數據庫中。同時,根據數據庫的信息,搭建前臺的展示頁面。這樣的設計基於BS架構。

所需條件:

1. 監控主機一臺(Windows server 2012),採用這個版本考慮到這個版本的操作系統Powershell自帶test-connection命令,與其他版本略不同

2. 開發工具:windows visual web developer 2010 express (微軟官方免費開發工具)

3.數據庫:Microsoft Sql Server 2010 express (微軟官方免費開發工具)

實施效果:

已經部署完成的網絡監控系統如下圖所示:

clip_p_w_picpath002

從上圖可以看到24小時之內的網絡狀況,各個地點的網絡性能略有不同,這個與流量,帶寬等都有關係,通過這樣的簡易平臺,可以很直觀的看到當前整個網絡的運行狀況

詳細步驟:

1. 建立收集數據庫network,建立networkresult表,用於存放收集的數據

clip_p_w_picpath003

2.在服務器端使用powershell編寫收集腳本

clear-content c:\1powershell\format.txt ‘清空這個文件

clear-content c:\1powershell\import.txt

$m=(get-content c:\1powershell\iplist.txt).count ‘讀取需要監控的IP清單

for ($n=0;$n -lt $m;$n++)

{

[string]$address=(get-content c:\1powershell\iplist.txt)[$n..$n]

test-netconnection $address >c:\1powershell\format.txt ‘使用這個命令獲取原始的數據

for($i=2;$i -lt 8;$i++)

{

$a=(get-content c:\1powershell\format.txt)[$i..$i]|out-string

$aa=$a.substring($a.lastindexof(":")+1)

$t=$t+","+$aa.trim()

}

[string]$p=get-date

$q=","+$p+$t

$q1=$q.substring(0,$q.length-3)

$q1 >> c:\1powershell\import.txt ‘將轉換好的數據保存到import.txt,準備導入SQL

$q1=""

$a=""

$aa=""

$t=""

$q=""

$p=""

}

get-content c:\1powershell\import.txt|set-content c:\1powershell\import5.txt

c:\1powershell\powershell2sql.bat 調用SQL導入腳本,將數據導入SQL

SQL導入腳本,採用BCP方式

bcp network.dbo.networkresult in c:\1powershell\import5.txt -c -t "," -U sa –P **** -S abcd\sqlexpress

導入完成後進入sql,檢查是否已經導入成功。

在windows計劃任務中設計計劃任務,定時收集數據導入到數據庫

3. 設計前臺UI及代碼。

(1)vb.net網站架設不在描述之內,前臺UI請參考上圖。代碼中主要使用的控件是Chart。

(2)全部代碼如下:Imports System.Data.SqlClient

Imports System ‘調用命名空間

Imports System.Data

Imports System.Data.Sql

Imports System.Collections

Imports System.Collections.Specialized

Imports System.Web.UI.DataVisualization.Charting

Partial Class Network_network2

Inherits System.Web.UI.Page

Public Shared conn As SqlConnection

Public Shared conn2 As SqlConnection

Private Sub opendb() ‘定義過程

Dim connstr As String

connstr = "data source=abcd\sqlexpress;initial catalog=network;user id=sa;password=****"

conn = New SqlConnection(connstr)

conn.Open()

End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ‘主要在Pageload事件中動態插入chart控件,根據IP地址數量來確定chart控件數量

If Not Me.IsPostBack Then

opendb()

Dim strsql As String

Dim cmd As SqlCommand

Dim dr As SqlDataReader

Dim i As Integer

Dim hostname As String

hostname = ""

i = 0

strsql = "select distinct remoteaddress from networkresult"

cmd = New SqlCommand(strsql, conn)

dr = cmd.ExecuteReader()

While dr.Read() ‘篩選IP地址數量,並進行循環

hostname = dr.Item(0)

Dim connstr2 As String

connstr2 = "data source=cnsz4ms0001\sqlexpress;initial catalog=network;user id=sa;password=p@ssw0rd"

conn2 = New SqlConnection(connstr2)

conn2.Open()

Dim strsql2, strsql3 As String ‘篩選24小時之內的數值,並作爲數據源與chart控件捆綁

Dim cmd2 As SqlCommand

Dim dr2 As SqlDataReader

strsql2 = "select top 96 date, pingreplydetails from networkresult where remoteaddress ='" & hostname & "' order by date desc "

strsql3 = "select date,pingreplydetails from (" & strsql2 & ") a order by date asc "

cmd2 = New SqlCommand(strsql3, conn2)

dr2 = cmd2.ExecuteReader

Dim strles As String

strles = "legend"

Dim strarea As String

strarea = "chartarea"

Dim charttitle As String

charttitle = "SZ--" + hostname

Dim chartcontrol As New Chart() ‘向UI中插入chart

chartcontrol.Width = 400

chartcontrol.Height = 250

chartcontrol.ID = "chart_bar" + "-" + hostname

chartcontrol.Titles.Add(charttitle)

Dim chartarea As New ChartArea()

chartarea.Name = strarea

'chartarea.AxisX.Title = "abc"

chartcontrol.ChartAreas.Add(chartarea)

chartcontrol.DataSource = dr2

Dim series As New Series()

series.Name = "series1"

series.XValueMember = "date"

series.YValueMembers = "pingreplydetails"

series.Legend = strles

series.ChartType = SeriesChartType.Column

series.ChartArea = strarea

series.BorderWidth = 3

series.Color = Drawing.Color.Orange

series.ToolTip = "#VALX,#VAL"

chartcontrol.Series.Add(series)

chartcontrol.DataBind()

Panel2.Controls.Add(chartcontrol)

dr2.Close()

conn2.Close()

End While

End If

End Sub

End Class

(3) 順利執行完後的頁面如上圖展示所示。直接訪問網址,即可實時查看當前網絡狀態。

後續提升:

1. 這個過程完整的展示了一個數據收集到展示的過程,主動觸發的行爲。在這個過程中,僅通過Ping值來反映網絡性能。如有路由器權限,可以在路由器上設置SNMP,通過powershell腳本獲取snmp相關數據,如路由器端口狀態,流量,CPU,內存使用情況。並保存到數據庫,通過可以提升網絡的管理水平。

2. 在這樣的過程中,只展示了數值的收集,同樣,可以對數值進行邏輯判斷,設置一個閥值,如達到一定的值,觸發某個條件的警報,可大大的提升IT的主動性,比如ping值超過1000ms,可以自動登錄路由器,使用show ip account等命令,獲得流量排行前10位用戶,併發送到郵箱,方便工作。同時,可以判斷各個節點之間的連接是否有問題,如不通,可以結合郵件報警等手段來預警,可極大的提升IT管理水平。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章