[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。
[AlwaysOn Availability Groups]使用Powershell监控AlwayOn健康的更多相关文章
- [AlwaysOn Availability Groups]AG排查和监控指南
AG排查和监控指南 1. 排查场景 如下表包含了常用排查的场景.根据被分为几个场景类型,比如Configuration,client connectivity,failover和performance ...
- [AlwaysOn Availability Groups]DMV和系统目录视图
DMV和系统目录视图 这里主要介绍AlwaysON的动态管理视图,可以用来监控和排查你的AG. 在AlwaysOn Dashboard,你可以简单的配置的GUI显示很多可用副本的DMV和可用数据库通过 ...
- [SQL in Azure] Tutorial: AlwaysOn Availability Groups in Azure (GUI)
http://msdn.microsoft.com/en-us/library/azure/dn249504.aspx Tutorial: AlwaysOn Availability Groups i ...
- [AlwaysOn Availability Groups]排查:AG配置
排查AG配置 本文主要用来帮助排查在AG配置时出现的问题,包括,AG功能被禁用,账号配置不正确,数据库镜像endpoint不存在,endpoint不能访问. Section Description A ...
- [AlwaysOn Availability Groups] 健康模型 Part 2 ——扩展
健康模型扩展 第一部分已经介绍了AlwayOn健康模型的概述.现在是创建一个自己的PBM策略,然后设置为制定的归类.创建这些策略,创建之后修改一下配置,dashboard就会自动评估这些策略. 场景, ...
- [AlwaysOn Availability Groups]健康模型 Part 1——概述
健康模型概述 在成功部署AG之后,跟踪和维护健康状况是很重要的. 1.AG健康模型概述 AG的健康模型是基于策略管理(Policy Based Management PBM)的.如果不熟悉这个特性,可 ...
- [AlwaysOn Availability Groups]监控AG性能
监控AG性能 AG的性能的性能方面,在关键任务数据库上进行语句级维护性能是很重要的.理解AG如何传输日志到secondary副本对评估RTO和RPO,表明AG是否性能不好. 1. 数据同步步骤 为了评 ...
- [AlwaysOn Availability Groups]AlwaysOn健康诊断日志
AlwaysOn健康诊断日志 为了监控primary可用副本的健康状况,SQL Server资源DLL使用SQL Server2012的过程sp_server_diagnostics. SQL Ser ...
- [AlwaysOn Availability Groups]CLUSTER.LOG(AG)
CLUSTER.LOG(AG) 作为故障转移资源,在SQL Server和windows故障转移集群服务的资源DLL(hadrres.dll)之间有额外的内部交流,DLL无法被SQL Server监控 ...
随机推荐
- Entity Framework 6 Recipes 2nd Edition(11-9)译 -> 在LINQ中使用规范函数
11-9. 在LINQ中使用规范函数 问题 想在一个LINQ查询中使用规范函数 解决方案 假设我们已经有一个影片租赁(MovieRental )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等, ...
- xamarin开发UWP元素的初始化设置顺序
在开发xamarin的UWP平台不可避免的遇到一下坑,现记录下来,希望对后面踩坑有帮助. 一.listview的分组问题:当我们使用listview的IsGroupingEnabled=true时,如 ...
- Win下最爱效率利器:AutoHotKey
AutoHotkey是一个windows下的开源.免费.自动化软件工具.它由最初旨在提供键盘快捷键的脚本语言驱动(称为:热键),随着时间的推移演变成一个完整的脚本语言.但你不需要把它想得太深,你只需要 ...
- WCF学习之旅—请求与答复模式和单向模式(十九)
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答 ...
- Python 资源大全中文版
Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...
- ASP.NET AntiXSS的使用
下载类库: http://wpl.codeplex.com 添加程序集引用 在web.config文件中将AntiXSS类库注册为应用程序的编码器 在<system.web& ...
- 理解 Neutorn LBaaS - 每天5分钟玩转 OpenStack(120)
Load Balance as a Service(LBaaS)是 Neutron 提供的一项高级网络服务.LBaaS 允许租户在自己的网络中创建和管理 load balancer. load bal ...
- geotrellis使用(二十五)将Geotrellis移植到spark2.0
目录 前言 升级spark到2.0 将geotrellis最新版部署到spark2.0(CDH) 总结 一.前言 事情总是变化这么快,前面刚写了一篇博客介绍如何将geotrellis移植 ...
- 创建或打开解决方案时提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案
提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案: 1.检查是否有C:\Program Files (x86)\d ...
- Razor基础语法一
目录: 什么是Razor? 渲染HTML Razor语法 隐式 Razor 表达式 显式 Razor 表达式 什么是Razor? Razor是基于服务端代码转换成网页的标记语法.语法主要包括Razor ...