需求描述:web
筆者的公司目前面臨這樣的狀況,在國內有七八家分公司,分公司與總公司之間經過MPLS-×××來進行鏈接。如何實時的掌握總公司與分支機構之間的網絡狀態是筆者目前面臨的一個問題。常常會遇到用戶反映網絡慢,沒法收到郵件的問題。因MPLS線路屬於電信託管,本地IT沒有權限查看路由器狀態。sql
處理方案:shell
根據目前的實際,筆者決定採用Ping的方式,記錄實時的Ping值,經過Ping值的收集,來對網絡性能進行判斷。從一臺監控主機向各個地點發送Ping請求,根據各地的返回值,保存到數據庫中。同時,根據數據庫的信息,搭建前臺的展現頁面。這樣的設計基於BS架構。數據庫
所需條件:express
1. 監控主機一臺(Windows server 2012),採用這個版本考慮到這個版本的操做系統Powershell自帶test-connection命令,與其餘版本略不一樣windows
2. 開發工具:windows visual web developer 2010 express (微軟官方免費開發工具)服務器
3.數據庫:Microsoft Sql Server 2010 express (微軟官方免費開發工具)網絡
實施效果:架構
已經部署完成的網絡監控系統以下圖所示:併發
從上圖能夠看到24小時以內的網絡情況,各個地點的網絡性能略有不一樣,這個與流量,帶寬等都有關係,經過這樣的簡易平臺,能夠很直觀的看到當前整個網絡的運行情況
詳細步驟:
1. 創建收集數據庫network,創建networkresult表,用於存放收集的數據
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管理水平。