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
GOSET QUOTED_IDENTIFIER ON
GOSET ANSI_PADDING ON
GOCREATE 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]GOSET ANSI_PADDING OFF
GOEXEC 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'
GOEXEC 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'
GOEXEC 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'
GOEXEC 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'
GOEXEC 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'
GOEXEC 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'
GOEXEC 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'
GOEXEC 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
GOSET QUOTED_IDENTIFIER ON
GOSET ANSI_PADDING ON
GOCREATE 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]GOSET 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
GOSET QUOTED_IDENTIFIER ON
GOCREATE 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 ONDeclare @ServerIP VARCHAR(20)SET @ServerName=@@SERVERNAMESET @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 NULLDROP TABLE #tempserverip CREATE TABLE #tempserverip ( ipline VARCHAR(200) ) INSERT  #tempserveripEXEC master..xp_cmdshell 'ipconfig /all ' INSERT  INTO DBA_ServerIPDataBase_OverCheck( LocalServerIP,ServerIP,DisabledFlag,CreateTime,CreateBy)SELECT @ServerIP, p.ServerIP,'0'AS DisabledFlag,GETDATE() AS CreateTime ,@@SERVERNAME AS CreateByFROM    dbo.DBA_ServerIPDataBase_OverCheck iRIGHT JOIN ( SELECT RTRIM(LTRIM(REPLACE(SUBSTRING(ipline,CHARINDEX(':',ipline) + 1, 20),'(首选)', ''))) AS 'ServerIP'FROM   #tempserveripWHERE  UPPER(ipline) LIKE '%IPv4 地址%'--这里需要注意一下,系统不同这里的匹配值就不同 AND UPPER(ipline) NOT LIKE '%192.168.%'AND UPPER(ipline) NOT LIKE '%169.254.%') p ON i.ServerIP = p.ServerIPWHERE   i.ServerIP IS NULL  --只关注漂来飘往数据--0002 -20180530 针对20180530持续告警问题,发现告警时间超过预期,进行优化。聚焦点再表DBA_ServerIPDataBase_OverCheck中的CreateTime栏位,精准更新  beginupdate i set i.CreateTime=getdate()FROM    dbo.DBA_ServerIPDataBase_OverCheck iRIGHT JOIN ( SELECT RTRIM(LTRIM(REPLACE(SUBSTRING(ipline,CHARINDEX(':',ipline) + 1, 20),'(首选)', ''))) AS 'ServerIP'FROM   #tempserveripWHERE  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 CURSORFORSELECT  ServerIPFROM    dbo.DBA_ServerIPDataBase_OverCheck WHERE DisabledFlag IS NOT NULL AND DisabledFlag=0OPEN IPFETCH NEXT FROM IP INTO @ipWHILE @@FETCH_STATUS = 0BEGIN--SET @pingname = 'ping -a ' + @ipSET @pingname = 'ping -a ' + @ip + ' -n 1 -l 10'TRUNCATE TABLE #tempserveripINSERT  #tempserveripEXEC master..xp_cmdshell @pingnameSELECT  @ServerName = REPLACE(RTRIM(LTRIM(SUBSTRING(ipline, 8,CHARINDEX('[',ipline) - 8))),'.XXXXXX.com', '') ,-----加域的电脑,计算机名字可能带有域名,请根据实际情况替换@ServerFullName = RTRIM(LTRIM(SUBSTRING(ipline, 8,CHARINDEX('[',ipline) - 8)))FROM    #tempserveripWHERE   ipline LIKE '%正在 Ping%'UPDATE  dbo.DBA_ServerIPDataBase_OverCheckSET     ServerName = @ServerName ,ServerFullName = @ServerFullNameWHERE   ServerIP = @ipFETCH NEXT FROM IP INTO @ipENDCLOSE IP DEALLOCATE IPUPDATE  dbo.DBA_ServerIPDataBase_OverCheckSET     ServerIPType = 'Localhost'WHERE   ServerName = @@SERVERNAMEif OBJECT_ID('sys.availability_group_listener_ip_addresses') IS NOT NULL beginupdate a set a.ServerIPType='ListenIP'from DBA_ServerIPDataBase_OverCheck a inner join sys.availability_group_listener_ip_addresses bon a.ServerIP=b.ip_addressend IF OBJECT_ID('sys.dm_hadr_cluster') IS NOT NULLBEGINUPDATE 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)ENDIF OBJECT_ID('sys.dm_hadr_cluster') IS NULLBEGINUPDATE dbo.DBA_ServerIPDataBase_OverCheck SET ClusterName='Not Cluster'END
--0002 -20180530  针对20180530持续告警问题,发现告警时间超过预期,进行优化。聚焦点再表DBA_ServerIPDataBase_OverCheck中的CreateTime栏位,精准更新  beginUPDATE 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_OverCheckOriginOriginorder by CreateTimeSELECT  TOP 0 A.*  into #temp_DBA_ServerIPDataBase_OverCheck_diff FROM DBA_ServerIPDataBase_OverCheck A INNER JOIN DBA_ServerIPDataBase_OverCheckOriginOrigin  BON 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)BEGININSERT  INTO  #temp_DBA_ServerIPDataBase_OverCheck_diffSELECT A.*  FROM DBA_ServerIPDataBase_OverCheck A LEFT JOIN DBA_ServerIPDataBase_OverCheckOriginOrigin  B ON A.ServerIP =B.ServerIP  WHERE B.ServerIP IS NULLif exists(    select * from #temp_DBA_ServerIPDataBase_OverCheck_diff  ) beginset @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 ENDIF EXISTS(SELECT * FROM DBA_ServerIPDataBase_OverCheck A RIGHT JOIN DBA_ServerIPDataBase_OverCheckOriginOrigin  B ON A.ServerIP =B.ServerIP  WHERE A.ServerIP IS NULL)BEGINDELETE FROM #temp_DBA_ServerIPDataBase_OverCheck_diffINSERT  INTO  #temp_DBA_ServerIPDataBase_OverCheck_diffSELECT A.*  FROM DBA_ServerIPDataBase_OverCheck A RIGHT JOIN DBA_ServerIPDataBase_OverCheckOriginOrigin  B ON A.ServerIP =B.ServerIP  WHERE A.ServerIP IS NULLif exists(    select * from #temp_DBA_ServerIPDataBase_OverCheck_diff  ) beginset @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,' ','')<>''BEGINDeclare @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 bon a.ServerIP=b.ServerIPwhere b.ServerIP is null---漂移后,指定时间段后直接删除过时数据,暂定八个小时。【即如果有漂移(减少),减少的IP信息,则在指定时间后,删除。】delete bfrom  DBA_ServerIPDataBase_OverCheck a right join DBA_ServerIPDataBase_OverCheckOriginOrigin bon a.ServerIP=b.ServerIPwhere a.ServerIP is nulland b.CreateTime< CONVERT(VARCHAR(19),DATEADD( HH,-3,GETDATE()),120)

       -----将数据插入到远程Server DB中,远程Server有一个SP过程,用来判断漂移前/后DB是否有变化。远程的SP主要是依据 LocalServerIP 和 ServerIP 对应关系变化情况来判断。这段代码省略,下次再描述SET NOCOUNT OFF EndGO

4.功能实现

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

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

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

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

转载于:https://www.cnblogs.com/xuliuzai/p/11099058.html

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

  1. SQL Server AlwaysON从入门到进阶(3)——基础架构

    本文属于SQL Server AlwaysON从入门到进阶系列文章 前言: 本文将更加深入地讲解WSFC所需的核心组件.由于AlwaysOn和FCI都需要基于WSFC之上,因此我们首先要了解在Wind ...

  2. SQL Server AlwaysON从入门到进阶(1)——何为AlwaysON?

    本文属于SQL Server AlwaysON从入门到进阶系列文章 本文原文出自Stairway to AlwaysOn系列文章.根据工作需要在学习过程中顺带翻译以供参考.系列文章包含: SQL Se ...

  3. SQL Server AlwaysON从入门到进阶(6)——分析和部署AlwaysOn Availability Group

    本文属于SQL Server AlwaysON从入门到进阶系列文章 前言: 本节是整个系列的重点文章,到现在,读者应该已经对整个高可用架构有一定的了解,知道独立的SQL Server实例和基于群集的S ...

  4. SQL Server 2005架构

    SQL Server 2005架构 转载自:http://blog.csdn.net/motian_shi/article/details/4071616 SQL Server 2005由协议层.关系 ...

  5. SQL Server内存架构基础

    SQL Server内存架构基础 翻译自: https://mssqlwiki.com/sqlwiki/sql-performance/basics-of-sql-server-memory-arch ...

  6. SQL Server AlwaysOn中的几个误区

    SQL Server AlwaysOn中的几个误区 原文: SQL Server AlwaysOn中的几个误区 AlwaysOn自SQL Server2012之后已经发布很久了,最近我在给一些客户做咨 ...

  7. 阿里云重磅发布RDS for SQL Server AlwaysOn集群版

    2018年双十一刚过,阿里云数据库发布RDS for SQL Server AlwaysOn集群版,这是业界除微软云SQL Database外,首家云计算公司基于SQL Server最新AlwaysO ...

  8. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇 http://www.cnblogs.com/lyhabc/p/4678330.html 第二篇 http:// ...

  9. 配置SQL Server AlwaysOn高可用性组

    In this article, we will learn the step by step configuration of SQL Server AlwaysOn High availabili ...

最新文章

  1. 双边滤波算法的原理、流程、实现及效果
  2. 信捷plc485通信上位机_基于Snap7实现与西门子PLC通信
  3. python爬虫网络请求超时_python总urllib,伪装,超时设置,异常处理的方法
  4. (十)HTTP协议【前后端分离的时代,网络请求是前端的生命线】
  5. 论文原文解读汇总(持续更新中)
  6. Spring Boot————BeanCreationNotAllowedException异常分析
  7. 在Web.Config中如何引入相对目录下的Access文件
  8. 如何在 GitHub 上大显身手?
  9. Spring MVC EL表达式不能显示
  10. php基于浏览器的linux终端模拟器,shellinabox基于web浏览器的终端模拟器
  11. oracle12能卸干净吗,Oracle卸载干净方法
  12. 肺腑之言-写给喜欢单片机的初学者
  13. wpf DataGrid 绑定数据源后多一列
  14. 正则表达式 常用实例 22/10/12
  15. 史上最“奇葩”相亲男惊呆网友:你那么普通,却那么自信
  16. only女装2011春款 only2011新款春装 only女装官网专卖
  17. 最好听的男孩、女孩名字
  18. [GridView]在 RowCommand事件中,自订的Button 如何取出某一列的索引值(RowIndex)
  19. 10.java基础----继承、抽象类- 编程
  20. java12.0.1版本环境变量设置,2019年5月16,小白笔记

热门文章

  1. html 倒计时字体消失,最简单的一个网页倒计时代码 时间到期后会显示出提醒内容 收藏版...
  2. 计算机操作基本知识公务员,公务员计算机类操作系统知识.pdf
  3. python 函数特殊属性
  4. jinja Whitespace Control
  5. Python Windows安装
  6. Recurrent Neural Networks
  7. 转)VCSA 6.5重启无法访问,报错“503 Service Unavailable”的解决方法
  8. 拒绝无用的长篇大论!仅12张图片,最全的中台精华都在这里了
  9. 已激活的windowns、office查看用的密钥
  10. Java基础学习总结(79)——Java本地接口JNI详解