Amazon Elastic Compute Cloud
Windows 实例用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

EC2 中的 SQL Server 集群的最佳实践和建议

SQL Always On 集群提供高可用性,而无需使用共享存储。除了 Always On 可用性组的先决条件、限制和建议中列出的先决条件以外,本主题中的实践列表可以帮助您在 AWS 上运行 SQL Server Always On 集群时获得最佳的结果。本主题中列出的实践还提供了一种收集日志的方法。

注意

在不同的可用区或同一区域内的不同子网中部署节点时,应将其视为多子网集群。在应用最佳实践以及解决可能的故障情况时,请记住这一点。

分配 IP 地址

每个集群节点应分配一个弹性网络接口,它在子网上包含三个私有 IP 地址:主 IP 地址、集群 IP 地址和可用性组 IP 地址。操作系统 (OS) 应为 NIC 配置了 DHCP。不应将其设置为静态 IP 地址,因为将在故障转移集群管理器中以虚拟方式处理集群 IP 和可用性组的 IP 地址。只要将 NIC 配置为仅使用 eth0 的主 IP,就可以将其配置为静态 IP。如果为 NIC 分配其他 IP,则可能会在故障转移事件期间导致实例网络中断。

如果由于未正确分配 IP 而导致网络中断,或者存在故障转移事件或网络故障,在发生故障时通常会看到以下事件日志条目。

Isatap interface isatap.{9468661C-0AEB-41BD-BB8C-1F85981D5482} is no longer active.
Isatap interface isatap.{9468661C-0AEB-41BD-BB8C-1F85981D5482} with address fe80::5efe:169.254.1.105 has been brought up.

由于这些消息似乎描述网络问题,因此,很容易将中断或故障误认为是网络错误造成的。不过,这些错误描述了故障症状,而不是原因。ISATAP 是一种利用 IPv6 而不是 IPv4 的隧道技术。在 IPv4 连接失败时,ISATAP 适配器也会失败。在解决网络问题后,这些条目应不再出现在事件日志中。或者,您也可以使用以下命令安全地禁用 ISATAP,从而消除网络错误。

netsh int ipv6 isatap set state disabled

在运行该命令时,将从设备管理器中删除该适配器。此命令应在所有节点上运行。它不会影响集群正常操作的能力。相反,已经运行了命令时,不再使用 ISATAP。但是,由于此命令可能会对利用 ISATAP 的其他应用程序造成未知影响,应进行测试。

集群属性

要查看完整的集群配置,请运行以下 PowerShell 命令。

Get-Cluster | Format-List -Property *

多站点集群中的集群仲裁投票和 50/50 投票结果

要了解集群仲裁的工作方式以及发生故障时会出现的情况,请参阅了解集群和池仲裁

DNS 注册

在 Windows Server 2012 中,默认情况下,故障转移集群尝试使用集群名称注册每个 DNS 节点。考虑到为多站点配置了 SQL 目标,这对应用程序是可以接受的。不过,如果未以这种方式配置客户端,则可能会由于以下原因导致超时、延迟和应用程序错误:尝试连接到每个单独节点,并在非活动节点上失败。要防止出现这些问题,必须将集群资源参数 RegisterAllProvidersIp 更改为 0。有关更多信息,请参阅 RegisterAllProvidersIP 设置多子网集群 SQL + RegisterAllProvidersIP + SharePoint 2013

可以使用以下 PowerShell 脚本修改 RegisterAllProvidersIp

Import-Module FailoverClusters $cluster = (Get-ClusterResource | where {($_.ResourceType -eq "Network Name") -and ($_.OwnerGroup -ne "Cluster Group")}).Name Get-ClusterResource $cluster | Set-ClusterParameter RegisterAllProvidersIP 0 Get-ClusterResource $cluster |Set-ClusterParameter HostRecordTTL 300 Stop-ClusterResource $cluster Start-ClusterResource $cluster

除了将集群资源参数设置为 0,您还必须确保集群有权修改集群名称的 DNS 条目。

  1. 登录到域的域控制器 (DC) 或托管域的正向查找区域的服务器。

  2. 启动 DNS 管理控制台并找到集群的 A 记录。

  3. 右键单击 A 记录,然后选择属性

  4. 选择安全性

  5. 选择添加

  6. 选择对象类型...,选中计算机的框,然后选择确定

  7. 输入集群资源对象的名称,选择检查名称确定(如果解决)

  8. 选中完全控制的复选框。

  9. 选择确定

Elastic Network Adapter (ENA)

AWS 发现在 ENA 驱动程序版本 1.2.3 上运行的某些集群工作负载存在已知问题。我们建议升级到 1.5.0 或更高版本,并在操作系统中调整 NIC 的设置。有关最新版本,请参阅 Amazon ENA 驱动程序版本。第一个设置(适用于所有系统)增加了接收缓冲区,可以使用以下示例 PowerShell 命令完成该操作。

Set-NetAdapterAdvancedProperty -Name (Get-NetAdapter | Where-Object {$_.InterfaceDescription -like '*Elastic*'}).Name -DisplayName "Receive Buffers" -DisplayValue 8192

对于具有超过 16 个 vCPU 的实例,我们建议禁止在 CPU 0 上运行 RSS。

运行以下命令。

Set-NetAdapterRss -name (Get-NetAdapter | Where-Object {$_.InterfaceDescription -like 'Elastic'}).Name -Baseprocessorgroup 0 -BaseProcessorNumber 1

多站点集群和 EC2 实例置放

每个集群被视为多站点集群。EC2 服务不会以虚拟方式共享 IP 地址。每个节点必须位于唯一的子网中。虽然不是必需的,但我们建议每个节点也位于唯一的可用区中。

实例类型选择

建议用于 Windows Server 故障转移集群的实例类型取决于工作负载。对于生产工作负载,我们建议使用支持 EBS 优化增强联网的实例。

将弹性网络接口和 IP 分配到实例

EC2 集群中的每个节点只应具有一个附加的弹性网络接口。网络接口应至少具有两个分配的私有 IP 地址。不过,对于使用可用性组的工作负载(例如 SQL Always On),每个可用性组必须包含一个额外的 IP 地址。主 IP 地址用于访问和管理服务器,辅助 IP 地址用作集群 IP 地址,并根据需要将每个额外的 IP 地址分配给可用性组。

检测信号网络

某些 Microsoft 文档建议使用专用的检测信号网络。但是,此建议对 EC2 不适用。对于 EC2,因为虽然您可以为检测信号网络分配和使用第二个弹性网络接口,但它使用相同的基础设施并与主网络接口共享带宽。因此,无法优先基础设施中的流量,并且无法从专用的网络接口中受益。

在操作系统中配置网络适配器

只要从 DHCP 选项集中检索的 DNS 服务器允许节点相互解析,操作系统中的 NIC 就可以一直使用 DHCP。您可以将 NIC 设置为静态配置。在完成后,您只需手动配置弹性网络接口的主 IP 地址。根据需要,故障转移集群管理和分配额外的 IP 地址。

对于所有实例类型,您可以将网络适配器上的 MTU 增加到 9001 以支持巨型帧。只要支持巨型帧,该配置就会减少数据包分段。以下示例介绍如何使用 PowerShell 为 Elastic Network Adapter 配置巨型帧。

Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "MTU" -DisplayValue 9001

IPv6

Microsoft 建议不要在 Windows 集群中禁用 IPv6。虽然故障转移集群在仅 IPv4 的环境中工作,但 Microsoft 也在启用了 IPv6 的情况下测试了集群。有关详细信息,请参阅 Windows Server 2012 R2 中的故障转移集群和 IPv6

SQL 可用性组侦听器的主机记录 TTL

将主机记录 TTL 设置为 300 秒而不是默认的 20 分钟(1200 秒)。为了与旧客户端兼容,请将 SQL 可用性组侦听器的 RegisterAllProvidersIP 设置为 0。并非在所有环境中都需要这样做。这些设置是非常重要的,因为某些旧客户端应用程序无法在其连接字符串中使用 MultiSubnetFailover。有关更多信息,请参阅 HostRecordTTL 设置。在更改这些设置时,必须重新启动集群资源。以下是用于更改 TTL 和 RegisterAllProvidersIP 设置的示例 PowerShell 脚本。

Get-ClusterResource yourListenerName | Set-ClusterParameter RegisterAllProvidersIP 0
Get-ClusterResource yourListenerName|Set-ClusterParameter HostRecordTTL 300
Stop-ClusterResource yourListenerName
Start-ClusterResource yourListenerName

日志记录

集群日志的默认日志记录级别为 3。要增加日志信息详细程度,请将日志记录级别设置为 5。有关 PowerShell cmdlet 的更多信息,请参阅 Set-ClusterLog

Set-ClusterLog –Level 5

TCP 上的 NetBIOS

在 Windows Server 2012 R2 上,您可以禁用 TCP 上的 NetBIOS 以提高故障转移过程的速度。从 Windows Server 2016 中删除了该功能。如果在环境中使用旧操作系统,您应该测试该过程。有关更多信息,请参阅加速故障转移提示和技巧。以下是禁用 TCP 上的 NetBIOS 的示例 PowerShell 命令。

Get-ClusterResource “Cluster IP Address” | Set-ClusterParameter EnableNetBIOS 0

NetFT 虚拟适配器

对于 2016 之前的 Windows Server 版本和非 Hyper-V 工作负载,Microsoft建议您在操作系统中为适配器启用 NetFT 虚拟适配器性能筛选条件。在启用 NetFT 虚拟适配器时,内部集群流量将直接路由到 NetFT 虚拟适配器。有关更多信息,请参阅 NetFT 虚拟适配器性能筛选条件。您可以选中“NIC 属性”中的复选框或使用以下 PowerShell 命令以启用 NetFT 虚拟适配器。

Get-NetAdapter | Set-NetAdapterBinding –ComponentID ms_netftflt –Enable $true

设置可能的所有者

可以配置故障转移集群管理器,以便在集群核心资源和可用性组资源上指定的每个 IP 地址只能在该 IP 所属的节点上联机。如果没有为其配置故障转移集群管理器并且发生故障,当集群尝试在无法识别 IP 的节点上启动该地址时,故障转移将有出现一些延迟。有关更多信息,请参阅 SQL Server 管理 AlwaysOn 可用性组/角色的首选和可能的所有者属性

集群中的每个资源具有可能的所有者设置。该设置指示集群允许哪些节点将资源“联机”。每个节点在 VPC 中的唯一子网上运行。由于 EC2 无法在实例之间共享 IP,因此,只能由特定节点将集群中的 IP 资源联机。默认情况下,作为资源添加到集群的每个 IP 地址将每个节点作为可能的所有者列出。这不会导致发生故障。不过,在预期和意外故障期间,您可以在日志中查看有关冲突的 IP 和故障的错误以将 IP 联机。可以忽略这些错误。如果您设置“可能的所有者”属性,则可以完全消除这些错误,并在将服务移动到另一个节点时防止发生停机。

调整故障转移阈值

在 Server 2012 R2 中,故障转移检测信号网络的网络阈值默认为较高的值。有关详细信息,请参阅调整故障转移集群网络阈值。在 Server 2016 中增加了检测信号数量以解决这种潜在的不可靠配置(对于之间具有一定距离的集群)。已发现集群由于短暂的临时网络问题而进行故障转移。检测信号网络是使用 UDP 3343 维护的,它在传统上远不如 TCP 可靠,并且更容易出现不完整的对话。虽然在 AWS 可用区之间具有低延迟的连接,但仍然存在地理位置隔离,其中包含一些“跃点”隔离资源。在可用区中,除非客户使用置放群组或专用主机,否则,在集群之间可能存在一定距离。因此,UDP 发生检测信号故障的可能性比基于 TCP 的检测信号高。

只有在发生合理的中断时,集群才应进行故障转移,例如服务或节点发生硬故障转移,而不是在传输过程中丢失几个 UDP 数据包。要确保合理的中断,建议您调整阈值以匹配甚至超过调整故障转移集群网络阈值中列出的 Server 2016 设置。您可以使用以下 PowerShell 命令更改这些设置。

(get-cluster).SameSubnetThreshold = 10
(get-cluster).CrossSubnetThreshold = 20

在设置这些值时,将会显著减少意外故障转移。您可以增加检测信号之间的延迟以微调这些设置。不过,我们建议您使用更高的阈值更频繁地发送检测信号。将这些阈值设置得更高将确保仅在出现硬故障转移情况时才进行故障转移,并在故障转移之前具有更长的延迟。您必须决定应用程序可接受的停机时间是多少。

在增加 SameSubnetThresholdCrossSubnetThreshold 后,建议您增加 RouteHistoryLength 以将两个值中的较高值增加一倍。这会确保具有足够的日志记录以进行故障排除。您可以使用以下 PowerShell 命令设置 RouteHistoryLength

(Get-Cluster).RouteHistoryLength = 20

见证重要性和动态仲裁架构

在磁盘见证和文件共享见证之间存在一些差异。磁盘见证保留集群数据库备份,而文件共享见证不保留。两者都在集群中添加投票。在 Windows Server 2016 DC 版本上或使用基于 iSCSI 的存储时,您可以将磁盘见证与存储空间直通一起使用。有关部署存储空间直通的教程,请参阅在 Amazon EC2 上部署存储空间直通 (S2D)。有关见证选项的更多信息,请参阅本地集群的文件共享见证与磁盘见证

故障排除

如果您遇到意外的故障转移,请先确保您没有遇到任何网络、服务和基础设施问题。

  1. 检查您的节点是否遇到网络相关问题。

  2. 检查驱动程序更新。如果在实例上使用过期的驱动程序,应更新这些驱动程序。更新驱动程序可能会解决当前安装的版本中可能存在的错误和稳定性问题。

  3. 检查可能导致实例停止响应的任何可能的资源瓶颈,例如,CPU 和磁盘 I/O。如果节点无法处理请求,则似乎集群服务已将其关闭。