SQL Server Alwayson架構下 伺服器 各虛擬IP漂移監控告警的功能實現 -2(虛擬IP視角)

来源:https://www.cnblogs.com/xuliuzai/archive/2019/06/28/11101780.html
-Advertisement-
Play Games

1.需求描述 我們知道Windows Cluster 都是多節點的,當虛擬IP漂移的時候,一般都是從一個節點漂移到另外一個節點。如果可以及時捕捉到舊節點信息是什麼、新節點信息是什麼對我們提供高可用的資料庫服務很重要,只有捕捉到這些信息後才可以進一步檢查相應的Job、賬號,甚至是調整相應的應用服務等。 ...


1.需求描述

我們知道Windows Cluster 都是多節點的,當虛擬IP漂移的時候,一般都是從一個節點漂移到另外一個節點。如果可以及時捕捉到舊節點信息是什麼、新節點信息是什麼對我們提供高可用的資料庫服務很重要,只有捕捉到這些信息後才可以進一步檢查相應的Job、賬號,甚至是調整相應的應用服務等。

2.基本原理

在上一節《SQL Server Alwayson架構下 伺服器 各虛擬IP漂移監控告警的功能實現 -1(伺服器視角)》,我們實現了針對某一個節點的監控即這個節點是否有虛擬IP新增或消減。接下來我們需要實現的是針對一個集群(或是Alwayson)漂移情況的監控,例如監控虛擬IP是從哪兒來,又要到哪兒去。這個功能的實現依賴上一節的功能和數據。

實現方式是將各個單節點的數據發送保存到一臺遠程伺服器上,然後根據集群信息進行聚合判斷就可以了。

其聚合判斷功能實現:根據指定時間段內,同一個虛擬IP是否對應兩個ServerIP,來判讀是否發生了漂移。如果發生了漂移,進而根據相應數據的時間先後判斷從哪兒來,到哪兒去。

3.代碼實現

 

中央伺服器中表 DBA_ServerIPDataBase_OverCheck 的創建腳本。主要存儲了指定時間段內(例如 6H),各個Server節點的各種IP數據。

/****** Object:  Table [dbo].[DBA_ServerIPDataBase_OverCheck]    Script Date: 2019/6/28 11:24:11 ******/
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](550) 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_ServerIPDataBaseCheck_Base,存儲比較的數據。

/****** Object:  Table [dbo].[DBA_ServerIPDataBaseCheck_Base]    Script Date: 2019/6/28 13:33:50 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[DBA_ServerIPDataBaseCheck_Base](
    [LocalServerIP] [varchar](20) NULL,
    [ServerIP] [varchar](20) NULL,
    [MaxCurrDateTime] [datetime] NULL,
    [DataBaseName] [varchar](550) NULL,
    [IPFailOverResult] [varchar](50) NULL,
    [DBFailOverResult] [varchar](250) NULL,
    [CreateTime] [nvarchar](20) NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

 

在各個DB Server上原來的存儲過程  USP_DBA_ServerIPDataBase_OverCheck 的尾部,添加以下代碼,實現的功能是將數據彙總到中央伺服器的資料庫中,用來聚合判斷。

(USP_DBA_ServerIPDataBase_OverCheck的更多內容,請參照SQL Server Alwayson架構下 伺服器 各虛擬IP漂移監控告警的功能實現 -1(伺服器視角)

 

        -----將數據插入到遠程Server DB中,用來判斷漂移前/後DB是否有變化

        INSERT INTO [中心伺服器IP].中心資料庫.dbo.[DBA_ServerIPDataBase_OverCheck]([LocalServerIP]
              ,[ClusterName] ,[ServerIP]
              ,[ServerName]
              ,[ServerFullName]
              ,[ServerIPType]
              ,[DataBaseName]
              ,[DisabledFlag]
              ,[CreateTime],[CreateBy],[ModifyTime] ,[ModifyBy])
        SELECT [LocalServerIP]
              ,[ClusterName]
              ,[ServerIP]
              ,[ServerName]
              ,[ServerFullName]
              ,[ServerIPType]
              ,[DataBaseName]
              ,[DisabledFlag]
              ,[CreateTime]
              ,[CreateBy]
              ,[ModifyTime]
              ,[ModifyBy]
          FROM [dbo].[DBA_ServerIPDataBase_OverCheck]

 聚合判斷、發郵件的存儲過程為 USP_DBA_ServerIPDataBase_OverCheck_Alarm,其具體的腳本如下:

 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[USP_DBA_ServerIPDataBase_OverCheck_Alarm]
AS
BEGIN 

 SET NOCOUNT ON
 
        DECLARE @Localip VARCHAR(20)
        DECLARE @ip VARCHAR(20)
        DECLARE @ServerName VARCHAR(100)
        DECLARE @ServerFullName VARCHAR(100)
        Declare @CurrDateTime nvarchar(20)
        Declare @PreDiffDateTime nvarchar(20) =''

        Set @CurrDateTime=CONVERT(VARCHAR(19),GETDATE(),120) 

        Declare @MaxCurrDateTime datetime

        -------刪除歷史數據,暫無歸檔

        DELETE FROM DBA_ServerIPDataBase_OverCheck WHERE CreateTime<CONVERT(VARCHAR(19),DATEADD( HH,-6,GETDATE()),120)

        DELETE FROM    DBA_ServerIPDataBaseCheck_Base

        -----查詢出一僕二主的ServerIP

        select ServerIP,count(distinct LocalServerIP) As 'Qty' into #temp_ServerIP from [dbo].[DBA_ServerIPDataBase_OverCheck]
        group by ServerIP
        having count(distinct LocalServerIP)>1
 
        --------查詢出不同的載體
        if exists(select 1 from #temp_ServerIP )
        begin

        ----找出對應關係
        select distinct a.LocalServerIP,a.ServerIP  into #temp_diffIP from DBA_ServerIPDataBase_OverCheck a inner join #temp_ServerIP b
        on a.ServerIP=b.ServerIP

        Declare DBName 
        Cursor for 
            Select LocalServerIP, ServerIP  from  #temp_diffIP
        Open DBName    
            Fetch next from DBName INTO @Localip, @ip
        While (@@fetch_status=0)   
            Begin  
                select @MaxCurrDateTime= max(CreateTime) from DBA_ServerIPDataBase_OverCheck 
                where LocalServerIP =@Localip and ServerIP =@ip 

                insert into DBA_ServerIPDataBaseCheck_Base ([LocalServerIP],[ServerIP],MaxCurrDateTime,CreateTime)
                values(@Localip,@ip,@MaxCurrDateTime,@CurrDateTime)

            fetch next from DBName INTO  @Localip, @ip
    
            END

            --select * from DBA_ServerIPDataBase_OverCheck a 
             update a set a.IPFailOverResult='IP 漂移進來'
             from DBA_ServerIPDataBaseCheck_Base a 
            where exists(select * from DBA_ServerIPDataBaseCheck_Base b where a.ServerIP=b.ServerIP and a.MaxCurrDateTime>b.MaxCurrDateTime)

            update a set a.IPFailOverResult='IP 漂移出來'
             from DBA_ServerIPDataBaseCheck_Base a 
            where exists(select * from DBA_ServerIPDataBaseCheck_Base b where a.ServerIP=b.ServerIP and a.MaxCurrDateTime<b.MaxCurrDateTime)

            ---------------------增加資料庫

            --select * 
            update a set a.DataBaseName=b.DataBaseName
            from DBA_ServerIPDataBaseCheck_Base a inner join DBA_ServerIPDataBase_OverCheck b
            on  a.ServerIP=b.ServerIP and a.LocalServerIP = b.LocalServerIP  
                and a.MaxCurrDateTime =b.CreateTime

            -------郵件告警
               declare @SQL as varchar(200)
            declare @Subject as varchar(200)=N'DB SERVER IP ABNORMAL,PLEASE CHECK!'
            declare @Body as nvarchar(max)=''

            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 有DB Server IP 出現漂移情況,請及時Check。'+'<br>'
                           +'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具體數據如下:;<br><br><table>' 
            SET @Body=@Body+'<tr bgcolor=#ffaa11 align="center"><td colspan="5">IP漂移後的宿主信息</td><td colspan="5">IP漂移前的宿主信息</td></tr>'
            SET @Body=@Body+'<tr bgcolor=#FFFF00 align="center"><td>LocalIP</td><td>ServerIP</td><td>DataBaseName</td><td>IPOverResult</td><td>CheckDateTime</td>
            <td>LocalIP</td><td>ServerIP</td><td>DataBaseName</td><td>IPOverResult</td><td>CheckDateTime</td></tr>'    
            SELECT @Body=@Body+'<tr><td>'+a.LocalServerIP+'</td><td>'+a.ServerIP+'</td><td>'+isnull(a.DataBaseName,'')+'</td><td>'+a.IPFailOverResult+'</td><td>'+ CONVERT(VARCHAR(19),a.MaxCurrDateTime,120)+'</td>
            <td>'+b.LocalServerIP+'</td><td>'+ b.ServerIP+'</td><td>'+isnull(b.DataBaseName,'')+'</td><td>'+b.IPFailOverResult+'</td><td>'+ CONVERT(VARCHAR(19),b.MaxCurrDateTime,120)+'</td></tr>'
                from DBA_ServerIPDataBaseCheck_Base a left join DBA_ServerIPDataBaseCheck_Base b
                on a.ServerIP=b.ServerIP
                where     a.IPFailOverResult='IP 漂移進來' and b.IPFailOverResult='IP 漂移出來'
             SET @Body = @Body +'</table><font color=#0000CC><br><br>DBA<br>Best wishes</body><html>'

             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

        end

END

 

4.功能實現

例如下麵的告警郵件,告訴監控人員:虛擬IP(169.XXX.XXX.247) 從 Server --169.XXX.XXX.44 轉移到了Server---169.XXX.XXX.43,並且包含了漂移前後Server上資料庫的名字(有可能資料庫多少不完全一致)。

 

 

本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!

本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!

本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 字元串 可以使用單引號和雙引號定義字元串變數但是單引號中不支持變數解析 獲取字元串的長度 截取字元串 查找指定字元 數組 獲取數組長度 ...
  • 設置帶有密碼和訪問許可權的共用文件夾 目錄導航: 1.啟用網路發現和密碼訪問共用 2.設置用於訪問共用文件夾的用戶和密碼 3.創建共用文件夾並設置訪問許可權 4.訪問共用的文件夾 1. 啟用網路發現和密碼訪問共用 返回目錄導航 1.1 使用組合鍵“Win+R”打開運行視窗,輸入“control”打開控制 ...
  • 我們公司2019年web開發已遷移至.NET core,目前有部分平臺隨著用戶量增加,單一資料庫部署已經無法滿足我們的業務需求,一直在尋找EF CORE讀寫分離解決方案,目前在各大技術論壇上還沒找到很好的方案,根據之前找到的讀寫分離方案,綜合目前EF core 的能力,自己編寫了一套EF core實 ...
  • MongoDB和關係型資料庫的對應關係 關係資料庫示例: MongoDB對應的: 資料庫(database) 一個MongoDB中可以建立多個資料庫,這些資料庫是相互獨立的,有自己的集合和許可權。不同的資料庫使用不同的文件存儲(不存儲在一個文件中)。 MongoDB預設有4個資料庫: admin: 從 ...
  • 簡述 博主最近因工作任務纏身,都無暇顧及到我的這片自留地了。前段時間稍有空閑,花了較多的精力學習《啊哈演算法》,從中學習到很多之前沒有太註重的內容,收益頗豐。但是這些演算法題目還沒有看完,等後面有時間了,還需重新自我溫習一下前面所寫的內容,並且繼續耕耘後面的演算法知識。 今天稍微有點時間,總結一下博主近期 ...
  • 資料庫概念 資料庫(Database)是按照數據結構來組織、存儲和管理數據的建立在電腦存儲設備上的倉庫。 資料庫:存儲數據的倉庫 資料庫分類 網路資料庫 網路資料庫是指把資料庫技術引入到電腦網路系統中,藉助於網路技術將存儲於資料庫中的大量信息及時發佈出去;而電腦網路藉助於成熟的資料庫技術對網路 ...
  • 伺服器配置文件分析 bin目錄下的mongod.cfg是伺服器的配置文件,文件中主要的配置參數: 1、資料庫文件的存放位置 2、伺服器日誌文件的存放位置 3、預設的IP地址、埠號 設置密碼 預設情況下,MongoDB的伺服器地址是127.0.0.1,埠號是27017,存儲資料庫管理員信息的adm ...
  • 本篇博文簡單介紹Elasticsearch中term詞條檢索、prefix首碼檢索、wildcard通配符檢索、fuzzy糾錯檢索, 以及boost分數提升等高級檢索的用法, 最後通過複雜檢索的示例, 綜合演示這些檢索語法. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...