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
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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此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创建声明(新增)时,其发出的告警邮件如下:

 

 

 

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

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

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

相关文章

本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的...
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中...
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册...
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看...