Fre*_*gen 6 clustering database-internals availability-groups sql-server-2016
我们有一个带有两个实例的物理 SQL Server 2016 Enterprise SP2,每个实例包含一个 AG。有时会发生一个AG去resolve(没有failover),集群资源在500ms后自动重启,然后一切又重新上线。但是我还没有找到原因。
当我检查错误日志时,我看到以下条目:
日期 14/04/2019 23:35:37
SQL Server 托管可用性组“AG_PROD”在租用超时期限内未收到来自 Windows Server 故障转移群集的进程事件信号。日期 14/04/2019 23:35:37
SQL Server 托管可用性组“AG_PROD”在租用超时期限内未收到来自 Windows Server 故障转移群集的进程事件信号。日期 14/04/2019 23:35:14
SQL Server 在数据库 ID 6 中的文件 [e:\sqlData\db.mdf] 上遇到了 1 次 I/O 请求需要超过 15 秒才能完成。操作系统文件句柄是 0x0000000000001128。最新的long I/O的偏移量为:0x00010de65c0000日期 14/04/2019 23:33:10
BACKUP DATABASE WITH DIFFERENTIAL 在 61.045 > 秒(6.585 MB/秒)内成功处理了 51459 页。
如您所见,有一个 IO 请求需要的时间超过 15 秒,我希望能在*_SQLDIAG_*.xel文件中找到它,但此处未发现任何错误。
当我检查集群日志时,我发现以下内容:
2019/04/14-23:35:09.430 INFO [NM] 收到来自客户端地址 SQL1 的请求。
2019/04/14-23:35:09.444 INFO [NM] 收到来自客户端地址 SQL1 的请求。
2019/04/14-23:35:09.459 INFO [RES] 网络名称:获取只读私有属性
2019/04/14-23:35:11.121 INFO [RES] 网络名称:代理:向 NN 发送请求 Netname/RecheckConfig :a09ce798-e8d3-4446-9e0b-d0fe72278d37:Netbios
2019/04/14-23:35:14.121 INFO [API] s_ApiGetQuorumResource 最终状态 0.
2019/04/ 15278d37:Netbios INFO [API] s_ApiGetQuorumResource 最终状态 [INFO] 2019/04/1527-24-23:14-24-14-24-24-24-24-24-24-24-24-24-24-24-24-2019/04/152714-24-24-23 日0.
2019/04/14-23:35:14.201 INFO [API] s_ApiGetQuorumResource 最终状态 0.
2019/04/14-23:35:14.201 INFO [API] s_ApiGetQuorumResource 最终状态 0。
2019/04/14-23:35:14.202 INFO [API] s_ApiGetQuorumResource 最终状态 0.
2019/04/14-23:35:14.202 INFO [API] s_ApiGetQuorumResource 最终状态 0.
2019/04/14-23:35: 14.202 14.282 INFO [API] s_ApiGetQuorumResource 最终状态 0。2019
/04/14-23:35:14.283 INFO [API] s_ApiGetQuorumResource 最终状态 0。2019
/04/14-23:35:16.121 网络名称:代理将请求 Netname/RecheckConfig 发送到 NN:a09ce798-e8d3-4446-9e0b-d0fe72278d37:Netbios
2019/04/14-23:35:17.115 INFO [API] s_ApiGetQuorumResource final status 0
:/04/14-23:35:17.102 INFO [API] s_ApiGetQuorumResource 最终状态 0.
2019/04/14-23:35:18.845 INFO [RES] 网络名称:Dns:HealthCheck:SQL
2019/04/14-23:35:18.845 INFO [RES] Network Name : Dns: End of Slow Operation, state: Initialized/Reading, prevWorkState: Reading
2019/04/14-23:35:21.121 INFO [RES] Network名称:代理:将请求 Netname/RecheckConfig 发送到 NN:a09ce798-e8d3-4446-9e0b-d0fe72278d37:Netbios
2019/04/14-23:35:21.184 INFO [API] s_ApiGetQuorumResource2040
/ 2314019 :35:21.184 INFO [API] s_ApiGetQuorumResource 最终状态 0。2019
/04/14-23:35:26.121 INFO [RES] 网络名称:代理:向 NN 发送请求 Netname/RecheckConfig:a09ce798-e8d3-44427d709e3 :Netbios
2019/04/14-23:35:26.584 WARN [RES] SQL Server 可用性组:[hadrag] 无法检索数据列。返回码 -1
2019/04/14-23:35:27.455 ERR [RES] SQL Server 可用性组:[hadrag] 检测到故障,诊断心跳丢失
2019/04/14-23:35:27.455 ERR [RES] SQL Server 可用性组: [hadrag] 给定 HealthCheckTimeout 和 FailureConditionLevel 的可用性组不健康
2019/04/14-23:35:27.455 ERR [RES] SQL Server 可用性组:[hadrag] Resource Alive 结果 0。2019
/04/14-23:35 :27.455 ERR [RES] SQL Server 可用性组:[hadrag] 检测到故障,诊断心跳丢失
2019/04/14-23:35:27.455 ERR [RES] SQL Server 可用性组:[hadrag] 可用性组不健康鉴于 HealthCheckTimeout 和 FailureConditionLevel
2019/04/14-23:35:27.455 ERR
[RES] SQL Server 可用性组:[hadrag] Resource Alive 结果 0。2019
/04/14-23:35:27.455 WARN [RHS] Resource AG_PROD IsAlive 已指示失败。
因此 HealthCheckTimeout 已过期。
这是出现错误时系统事件日志中的内容:
14/04/2019 23:35:40 警告已重试磁盘 1(PDO 名称:\Device\MPIODisk1)的逻辑块地址 0x8fd2b870 处的 IO 操作。
14/04/2019 23:35:27 错误群集角色“AG_PROD”中类型“SQL Server 可用性组”的群集资源“AG_PROD”失败。
根据资源和角色的故障策略,集群服务可能会尝试使该节点上的资源联机或将组移动到集群的另一个节点,然后重新启动它。使用故障转移群集管理器或 Get-ClusterResource Windows PowerShell cmdlet 检查资源和组状态。
14/04/2019 23:32:05 INFO WMI 性能适配器服务进入运行状态。
这是我在应用程序事件日志中发现的:
2019 年 4 月 14 日 23:35:37 信息始终在线:可用性组“AG_HIX_PROD”的本地副本将脱机,因为租约已过期或租约续订失败。这只是一条信息性消息。无需用户操作。
14/04/2019 23:35:37 错误可用性组“AG_HIX_PROD”和 Windows Server 故障转移群集之间的租约已过期。SQL Server 实例与 Windows Server 故障转移群集之间出现连接问题。要确定可用性组是否正确进行故障转移,请检查 Windows Server 故障转移群集中相应的可用性组资源。
14/04/2019 23:35:37 错误 SQL Server 托管可用性组“AG_HIX_PROD”在租用超时期限内未从 Windows Server 故障转移群集收到进程事件信号。
这就是我认为发生的情况:集群没有及时从sp_server_diagnostics=> HealthCheckTimeout获取信息。
因此,集群服务开始使资源脱机。因为资源被脱机,我们也得到了租用超时。
所以机器没有挂起并导致租用超时,否则另一个 AG 也会超时。
我认为sp_server_diagnostics每个实例执行一次。
当我在主服务器上的每个实例上执行以下查询时:
select spid,s.[status],host_name,s.program_name,host_process_id,
cmd,client_interface_name,original_login_name
from sys.sysprocesses p
inner join sys.dm_exec_sessions s on p.spid=s.session_id
where lastwaittype='SP_SERVER_DIAGNOSTICS_SLEEP'
Run Code Online (Sandbox Code Playgroud)
我得到两条记录,一条带有命令“SYSTEM_HEALTH_MO”和 host_process_id null,另一条带有命令“EXECUTE”和一个 host_process_id。在跟踪 host_process_id 之后,这是一个 RHS.exe 进程(因此这是集群执行sp_server_diagnostics)。我认为,第一条记录来自内部扩展事件。您可以使用以下查询找到它:
select * from sys.dm_xe_sessions
where [name] =N'sp_server_diagnostics session'
Run Code Online (Sandbox Code Playgroud)
我的结论是正确的还是我的分析有误?
另一个问题:每个 AG 是否都有自己的租约,还是每个实例只有一个租约?
| 归档时间: |
|
| 查看次数: |
5179 次 |
| 最近记录: |