需求描述:

笔者的公司目前面临这样的情况,在国内有七八家分公司,分公司与总公司之间通过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 (微软官方免费开发工具)

实施效果:

已经部署完成的网络监控系统如下图所示:

简易网络性能监控系统设计_第1张图片

从上图可以看到24小时之内的网络状况,各个地点的网络性能略有不同,这个与流量,带宽等都有关系,通过这样的简易平台,可以很直观的看到当前整个网络的运行状况

详细步骤:

1. 建立收集数据库network,建立networkresult表,用于存放收集的数据

简易网络性能监控系统设计_第2张图片

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管理水平。