zoukankan      html  css  js  c++  java
  • [AlwaysOn Availability Groups]使用Powershell监控AlwayOn健康

    使用Powershell监控AlwayOn健康

    1.基本命令概述

    AlwayOn Dashboard是很有用的查看整体AG健康状况的工具。但是这个工具不是用于7*24监控的。如果应用程序夜间发送严重的问题,Dashboard并不会有任何提示。那么可以使用Powershell命令来获取并通过SQL Agent调用创建告警。

    1.1 Dashboard

    首先创建一个AG。这个AG被配置为自动故障转移。查看这个AGdashboard

    通过查看AG的状态发现,AG状态不对。而且问题是来自于WSNAVEL1-94bv5这台服务器的。然后我们使用Powershell获取AG的信息

    1.2 Powershell 整合

    通过3powershell获取AlwayOn Dashboard信息:
    1.Test-SqlAvailabilityGroup
    2.Test-SqlAvailabilityReplica
    3.Test-SqlDatabaseReplicaState

    命令对应Dashboard各个部分:

    然后通过powershell调用,首先进入SQLPS
    PS > SQLPS
    Microsoft SQL Server PowerShell
    Version 11.0.2100.18
    Microsoft Corp. All rights reserved.

    进入到AG

    PS > cd SQLSERVER:SQLWSNAVELY1-SH21QDEFAULTAvailabilityGroups
    PS > dir

    Name                 PrimaryReplicaServerName
    ----                 ------------------------
    VLEApplication       WSNAVELY1-sh21q

    现在就可以运行Test-SqlAvailabilityGroup命令了。

    PS > Test-SqlAvailabilityGroup .VLEApplication

    HealthState            Name
    -----------            ----
    Error                  VLEApplication

    发现是错误状态,以下是各个状态表示的意思:

    HealthState

    Meaning

    Error

    表示对象存在严重的问题,高可用受损

    Warning

    表示对象存在警告状态,高可用存在风险。

    Unknown

    表示对象的健康状态无法确定,可能会在secondary副本上执行这个命令会出现。

    PolicyExecutionFailure

    当评估对象是发生异常。说明实现策略有问题

    Healthy

    表示是健康状态

    然后进去这个AG查看可用副本状态

    PS > cd .VLEApplication
    PS > dir

    AvailabilityDatabases
    AvailabilityGroupListeners
    AvailabilityReplicas
    DatabaseReplicaStates

    PS > cd .AvailabilityReplicas

    PS > dir

    Name                 Role      ConnectionState RollupSynchronizationState
    ----                 ----      --------------- --------------------------
    WSNAVELY1-94bv5      Secondary Connected       NotSynchronizing
    WSNAVELY1-sh21q      Primary   Connected       Synchronized

    PS > dir | Test-SqlAvailabilityReplica

    HealthState            AvailabilityGroup    Name
    -----------            -----------------    ----
    Warning                VLEApplication       WSNAVELY1-94bv5
    Healthy                VLEApplication       WSNAVELY1-sh21q

    然后会发现可用副本上有警告状态。然后我们进入该可用副本,查看可用数据库的状态

    PS > cd ..

    PS > cd .DatabaseReplicaStates

    PS > dir

     

    AvailabilityReplicaServerName AvailabilityDatabaseName SynchronizationState

    ----------------------------- ------------------------ --------------------

    WSNAVELY1-94bv5               DB-1                     NotSynchronizing    

    WSNAVELY1-94bv5               DB-2                     Synchronized        

    WSNAVELY1-94bv5               DB-3                     Synchronized        

    WSNAVELY1-94bv5               DB-4                     Synchronized        

    WSNAVELY1-94bv5               DB-5                     Synchronized        

    WSNAVELY1-sh21q               DB-1                     Synchronized        

    WSNAVELY1-sh21q               DB-2                     Synchronized        

    WSNAVELY1-sh21q               DB-3                     Synchronized        

    WSNAVELY1-sh21q               DB-4                     Synchronized        

    WSNAVELY1-sh21q               DB-5                     Synchronized        

     

    PS > dir | Test-SqlDatabaseReplicaState

     

    HealthState            AvailabilityGroup    AvailabilityReplica  Name

    -----------            -----------------    -------------------  ----

    Warning                VLEApplication       WSNAVELY1-94bv5      DB-1

    Healthy                VLEApplication       WSNAVELY1-94bv5      DB-2

    Healthy                VLEApplication       WSNAVELY1-94bv5      DB-3

    Healthy                VLEApplication       WSNAVELY1-94bv5      DB-4

    Healthy                VLEApplication       WSNAVELY1-94bv5      DB-5

    Healthy                VLEApplication       WSNAVELY1-sh21q      DB-1

    Healthy                VLEApplication       WSNAVELY1-sh21q      DB-2

    Healthy                VLEApplication       WSNAVELY1-sh21q      DB-3

    Healthy                VLEApplication       WSNAVELY1-sh21q      DB-4

    Healthy                VLEApplication       WSNAVELY1-sh21q      DB-5

    发现WSNAVELY1-94bv5DB-1上有警告状态。这个时候我们已经评估了所有的AG内的对象。也知道了那个对象需要跟深入的调查。

    2.额外Powershell命令的使用

    2.1 AlwaysOn的健康模型

    读到这里需要先了解一下AlwayOn的健康模型。大概总结如下:为了计算AG,可用副本,可用数据库的健康状态,我们执行一些已经安装的策略。这些策略来测试高可用配置的各个方面,根据结果我们计算总体对象的健康状态。一些策略可能比其他策略要严重,所以一个策略错误可能会导致错误或者警告。用户可以自定义策略来丰富健康模型。

    2.2 查看策略评估细节

    使用Powershell指令,可以获取策略评估的细节:
    1.每个由Test-Sql*执行的powershell命令都有一个列,PolicyEvaluationDetails。这个列保存了一组策略的细节。

    2.每个Test-Sql*命令都有一个-ShowPolicyDetail参数。如果指定了这个参数,命令会列举所有策略的结果,而不是只有一个结果。

    方法1

    还是上面的AG场景:

    PS > cd SQLSERVER:SQLWSNAVELY1-SH21QDEFAULTAvailabilityGroups

    PS > Test-SqlAvailabilityGroup .VLEApplication

    HealthState            Name
    -----------            ----
    Error                  VLEApplication

    发现AG有严重的问题,但是不能知道是什么策略错误导致的。评估AG策略,然后获取PolicyEvaluationDetails列。

    PS > $result = Test-SqlAvailabilityGroup .VLEApplication

    PS > $result.PolicyEvaluationDetails | ft Result,Name -AutoSize

    Result  Name
    ------  ----
    True    AlwaysOnAgOnlineStateHealthPolicy
    True    AlwaysOnAgWSFClusterHealthPolicy
    False   AlwaysOnAgAutomaticFailoverHealthPolicy
    True    AlwaysOnAgReplicasConnectionHealthPolicy
    False   AlwaysOnAgReplicasDataSynchronizationHealthPolicy
    True    AlwaysOnAgReplicasRoleHealthPolicy
    False   AlwaysOnAgSynchronousReplicasDataSynchronizationHealthPolicy

    这里ftFormat-Table的缩写。会发现3个策略出现错误:

    AlwaysOnAgAutomaticFailoverHealthPolicy

    AlwaysOnAgReplicasDataSynchronizationHealthPolicy

    AlwaysOnAgSynchronousReplicasDataSynchronizationHealthPolicy

    这个时候可以连接到SSMS然后确定这3个策略到底是检查什么的。

    方法2

    这个方法使用-ShowPolicyDetails参数。

    PS > Test-SqlAvailabilityGroup .VLEApplication -ShowPolicyDetails | ft Result,Name -AutoSize

    Result  Name
    ------  ----
    True    AlwaysOnAgOnlineStateHealthPolicy
    True    AlwaysOnAgWSFClusterHealthPolicy
    False   AlwaysOnAgAutomaticFailoverHealthPolicy
    True    AlwaysOnAgReplicasConnectionHealthPolicy
    False   AlwaysOnAgReplicasDataSynchronizationHealthPolicy
    True    AlwaysOnAgReplicasRoleHealthPolicy
    False   AlwaysOnAgSynchronousReplicasDataSynchronizationHealthPolicy

    2.3 包含用户策略

    AlwaysOn策略可以通过定义用户策略来扩展。首先需要允许用户定义的策略

    Test-SqlAvailabilityGroup .VLEApplication -ShowPolicyDetails –AllowUserPolicies

    2.4 性能考虑

    这样的场景,有搞一个100个数据库的AG2个可用副本,一个200个数据库。想要评估AG下的所有数据库:
    PS > $serverObj = New-Object Microsoft.SqlServer.Management.Smo.Server("WSNAVELY1-SH21Q")

    PS > $ag = $serverObj.AvailabilityGroups["LargeAvailabilityGroup"]

    PS > Measure-Command { $ag.DatabaseReplicaStates | Test-SqlDatabaseReplicaState }

    Days              : 0
    Hours             : 0
    Minutes           : 0
    Seconds           : 23
    Milliseconds      : 430

    大概花了20秒。现在显示后话后的方法。首先要关闭自动刷新行为-NoRefresh参数。然后需要指出有效的方法来加载服务器上的数据。幸运的是SMO提供了有效加载数据的方法。SetDefaultInitFields方法。对于这个机制详细的工作机制可以查看:

    http://blogs.msdn.com/b/mwories/archive/2005/04/22/smoperf1.aspx
    http://blogs.msdn.com/b/mwories/archive/2005/04/22/smoperf2.aspx

    优化后的命令:
    PS > $ServerObj = New-Object Microsoft.SqlServer.Management.Smo.Server("WSNAVELY1-SH21Q")
    PS > $ServerObj.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.AvailabilityGroup], $true)
    PS > $ServerObj.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.AvailabilityReplica], $true)
    PS > $ServerObj.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.DatabaseReplicaState], $true)
    PS > Measure-Command { $ag.DatabaseReplicaStates | Test-SqlDatabaseReplicaState -NoRefresh }

    Days              : 0
    Hours             : 0
    Minutes           : 0
    Seconds           : 7
    Milliseconds      : 317

    这样命令只花了7秒,比之前的快很多,主要的失却是查询执行次数不同。第一个例子每个数据库执行一次查询,第二个只用了一个查询获取了所有数据。

    3.简单的监控程序

    通过上面2节的介绍已经了解AlwaysOn的健康命令操作。我们可以使用这些命令来写一个简单的监控程序。流程如下:

    先来看一下简单的监控脚本,如果AG出现问题就会抛出异常。脚本如下:
    http://gallery.technet.microsoft.com/scriptcenter/AlwaysOn-Availability-23bc88b5

    脚本基本流程如下:
    脚本有2个参数ServernameGroupNameServerName参数表示AG所在host的服务器名(需要当前primary所在的)。GroupName表示AG的在服务器上的名称。在脚本体,使用windows验证连接到指定的服务。然后设置一些DefaultInitFields。接下来常识查询相关的AG信息。如果AG不存在会抛出错误。如果PrimaryReplicaServerName没有设置也会抛出异常。PrimaryReplicaServerName为空可能表示AGoffline。如果发现是secondary replica,脚本会中断并且抛出警告。

    最后执行AG上,可用副本上,可用数据库上的健康命令,如果有严重错误就会抛出异常。当然这个逻辑可以根据软件的不同进行调整。比如你在对象警告的时候抛出错误。或者在排出错误之前过滤一些。

    先把上面的脚本放到本地,然后打开PowerShell命令行执行SQLPS,然后设置执行策略为RemoteSigned。因为SQLPS执行策略和系统的执行策略是分离的,必须制定Scope参数比如:

    Set-ExecutionPolicy RemoteSigned -Scope Process

    表示已经为SQLPS设置了执行策略,然后可以运行本地脚本了如下:

    PS C:> SQLPS

    Microsoft SQL Server PowerShell

    Version 11.0.2100.54

    Microsoft Corp. All rights reserved.

    PS SQLSERVER:> Set-ExecutionPolicy RemoteSigned -Scope Process

    PS SQLSERVER:> C:scriptsmonitorag.ps1 -ServerName "myservermyinstance" -GroupName "myag"

    调度和通知

    查看现在的监控从程序的流程:

    困难的工作都已经完成了,只需要执行监控脚本,并且发送通知。

    4.使用SQL Agent来调度

    这里主要介绍如果调用脚本并通知错误。因为AG是多服务的系统,所以有个问题是,在哪个服务器上运行这个脚本?显然脚本必须运行在当前primary上。一个方法是在每个实例上都运行。只注意是primary的实例。所以现在需要再到如何在每个实例上都运行并且定期调用。并且需要一些通知机制。这个可以使用SQL Agent来处理。

    4.1 单个实例配置

    一下是在单个实例上配置的方法,前提条件:

    1.SQL Agent已经运行
    2.已经配置了数据库邮箱
    3.已经在SQL Agent上配置了数据库邮箱
    4.SQL Agentb上配置操作

    配置步骤:

    1.新建一个job
    2.新增步骤,选择typepowershell,然后在命令里面输入,C:scriptsmonitorag.ps1 -ServerName "wsnavely1-fs821" -GroupName "VLEApplication"点击ok完成。
    3.设置schedule,并且在通知一栏设置错误通知,点击ok完成

    4.2 多个实例设置

    通过以上步骤,我们可以在每个实例上都运行一遍。但是SQL Agent也可以创建多服务的job具体看:http://msdn.microsoft.com/zh-cn/library/ms180992.aspx

  • 相关阅读:
    git命令将本地代码提交到github
    Git打Tag相关操作
    数值格式化,每隔三位加一个逗号
    git常用命令
    webpack4配置
    Vue系列——在vue项目中使用echarts
    利用n 升级工具升级Node.js版本及在mac环境下的坑
    vue中图片返回404时,显示默认的图片
    C# NAudio 录制声音和显示波形图
    C# NAudio 变声
  • 原文地址:https://www.cnblogs.com/Amaranthus/p/5000519.html
Copyright © 2011-2022 走看看