1.需求概括

我们知道,在SQL Server Alwayson 架构中,有多种虚拟IP,例如 WindowsCluster IP,ListenIP,角色高可用性IP(类似于侦听IP)。在某些条件下,例如系统故障,会触发虚拟IP的漂移,如何高效率、低延迟、更好地监控IP漂移情况,是我们DB的一个重要工作。

下面是我们的一个通过SQL Server 存储过程来实现的方案。

2.基本原理

周期性收集当前Server 上相应的IP地址,并与上个周期收集的结果比较判断,看那些IP发生了漂移变化。其主要流程图如下;

3.代码实现

表 DBA_ServerIPDataBase_OverCheck,主要存储 当前 (本收集周期) Server的信息(主要是IP信息、ServerName信息等),其创建脚本如下;

/****** Object:  Table [dbo].[DBA_ServerIPDataBase_OverCheck]    Script Date: 2019/6/27 16:01:27 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO SET ANSI_PADDING ON
GO CREATE TABLE [dbo].[DBA_ServerIPDataBase_OverCheck](
[LocalServerIP] [varchar](20) NULL,
[ClusterName] [varchar](50) NULL,
[ServerIP] [varchar](20) NULL,
[ServerName] [varchar](100) NULL,
[ServerFullName] [varchar](100) NULL,
[ServerIPType] [varchar](20) NULL,
[DataBaseName] [varchar](300) NULL,
[DisabledFlag] [varchar](1) NULL,
[CreateTime] [datetime] NULL,
[CreateBy] [varchar](50) NULL,
[ModifyTime] [datetime] NULL,
[ModifyBy] [varchar](50) NULL
) ON [PRIMARY] GO SET ANSI_PADDING OFF
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Windows集群名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'DBA_ServerIPDataBase_OverCheck', @level2type=N'COLUMN',@level2name=N'ClusterName'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'IP地址' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'DBA_ServerIPDataBase_OverCheck', @level2type=N'COLUMN',@level2name=N'ServerIP'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'计算机对象名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'DBA_ServerIPDataBase_OverCheck', @level2type=N'COLUMN',@level2name=N'ServerName'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'计算机对象全称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'DBA_ServerIPDataBase_OverCheck', @level2type=N'COLUMN',@level2name=N'ServerFullName'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'计算机对象全称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'DBA_ServerIPDataBase_OverCheck', @level2type=N'COLUMN',@level2name=N'ServerIPType'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'0实时有效,1第一次失效,2第二次失效,3第三次失效,4第四次失效,5第五次失效,彻底删除' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'DBA_ServerIPDataBase_OverCheck', @level2type=N'COLUMN',@level2name=N'DisabledFlag'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'DBA_ServerIPDataBase_OverCheck', @level2type=N'COLUMN',@level2name=N'CreateTime'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建人' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'DBA_ServerIPDataBase_OverCheck', @level2type=N'COLUMN',@level2name=N'CreateBy'
GO

表 DBA_ServerIPDataBase_OverCheckOriginOrigin,主要存储 以前 (前一个收集周期) Server的信息,是用来比较变化的基准表,其表结构 与表DBA_ServerIPDataBase_OverCheck相同,创建脚本如下:

/****** Object:  Table [dbo].[DBA_ServerIPDataBase_OverCheckOriginOrigin]    Script Date: 2019/6/27 16:56:28 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO SET ANSI_PADDING ON
GO CREATE TABLE [dbo].[DBA_ServerIPDataBase_OverCheckOriginOrigin](
[LocalServerIP] [varchar](20) NULL,
[ClusterName] [varchar](50) NULL,
[ServerIP] [varchar](20) NULL,
[ServerName] [varchar](100) NULL,
[ServerFullName] [varchar](100) NULL,
[ServerIPType] [varchar](20) NULL,
[DataBaseName] [varchar](300) NULL,
[DisabledFlag] [varchar](1) NULL,
[CreateTime] [datetime] NULL,
[CreateBy] [varchar](50) NULL,
[ModifyTime] [datetime] NULL,
[ModifyBy] [varchar](50) NULL
) ON [PRIMARY] GO SET ANSI_PADDING OFF
GO

具体的存储过程 USP_DBA_ServerIPDataBase_OverCheck,用来实现 收集、比较、告警等功能,代码实现如下:

/****** Object:  StoredProcedure [dbo].[USP_DBA_ServerIPDataBase_OverCheck]    Script Date: 2019/6/27 15:26:06 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE PROCEDURE [dbo].[USP_DBA_ServerIPDataBase_OverCheck]
AS
BEGIN DECLARE @ipline VARCHAR(200)
DECLARE @ip VARCHAR(20)
DECLARE @pingname VARCHAR(40)
DECLARE @ServerName VARCHAR(100)
DECLARE @ServerFullName VARCHAR(100) Declare @CurrDateTime nvarchar(20)
Declare @PreDiffDateTime nvarchar(20) ='' Set @CurrDateTime=CONVERT(VARCHAR(19),GETDATE(),120) SET NOCOUNT ON Declare @ServerIP VARCHAR(20)
SET @ServerName=@@SERVERNAME
SET @ServerIP = CAST(CONNECTIONPROPERTY('local_net_address') AS varchar(20)) ----Set @ServerIP ='XXX.XXX.XXX.XXX' --如果不准确的话,请手动定义 DELETE FROM DBA_ServerIPDataBase_OverCheck
WHERE CreateTime< CONVERT(VARCHAR(19),DATEADD( HH,-10,GETDATE()),120) SET @ip = NULL
IF OBJECT_ID('tempdb..#tempserverip') IS NOT NULL
DROP TABLE #tempserverip
CREATE TABLE #tempserverip ( ipline VARCHAR(200) )
INSERT #tempserverip
EXEC master..xp_cmdshell 'ipconfig /all ' INSERT INTO DBA_ServerIPDataBase_OverCheck
( LocalServerIP,ServerIP,DisabledFlag,CreateTime,CreateBy
)
SELECT @ServerIP, p.ServerIP,''AS DisabledFlag,GETDATE() AS CreateTime ,@@SERVERNAME AS CreateBy
FROM dbo.DBA_ServerIPDataBase_OverCheck i
RIGHT JOIN ( SELECT RTRIM(LTRIM(REPLACE(SUBSTRING(ipline,
CHARINDEX(':',
ipline) + 1, 20),
'(首选)', ''))) AS 'ServerIP'
FROM #tempserverip
WHERE UPPER(ipline) LIKE '%IPv4 地址%'--这里需要注意一下,系统不同这里的匹配值就不同
AND UPPER(ipline) NOT LIKE '%192.168.%'
AND UPPER(ipline) NOT LIKE '%169.254.%'
) p ON i.ServerIP = p.ServerIP
WHERE i.ServerIP IS NULL --只关注漂来飘往数据 --0002 -20180530 针对20180530持续告警问题,发现告警时间超过预期,进行优化。聚焦点再表DBA_ServerIPDataBase_OverCheck中的CreateTime栏位,精准更新 begin
update i set i.CreateTime=getdate()
FROM dbo.DBA_ServerIPDataBase_OverCheck i
RIGHT JOIN ( SELECT RTRIM(LTRIM(REPLACE(SUBSTRING(ipline,
CHARINDEX(':',
ipline) + 1, 20),
'(首选)', ''))) AS 'ServerIP'
FROM #tempserverip
WHERE UPPER(ipline) LIKE '%IPv4 地址%'--这里需要注意一下,系统不同这里的匹配值就不同
AND UPPER(ipline) NOT LIKE '%192.168.%'
AND UPPER(ipline) NOT LIKE '%169.254.%'
) p ON i.ServerIP = p.ServerIP ------
DECLARE IP CURSOR
FOR
SELECT ServerIP
FROM dbo.DBA_ServerIPDataBase_OverCheck WHERE DisabledFlag IS NOT NULL AND DisabledFlag=0
OPEN IP
FETCH NEXT FROM IP INTO @ip
WHILE @@FETCH_STATUS = 0
BEGIN
--SET @pingname = 'ping -a ' + @ip
SET @pingname = 'ping -a ' + @ip + ' -n 1 -l 10' TRUNCATE TABLE #tempserverip
INSERT #tempserverip
EXEC master..xp_cmdshell @pingname SELECT @ServerName = REPLACE(RTRIM(LTRIM(SUBSTRING(ipline, 8,
CHARINDEX('[',
ipline) - 8))),
'.XXXXXX.com', '') ,-----加域的电脑,计算机名字可能带有域名,请根据实际情况替换
@ServerFullName = RTRIM(LTRIM(SUBSTRING(ipline, 8,
CHARINDEX('[',
ipline) - 8)))
FROM #tempserverip
WHERE ipline LIKE '%正在 Ping%' UPDATE dbo.DBA_ServerIPDataBase_OverCheck
SET ServerName = @ServerName ,
ServerFullName = @ServerFullName
WHERE ServerIP = @ip FETCH NEXT FROM IP INTO @ip
END
CLOSE IP
DEALLOCATE IP UPDATE dbo.DBA_ServerIPDataBase_OverCheck
SET ServerIPType = 'Localhost'
WHERE ServerName = @@SERVERNAME if OBJECT_ID('sys.availability_group_listener_ip_addresses') IS NOT NULL
begin
update a set a.ServerIPType='ListenIP'
from DBA_ServerIPDataBase_OverCheck a inner join sys.availability_group_listener_ip_addresses b
on a.ServerIP=b.ip_address
end IF OBJECT_ID('sys.dm_hadr_cluster') IS NOT NULL
BEGIN
UPDATE dbo.DBA_ServerIPDataBase_OverCheck SET ClusterName=(SELECT cluster_name FROM sys.dm_hadr_cluster)
UPDATE dbo.DBA_ServerIPDataBase_OverCheck SET ServerIPType='WindowsCluster' WHERE ServerName=(SELECT cluster_name FROM sys.dm_hadr_cluster)
END
IF OBJECT_ID('sys.dm_hadr_cluster') IS NULL
BEGIN
UPDATE dbo.DBA_ServerIPDataBase_OverCheck SET ClusterName='Not Cluster'
END
--0002 -20180530 针对20180530持续告警问题,发现告警时间超过预期,进行优化。聚焦点再表DBA_ServerIPDataBase_OverCheck中的CreateTime栏位,精准更新 begin
UPDATE DBA_ServerIPDataBase_OverCheck SET DataBaseName=STUFF(
(SELECT ',' + name FROM sys.databases
WHERE name not in ('master'
,'tempdb','model','msdb','ReportServer','ReportServerTempDB','distribution')
for xml path('') ),
1,1,'')
-----002 end
--the mail alarm
declare @SQL as varchar(200)
declare @Subject as varchar(200)=N'DB SERVER IP 有漂移,请检查确认!'
declare @Body as nvarchar(max)='' select @PreDiffDateTime= CreateTime from DBA_ServerIPDataBase_OverCheckOriginOrigin
order by CreateTime SELECT TOP 0 A.* into #temp_DBA_ServerIPDataBase_OverCheck_diff FROM DBA_ServerIPDataBase_OverCheck A INNER JOIN DBA_ServerIPDataBase_OverCheckOriginOrigin B
ON A.ServerIP =B.ServerIP IF EXISTS(SELECT * FROM DBA_ServerIPDataBase_OverCheck A LEFT JOIN DBA_ServerIPDataBase_OverCheckOriginOrigin B ON A.ServerIP =B.ServerIP WHERE B.ServerIP IS NULL)
BEGIN INSERT INTO #temp_DBA_ServerIPDataBase_OverCheck_diff
SELECT A.* FROM DBA_ServerIPDataBase_OverCheck A LEFT JOIN DBA_ServerIPDataBase_OverCheckOriginOrigin B ON A.ServerIP =B.ServerIP WHERE B.ServerIP IS NULL if exists( select * from #temp_DBA_ServerIPDataBase_OverCheck_diff )
begin
set @Body= N'<html>'
+ N'<style type="text/css">'
+ N' td {border:solid #9ec9ec; border-width:1px 1px 1px 1px; padding:4px 0px;}'
+ N' table {border:1px solid #9ec9ec;width:80%;border-width:0px 0px 0px 0px;font-size:14px}'
+ N'</style>'
+ N'<H1 style="color:#FF0000;font-size:14px"></H1>'
SET @Body=@Body+'<body><font color=#0000CC>Dear All,<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此List是监控到过去10 MIn Server IP 异常情况,'+@ServerIP +'服务器有新IP创建声明(新增), 请及时Check。具体数据如下:;<br><br><table>'
SET @Body=@Body+'<tr bgcolor=#FFFF00 align="center"><td>ClusterName</td><td>ServerIP</td><td>ServerName</td><td>ServerIPType</td><td>DatabaseName</td><td>DisabledFlag</td><td>当前时间</td><td>差异采样时间</td></tr>'
SELECT @Body=@Body+'<tr><td>'+ClusterName+'</td><td>'+ServerIP+'</td><td>'+ServerName+'</td><td>'+ServerIPType+'</td><td>'+DatabaseName+'</td><td>'+ DisabledFlag+'</td><td>'+@CurrDateTime+'</td><td>'+ @PreDiffDateTime+'</td></tr>'
from #temp_DBA_ServerIPDataBase_OverCheck_diff SET @Body = @Body +'</table><font color=#0000CC><br><br>DBA<br>Best wishes</body><html>'
end
END IF EXISTS(SELECT * FROM DBA_ServerIPDataBase_OverCheck A RIGHT JOIN DBA_ServerIPDataBase_OverCheckOriginOrigin B ON A.ServerIP =B.ServerIP WHERE A.ServerIP IS NULL)
BEGIN DELETE FROM #temp_DBA_ServerIPDataBase_OverCheck_diff
INSERT INTO #temp_DBA_ServerIPDataBase_OverCheck_diff
SELECT A.* FROM DBA_ServerIPDataBase_OverCheck A RIGHT JOIN DBA_ServerIPDataBase_OverCheckOriginOrigin B ON A.ServerIP =B.ServerIP WHERE A.ServerIP IS NULL if exists( select * from #temp_DBA_ServerIPDataBase_OverCheck_diff )
begin
set @Body= N'<html>'
+ N'<style type="text/css">'
+ N' td {border:solid #9ec9ec; border-width:1px 1px 1px 1px; padding:4px 0px;}'
+ N' table {border:1px solid #9ec9ec;width:80%;border-width:0px 0px 0px 0px;font-size:14px}'
+ N'</style>'
+ N'<H1 style="color:#FF0000;font-size:14px"></H1>'
SET @Body=@Body+'<body><font color=#0000CC>Dear All,<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此List是监控到过去10 MIn Server IP 异常情况,'+@ServerIP +'服务器有IP漂移(消减), 请及时Check。具体数据如下:;<br><br><table>'
SET @Body=@Body+'<tr bgcolor=#FFFF00 align="center"><td>ClusterName</td><td>ServerIP</td><td>ServerName</td><td>ServerIPType</td><td>DatabaseName</td><td>DisabledFlag</td><td>当前时间</td><td>差异采样时间</td></tr>'
SELECT @Body=@Body+'<tr><td>'+ClusterName+'</td><td>'+ServerIP+'</td><td>'+ServerName+'</td><td>'+ServerIPType+'</td><td>'+DatabaseName+'</td><td>'+ DisabledFlag+'</td><td>'+@CurrDateTime+'</td><td>'+ @PreDiffDateTime+'</td></tr>'
from #temp_DBA_ServerIPDataBase_OverCheck_diff SET @Body = @Body +'</table><font color=#0000CC><br><br>DBA<br>Best wishes</body><html>'
end END
SET @BODY=REPLACE(@BODY,'''','')
IF REPLACE(@BODY,' ','')<>''
BEGIN Declare @AllEmailToAddress varchar(3000)=''
Declare @AllEmailCcAddress varchar(3000)=''
Select @AllEmailToAddress='hanmeimei;xiaoming;lilei' Select @AllEmailCcAddress='laoban' exec msdb..sp_send_dbmail @profile_name = 'AutoMail' -- profile 名称,请检查此参数,根据实际情况进行替换
,@recipients = @AllEmailToAddress -- 收件人邮箱
,@copy_recipients=@AllEmailCcAddress
,@subject = @Subject -- 邮件标题
,@body = @BODY -- 邮件内容
,@body_format = 'HTML' -- 邮件格式
,@file_attachments=''
,@importance = 'HIGH' -- varchar(10) 告警级别
END ------------------新增立即插入----------- insert into [dbo].[DBA_ServerIPDataBase_OverCheckOriginOrigin]
select a.* from DBA_ServerIPDataBase_OverCheck a left join DBA_ServerIPDataBase_OverCheckOriginOrigin b
on a.ServerIP=b.ServerIP
where b.ServerIP is null ---漂移后,指定时间段后直接删除过时数据,暂定八个小时。【即如果有漂移(减少),减少的IP信息,则在指定时间后,删除。】 delete b
from DBA_ServerIPDataBase_OverCheck a right join DBA_ServerIPDataBase_OverCheckOriginOrigin b
on a.ServerIP=b.ServerIP
where a.ServerIP is null
and b.CreateTime< CONVERT(VARCHAR(19),DATEADD( HH,-3,GETDATE()),120) -----将数据插入到远程Server DB中,远程Server有一个SP过程,用来判断漂移前/后DB是否有变化。远程的SP主要是依据 LocalServerIP 和 ServerIP 对应关系变化情况来判断。这段代码省略,下次再描述 SET NOCOUNT OFF End GO

4.功能实现

例如当 服务器有新IP创建声明(新增)时,其发出的告警邮件如下:

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现的更多相关文章

  1. SQL Server Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现 -2(虚拟IP视角)

    1.需求描述 我们知道Windows Cluster 都是多节点的,当虚拟IP漂移的时候,一般都是从一个节点漂移到另外一个节点.如果可以及时捕捉到旧节点信息是什么.新节点信息是什么对我们提供高可用的数 ...

  2. linux下如何设置vip(虚拟ip)

    在做HA的时候需要为服务器设计虚拟IP,也就是一个主机对应多个IP地址?刚听起来好神奇,原来这样也是可能的看了下面的这个链接 自己配了一下http://hi.baidu.com/pbottle/ite ...

  3. 微服务管理平台nacos虚拟ip负载均衡集群模式搭建

    一.Nacos简介 Nacos是用于微服务管理的平台,其核心功能是服务注册与发现.服务配置管理. Nacos作为服务注册发现组件,可以替换Spring Cloud应用中传统的服务注册于发现组件,如:E ...

  4. Keepalived虚拟ip

    linux下如何设置vip(虚拟ip) 在做HA的时候需要为服务器设计虚拟IP,也就是一个主机对应多个IP地址?刚听起来好神奇,原来这样也是可能的看了下面的这个链接 自己配了一下http://hi.b ...

  5. 以用户注册功能模块为例浅谈MVC架构下的JavaWeb开发流程

    JavaWeb应用开发,撇开分布式不谈,只讨论一个功能服务应用的开发,无论是使用原生的Servlet/JSP方案,还是时下的SSM架构,都有一套经过工程实践考验的最佳实践,这综合考虑了团队协作.项目管 ...

  6. 虚拟IP和IP漂移

    学习一下虚拟IP和IP漂移的概念. 1.虚拟IP 在 TCP/IP 的架构下,所有想上网的电脑,不论是用何种方式连上网路,都必须要有一个唯一的 IP-address.事实上IP地址是主机硬件地址的一种 ...

  7. 虚拟IP技术 ip地址漂移技术

    虚拟IP地址(VIP) 是一个不与特定计算机或一个计算机中的网络接口卡(NIC)相连的IP地址.数据包被发送到这个VIP地址,但是所有的数据还是经过真实的网络接口.VIPs大部分用于连接冗余:一个VI ...

  8. MVC项目实践,在三层架构下实现SportsStore-08,部署到IIS服务器

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. Windows环境下使用bitvise架构sftp服务器

    Windows环境下使用Bitvise架构sftp服务器 Bitvise分成Bitvise ssh server和Bitvise ssh client 0 说明:文档暂时只使用Bitvise工具做搭建 ...

随机推荐

  1. pushbutton成为可点击的图标(实现全透明,不论点击与否都只显示Icon)(也就是一个万能控件)

    需求 需要2个按钮,一个是音乐开关,一个是关闭窗口,此文章关闭pushButton的透明问题(hovered+pressed都不会有背景色和边框的变化) 原理 使窗口完全透明 代码 _pPushBut ...

  2. hdu1845 Jimmy’s Assignment --- 完整匹配

    意甲冠军: 它需要一个特殊的图,以找到最大匹配.该图的特征是:无向图,度的每个节点3.这是一个双边连接组件(the graph is 2-edge-connected (that is, at lea ...

  3. Android 光标位置设置

    EditText edit =(EditText) findViewById(R.id.etTest); 1.设置光标在EditText中的指定位置 edit.setSelection(1); 需要注 ...

  4. sqlplus登录信息,列出所有表,列在表结构,sqlplus行和列显示设置,别名,Null值问题,细木工,DISTINCT

     1 sqlplus登录方式: 普通用户登录: 登录eg:C:\>sqlplusscott/11  (格式:sqlplus username/password) 退出eg:quit退出 超级 ...

  5. 6 Wcf使用Stream传输

    1.创建service和client项目 service项目新建wcf服务文件 MediaService 和 IMediaService IMediaService 代码为 using System. ...

  6. WPF: Creation of Text Labels for 3D Scene

    原文:WPF: Creation of Text Labels for 3D Scene 转载:http://www.codeproject.com/KB/WPF/WPF_Text3D.aspx Do ...

  7. python3操作注册表设置/取消IE代理

    import io, sys, time, re, os import winreg def enableProxy(IP, Port): proxy = IP + ":" + s ...

  8. SecureCRT循环检查设备状态

    1: #$language = "VBScript" 2: #$interface = "1.0" 3: 4: ' This automatically gen ...

  9. Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK

    原文:Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...

  10. WPF与缓动(二) 正弦与余弦缓动

    原文:WPF与缓动(二) 正弦与余弦缓动   WPF与缓动(二) 正弦与余弦缓动                                                             ...