需求描述:
笔者的公司目前面临这样的情况,在国内有七八家分公司,分公司与总公司之间通过MPLS-VPN来进行连接。如何实时的掌握总公司与分支机构之间的网络状态是笔者目前面临的一个问题。经常会遇到用户反映网络慢,无法收到邮件的问题。因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 (微软官方免费开发工具)
实施效果:
已经部署完成的网络监控系统如下图所示:
从上图可以看到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;[email protected]"
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管理水平。