SQL Server Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现 -1(服务器视角)...
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> 此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> 此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(服务器视角)...相关推荐
- SQL Server AlwaysON从入门到进阶(3)——基础架构
本文属于SQL Server AlwaysON从入门到进阶系列文章 前言: 本文将更加深入地讲解WSFC所需的核心组件.由于AlwaysOn和FCI都需要基于WSFC之上,因此我们首先要了解在Wind ...
- SQL Server AlwaysON从入门到进阶(1)——何为AlwaysON?
本文属于SQL Server AlwaysON从入门到进阶系列文章 本文原文出自Stairway to AlwaysOn系列文章.根据工作需要在学习过程中顺带翻译以供参考.系列文章包含: SQL Se ...
- SQL Server AlwaysON从入门到进阶(6)——分析和部署AlwaysOn Availability Group
本文属于SQL Server AlwaysON从入门到进阶系列文章 前言: 本节是整个系列的重点文章,到现在,读者应该已经对整个高可用架构有一定的了解,知道独立的SQL Server实例和基于群集的S ...
- SQL Server 2005架构
SQL Server 2005架构 转载自:http://blog.csdn.net/motian_shi/article/details/4071616 SQL Server 2005由协议层.关系 ...
- SQL Server内存架构基础
SQL Server内存架构基础 翻译自: https://mssqlwiki.com/sqlwiki/sql-performance/basics-of-sql-server-memory-arch ...
- SQL Server AlwaysOn中的几个误区
SQL Server AlwaysOn中的几个误区 原文: SQL Server AlwaysOn中的几个误区 AlwaysOn自SQL Server2012之后已经发布很久了,最近我在给一些客户做咨 ...
- 阿里云重磅发布RDS for SQL Server AlwaysOn集群版
2018年双十一刚过,阿里云数据库发布RDS for SQL Server AlwaysOn集群版,这是业界除微软云SQL Database外,首家云计算公司基于SQL Server最新AlwaysO ...
- 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇 http://www.cnblogs.com/lyhabc/p/4678330.html 第二篇 http:// ...
- 配置SQL Server AlwaysOn高可用性组
In this article, we will learn the step by step configuration of SQL Server AlwaysOn High availabili ...
最新文章
- 双边滤波算法的原理、流程、实现及效果
- 信捷plc485通信上位机_基于Snap7实现与西门子PLC通信
- python爬虫网络请求超时_python总urllib,伪装,超时设置,异常处理的方法
- (十)HTTP协议【前后端分离的时代,网络请求是前端的生命线】
- 论文原文解读汇总(持续更新中)
- Spring Boot————BeanCreationNotAllowedException异常分析
- 在Web.Config中如何引入相对目录下的Access文件
- 如何在 GitHub 上大显身手?
- Spring MVC EL表达式不能显示
- php基于浏览器的linux终端模拟器,shellinabox基于web浏览器的终端模拟器
- oracle12能卸干净吗,Oracle卸载干净方法
- 肺腑之言-写给喜欢单片机的初学者
- wpf DataGrid 绑定数据源后多一列
- 正则表达式 常用实例 22/10/12
- 史上最“奇葩”相亲男惊呆网友:你那么普通,却那么自信
- only女装2011春款 only2011新款春装 only女装官网专卖
- 最好听的男孩、女孩名字
- [GridView]在 RowCommand事件中,自订的Button 如何取出某一列的索引值(RowIndex)
- 10.java基础----继承、抽象类- 编程
- java12.0.1版本环境变量设置,2019年5月16,小白笔记
热门文章
- html 倒计时字体消失,最简单的一个网页倒计时代码 时间到期后会显示出提醒内容 收藏版...
- 计算机操作基本知识公务员,公务员计算机类操作系统知识.pdf
- python 函数特殊属性
- jinja Whitespace Control
- Python Windows安装
- Recurrent Neural Networks
- 转)VCSA 6.5重启无法访问,报错“503 Service Unavailable”的解决方法
- 拒绝无用的长篇大论!仅12张图片,最全的中台精华都在这里了
- 已激活的windowns、office查看用的密钥
- Java基础学习总结(79)——Java本地接口JNI详解