AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 284934
Accepted
Frederik Vanderhaegen
Frederik Vanderhaegen
Asked: 2021-02-09 05:36:44 +0800 CST2021-02-09 05:36:44 +0800 CST 2021-02-09 05:36:44 +0800 CST

SQL Server 可用性组 LeaseTimeout 和慢 IO

  • 772

我们的 5 个主数据库在单个可用性组中的物理(2 * 8 核,512GB,超线程)SQL Server 2016 SP2 Enterprise 上运行,有时我们会收到租约超时已过期的错误。我的理解是,如果租约无法更新,则存在系统范围的问题。

当我sp_server_diagnostics在主副本的日志文件夹中检查(*SQLDIAG*.xel 文件)的输出时,在超时时间前后,我总是发现挂起的 IO 操作。

<ioSubsystem ioLatchTimeouts="0" intervalLongIos="0" totalLongIos="1">
<longestPendingRequests>
<pendingRequest duration="26566" filePath="\?\F:\SqlLogs\db1.ldf" offset="80824832" handle= "0x8d10" /> <pendingRequest duration="1987" filePath="\?\O:\SqlLogs\db2.ldf" offset="3880740352" handle="0x1330" /> <pendingRequest duration="1093" filePath="\ ?\O:\SqlLogs\db3.ldf" offset="288143360" handle="0x132c" /> <pendingRequest duration="974" filePath="\?\O:\SqlLogs\db3.ldf" offset="288145408" handle="0x132c" /> <pendingRequest duration="937" filePath="\?\O:\SqlLogs\db3.ldf"offset="288146944" handle="0x132c" />
</longestPendingRequests>
</ioSubsystem>

这是我在主副本的集群日志中找到的:

WARN [RES] SQL Server 可用性组:[hadrag] 无法检索数据列。返回代码 -1
ERR [RES] SQL Server 可用性组:[hadrag] 检测到故障,诊断检测信号丢失
ERR [RES] SQL Server 可用性组 <AG_Name>:[hadrag] 可用性组在给定的 HealthCheckTimeout 和 FailureConditionLevel
ERR [ RES] SQL Server 可用性组 <AG_Name>:[hadrag] 资源活动结果 0。
ERR [RES] SQL Server 可用性组:[hadrag] 检测到故障,诊断心跳丢失
ERR [RES] SQL Server 可用性组 <AG_Name>:[ hadrag] 可用性组在给定的 HealthCheckTimeout 和 FailureConditionLevel 情况下不健康
ERR [RES] SQL Server 可用性组 <AG_Name>:[hadrag] Resource Alive 结果 0。WARN
[RHS] Resource AG_Name IsAlive 指示失败。

这是 SQL Server 错误日志中的错误:

错误:19407,严重性:16,状态:1
SQL Server 托管可用性组“AG_Name”在租用超时期限内未收到来自 Windows Server 故障转移群集的进程事件信号。

错误:19407,严重性:16,状态:1
可用性组“AG_Name”和 Windows Server 故障转移群集之间的租约已过期。SQL Server 实例与 Windows Server 故障转移群集之间出现连接问题。若要确定可用性组是否正确进行故障转移,请检查 Windows Server 故障转移群集中相应的可用性组资源。

Always On:可用性组“AG_Name”的本地副本脱机,因为租约过期或租约续订失败。这只是一条信息性消息。无需用户操作。

这是来自的输出SELECT @@version:

Microsoft SQL Server 2016 (SP2-CU15) (KB4577775) - 13.0.5850.14 (X64) Sep 17 2020 22:12:45 版权所有 (c) Microsoft Corporation Enterprise Edition:Windows Server 2012 R2 上基于内核的许可(64 位)标准 6.3(内部版本 9600:)

在我们的监控中,没有高 CPU 使用率的迹象。出现问题时也不会创建内存转储。

由于此超时,WSFC 服务重新启动集群资源“AG_Name”。之后,此资源重新启动,一切都再次完美运行。
我不明白的是:缓慢的 IO 请求如何导致租约超时?许多待处理的 IO 请求会导致租约超时吗?

availability-groups sql-server-2016
  • 2 2 个回答
  • 1412 Views

2 个回答

  • Voted
  1. Josh Darnell
    2021-02-09T07:29:46+08:002021-02-09T07:29:46+08:00

    缓慢的 IO 请求如何导致租约超时?许多待处理的 IO 请求会导致租约超时吗?

    不,缓慢的 I/O 请求不能直接导致租约超时。

    但是,如果服务器完全过载(CPU 为 100%),则会导致挂起的 I/O 请求和租用超时。默认租用超时为 20 秒,而您的待处理 I/O 为 26 秒。高 CPU 或其他一些服务器/操作系统级别的问题更可能是这里的问题。

    另一个原因是 SQL Server 遇到了一个严重错误,并且正在生成转储文件(这会导致进程暂停,可能足够长的时间让 WSFC 认为租约超时)。

    有关更多可能性,请参阅文档:

    操作系统无响应、虚拟内存不足、工作集分页、生成转储、固定 CPU、WSFC 关闭(失去仲裁)

    您应该查看 SQL Server 错误日志以查看是否创建了转储。如果您从这些事件发生时开始进行监控,您还可以检查 CPU 是否已用尽。

    • 2
  2. Best Answer
    Frederik Vanderhaegen
    2021-02-11T01:46:32+08:002021-02-11T01:46:32+08:00

    在我们的监控工具中检查等待统计信息后,我注意到在问题发生的那一刻,有两种领先的等待类型,等待时间为 526000 毫秒/秒,PREEMPTIVE_SP_SERVER_DIAGNOSTICS和PREEMPTIVE_HADR_LEASE_MECHANISM。

    如果我正确地解释了这一点,那么 PREEMPTIVE 部分意味着 SQLOS 之外的线程正在执行命令。在这种情况下,执行 SP_SERVER_DIAGNOSTICS 并更新租约。
    高等待时间表明 SQL Server 正在等待这些线程完成。所以我认为这是操作系统没有响应的问题。

    我们的系统管理员还提到,在超时的那一刻,系统日志中有几个event-id 153的警告:

    Device\MPIODisk0 当前处于降级状态。一条或多条路径失败,但该过程现已完成。

    所以我的结论是由于磁盘问题操作系统在定义的超时设置内没有响应并导致集群资源重新启动。

    • 1

相关问题

  • AlwaysOn AG,带故障转移的 DTC

  • AlwaysOn 可用性组之外的数据库卡在 RESTORING 状态[关闭]

  • 只读辅助数据库上的锁是否传播到读/写数据库

  • 在多站点配置中读取可用性组的首选节点

  • 如何确定高可用性配置是否正常工作

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve