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 SET ANSI_PADDING CREATE TABLE [dbo].DBA_ServerIPDataBase_OverCheck]( LocalServerIP] varchar](20) NULL,ClusterName50) ServerIPServerName100) ServerFullNameServerIPTypeDataBaseName300) DisabledFlag1) CreateTimedatetime] CreateByModifyTimeModifyBy ) ON PRIMARY] OFF EXEC sys.sp_addextendedproperty @name=N'MS_Description',@valueWindows集群名称@level0typeSCHEMA@level0name@level1typeTABLE@level1name@level2typeCOLUMN@level2name' IP地址计算机对象名称计算机对象全称0实时有效,1第一次失效,2第二次失效,3第三次失效,4第四次失效,5第五次失效,彻底删除创建时间创建人GO
表 DBA_ServerIPDataBase_OverCheckOriginOrigin,主要存储 以前 (前一个收集周期) Server的信息,是用来比较变化的基准表,其表结构 与表DBA_ServerIPDataBase_OverCheck相同,创建脚本如下:
***** Object: Table [dbo].[DBA_ServerIPDataBase_OverCheckOriginOrigin] Script Date: 2019/6/27 16:56:28 *****DBA_ServerIPDataBase_OverCheckOriginOriginGO
具体的存储过程 USP_DBA_ServerIPDataBase_OverCheck,用来实现 收集、比较、告警等功能,代码实现如下:
***** Object: StoredProcedure [dbo].[USP_DBA_ServerIPDataBase_OverCheck] Script Date: 2019/6/27 15:26:06 *****GO PROCEDURE USP_DBA_ServerIPDataBase_OverCheck] AS BEGIN DECLARE @ipline VARCHAR(200) @ip 20) @pingname 40@ServerName 100@ServerFullName ) Declare @CurrDateTime nvarchar(@PreDiffDateTime 20) ='' Set @CurrDateTimeCONVERT(19),GETDATE(),120) SET NOCOUNT ON @ServerIP SET @ServerName=@@SERVERNAME @ServerIP = CAST(CONNECTIONPROPERTY(local_net_address') AS varchar()) ----Set @ServerIP ='XXX.XXX.XXX.XXX' --如果不准确的话,请手动定义 DELETE FROM DBA_ServerIPDataBase_OverCheck WHERE CreateTime< DATEADD( HH,1)">-10,1)">GETDATE()),1)">) @ip = NULL IF OBJECT_ID(tempdb..#tempserveripIS NOT NULL DROP TABLE #tempserverip TABLE #tempserverip ( ipline ) ) INSERT #tempserverip EXEC master..xp_cmdshell ipconfig /all ' INSERT INTO DBA_ServerIPDataBase_OverCheck ( LocalServerIP,ServerIP,DisabledFlag,CreateTime,CreateBy ) SELECT @ServerIP,p.ServerIP,1)">0'AS DisabledFlag,1)">GETDATE() AS CreateTime,1); font-weight: bold">@@SERVERNAME AS CreateBy dbo.DBA_ServerIPDataBase_OverCheck i RIGHT JOIN ( SELECT RTRIM(LTRIM(REPLACE(SUBSTRING(ipline,1)">CHARINDEX(:+ 1,1)">),1)">(首选)''))) AS ' #tempserverip WHERE UPPER(ipline) LIKE %IPv4 地址%这里需要注意一下,系统不同这里的匹配值就不同 AND NOT %192.168.%' %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.CreateTimegetdate() p.ServerIP ---- DECLARE IP CURSOR FOR SELECT ServerIP FROM dbo.DBA_ServerIPDataBase_OverCheck WHERE DisabledFlag NULL AND DisabledFlag=0 OPEN IP FETCH NEXT FROM IP INTO @ip WHILE @@FETCH_STATUS = 0 BEGIN SET @pingname = 'ping -a ' + @ip @pingname ping -a ' + + -n 1 -l 10' TRUNCATE #tempserverip #tempserverip EXEC master..xp_cmdshell @pingname SELECT @ServerName SUBSTRING(ipline,1); font-weight: bold">8- ))),1)">.XXXXXX.com''),1)">---加域的电脑,计算机名字可能带有域名,请根据实际情况替换 @ServerFullName ))) #tempserverip WHERE ipline %正在 Ping%UPDATE dbo.DBA_ServerIPDataBase_OverCheck SET ServerName @ServerName@ServerFullName WHERE ServerIP @ip @ip END CLOSE IP DEALLOCATE IP dbo.DBA_ServerIPDataBase_OverCheck SET ServerIPType Localhost' WHERE ServerName @@SERVERNAME if sys.availability_group_listener_ip_addressesbegin update a set a.ServerIPTypeListenIP' from DBA_ServerIPDataBase_OverCheck a inner join sys.availability_group_listener_ip_addresses b on a.ServerIPb.ip_address end sys.dm_hadr_clusterUPDATE dbo.DBA_ServerIPDataBase_OverCheck SET ClusterName=(SELECT cluster_name sys.dm_hadr_cluster) SET ServerIPTypeWindowsCluster' WHERE ServerName sys.dm_hadr_cluster) Not Cluster' END 0002 -20180530 针对20180530持续告警问题,发现告警时间超过预期,进行优化。聚焦点再表DBA_ServerIPDataBase_OverCheck中的CreateTime栏位,精准更新 begin UPDATE DBA_ServerIPDataBase_OverCheck SET DataBaseNameSTUFF( (+ name sys.databases WHERE name not in (mastertempdbmodelmsdbReportServerReportServerTempDBdistribution) for xml path('') ),) ---002 end the mail alarm declare @SQL as @Subject 200)DB SERVER IP 有漂移,请检查确认!@Body nvarchar(max)select @PreDiffDateTime= CreateTime from DBA_ServerIPDataBase_OverCheckOriginOrigin order by CreateTime 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 =B.ServerIP WHERE B.ServerIP BEGIN #temp_DBA_ServerIPDataBase_OverCheck_diff SELECT A.NULL if exists( select #temp_DBA_ServerIPDataBase_OverCheck_diff ) begin set @Body= N<html>' + N<style type="text/css"> td {border:solid #9ec9ec; border-width:1px 1px 1px 1px; padding:4px 0px;} table {border:1px solid #9ec9ec;width:80%;border-width:0px 0px 0px 0px;font-size:14px}</style>' <H1 style="color:#FF0000;font-size:14px"></H1>' +<body><font color=#0000CC>Dear All,<br><br> 此List是监控到过去10 MIn Server IP 异常情况,1)">'+服务器有新IP创建声明(新增), 请及时Check。具体数据如下:;<br><br><table><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>' <tr><td>+ClusterName</td><td>+ServerIP+ServerName+ServerIPType+DatabaseName+ DisabledFlag</td></tr>' #temp_DBA_ServerIPDataBase_OverCheck_diff @Body </table><font color=#0000CC><br><br>DBA<br>Best wishes</body><html>end END WHERE A.ServerIP #temp_DBA_ServerIPDataBase_OverCheck_diff 服务器有IP漂移(消减), 请及时Check。具体数据如下:;<br><br><table>end END @BODYREPLACE(@BODY,1)">'''',1)">) ' '')<>'' BEGIN @AllEmailToAddress 3000)'' @AllEmailCcAddress Select @AllEmailToAddresshanmeimei;xiaoming;lilei' @AllEmailCcAddresslaoban' exec msdb..sp_send_dbmail @profile_name = AutoMail' profile 名称,请检查此参数,根据实际情况进行替换 ,1)">@recipients = @AllEmailToAddress 收件人邮箱 ,1)">@copy_recipients@AllEmailCcAddress@subject 邮件标题 ,1)">@body @BODY 邮件内容 ,1)">@body_format HTML' 邮件格式 ,1)">@file_attachments@importance HIGH varchar(10) 告警级别 ----------------新增立即插入----------- insert into ] select a.from DBA_ServerIPDataBase_OverCheck a left DBA_ServerIPDataBase_OverCheckOriginOrigin b b.ServerIP where b.ServerIP is null -漂移后,指定时间段后直接删除过时数据,暂定八个小时。【即如果有漂移(减少),减少的IP信息,则在指定时间后,删除。】 delete b right where a.ServerIP null and b.CreateTime3,1)">)
-----将数据插入到远程Server DB中,远程Server有一个SP过程,用来判断漂移前/后DB是否有变化。远程的SP主要是依据 LocalServerIP 和 ServerIP 对应关系变化情况来判断。这段代码省略,下次再描述 OFF End GO
4.功能实现
例如当 服务器有新IP创建声明(新增)时,其发出的告警邮件如下:
本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!
本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!
本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!