[AlwaysOn Availability Groups]使用Powershell监控AlwayOn健康

使用Powershell监控AlwayOn健康

1.基本命令概述

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

1.1 Dashboard

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

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

1.2 Powershell 整合

通过3个powershell获取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:\SQL\WSNAVELY1-SH21Q\DEFAULT\AvailabilityGroups
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-94bv5的DB-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:\SQL\WSNAVELY1-SH21Q\DEFAULT\AvailabilityGroups

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

这里ft是Format-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个数据库的AG。2个可用副本,一个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个参数Servername和GroupName。ServerName参数表示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:\scripts\monitorag.ps1 -ServerName
"myserver\myinstance" -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.新增步骤,选择type为powershell,然后在命令里面输入,C:\scripts\monitorag.ps1
-ServerName "wsnavely1-fs821" -GroupName "VLEApplication"点击ok完成。
3.设置schedule,并且在通知一栏设置错误通知,点击ok完成

4.2 多个实例设置

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

时间: 2024-08-09 04:16:02

[AlwaysOn Availability Groups]使用Powershell监控AlwayOn健康的相关文章

[AlwaysOn Availability Groups]AG排查和监控指南

AG排查和监控指南 1. 排查场景 如下表包含了常用排查的场景.根据被分为几个场景类型,比如Configuration,client connectivity,failover和performance. Scenario 笔记 Scenario Type Description Troubleshoot AlwaysOn Availability Groups Configuration (SQL Server) 排查:AG配置 Configuration 提供了一些典型的配置AG实例发生问题的

[AlwaysOn Availability Groups]DMV和系统目录视图

DMV和系统目录视图 这里主要介绍AlwaysON的动态管理视图,可以用来监控和排查你的AG. 在AlwaysOn Dashboard,你可以简单的配置的GUI显示很多可用副本的DMV和可用数据库通过右击各自的表头并且选择你要加入和隐藏的DMV. 更多关于DMV信息查看: AlwaysOn Availability Groups Dynamic Management Views and Functions (Transact-SQL).查看更多AG目录视图查看:AlwaysOn Availabi

[AlwaysOn Availability Groups]排查AG配置

排查AG配置 本文主要用来帮助排查在AG配置时出现的问题,包括,AG功能被禁用,账号配置不正确,数据库镜像endpoint不存在,endpoint不能访问. Section Description AlwaysOn Availability Groups Is Not Enabled 如果实例没有启动AG特性,实例就不支持任何AG相关的功能 Accounts 在SQL Server在运行的情况下,正确的账号配置 Endpoints 诊断关于实例的镜像endpoint问题. System name

[AlwaysOn Availability Groups]健康模型概述 Part 1

健康模型概述 在成功部署AG之后,跟踪和维护健康状况是很重要的. 1.AG健康模型概述 AG的健康模型是基于策略管理(Policy Based Management PBM)的.如果不熟悉这个特性,可以查看:使用基于策略的管理来管理服务器 PBM的核心是策略,策略有以下部分组成: 1.目标,策略运行在有一组或者一个对象上. 2.条件,条件是bool表达式,指定目标的状态.如果条件false,就会发生错误. 3.归类,归类是对策略的简单归类 一旦你定义了一个策略,PBM会提供引擎来执行这些策略,获

[AlwaysOn Availability Groups]AlwaysOn健康诊断日志

AlwaysOn健康诊断日志 为了监控primary可用副本的健康状况,SQL Server资源DLL使用SQL Server2012的过程sp_server_diagnostics. SQL Server resource DLL维护了一个专用的连接到SQL Server实例,通过这个SQL Server实例定期的发送健康诊断信息到SQL Server resource DLL.健康诊断信息与集群中的AG中的failover policy耦合,被用来确定集群是否重启或者故障转移.这个过程是新S

[AlwaysOn Availability Groups]AG扩展事件

AG扩展事件 SQL Server 2012定义了一些关于AlwaysOn的扩展事件.你可以监控这些扩展事件来帮助诊断AG的根本问题.你也可以使用以下语句查看扩展事件: SELECT * FROM sys.dm_xe_objects WHERE name LIKE '%hadr%' 1.AlwaysOn健康(AlwaysOn_health)会话 AlwaysOn_health扩展会话当你在创建AG并捕获AlwaysOn相关事件的子集.这个会话被配置为有用的,方便的工具来帮助你开启调试AG.创建A

[AlwaysOn Availability Groups]AlwaysOn等待类型

AlwaysOn等待类型 当排查AlwaysOn延迟,等待统计信息可以在DMV中查看累计的AlwaysOn等待类型. 查看AlwaysOn等待类型 SELECT * FROM sys.dm_os_wait_stats WHERE wait_type LIKE '%hadr%' ORDER BY wait_time_ms DESC 使用一下语句,获取捕获扩展事件,等待类型. CREATE EVENT SESSION [alwayson] ON SERVER ADD EVENT sqlos.wait

[AlwaysOn Availability Groups]排查:AG超过RPO

排查:AG超过RPO 在异步提交的secondary上执行了切换,你可能会发现数据的丢失大于RPO,或者在计算可以忍受的数据都是超过了RPO. 1.通常原因 1.网络延迟太高,网络吞吐量太低,导致Primary的日志堆积 2.磁盘IO瓶颈导致LOG固化速度降低 2. 网络延迟太高,网络吞吐量太低,导致Primary的日志堆积 很多超过RPO的原因是日志发送到secondary副本不够快. 原因: Primary副本在日志发送启动了流量控制,因为日志发送超过了最大运行的非通知信息的量.直到这些信息

[AlwaysOn Availability Groups]SQL Server错误日志(AG)

SQL Server错误日志(AG) SQL Server错误日志会记录影响AG的时间,比如: 1.和Windows故障转移集群交互 2.可用副本的状态 3.可用数据的状态 4.AG endpoint的状态 5.AG Listener的状态 6.SQL Server resource DLL和SQL Server实例的租用状态 7.AG的错误事件 出现以下状态就需要检查错误日志: 1.无法连接到可用性数据库 2.非预料的AG故障转移 3.AG的Resolving状态不可预期 4.AG在不其确定的