使用 Terraform 在亚马逊 EC2 和亚马逊 FSx 上部署 SQL Server 故障转移集群实例 - AWS 规范指引

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Terraform 在亚马逊 EC2 和亚马逊 FSx 上部署 SQL Server 故障转移集群实例

Mark Hudson 和 Matt Burgess,Amazon Web Services

Summary

这种模式使用 Terraform 在亚马逊弹性计算云(亚马逊FCIs)上的 Windows 服务器故障转移群集 (WSFC) 节点上部署 SQL Server 故障转移群集实例 ()。 EC2此外,该模式使用 Amazon FSx 共享存储空间来存储数据和日志文件。

将 SQL Server 数据库迁移到时 AWS,首选是 Amazon RDS for SQL Server。但是,有时适用于 SQL Server 的 Amazon RDS 并不合适,SQL Server 必须采用高度可用的架构部署 EC2 在亚马逊上。在此解决方案中,SQL Server 安装 FCIs 在 WSFC 节点上。

此模式中包含的 Terraform 模块最多可配置两个 Amazon EC2 SQL Server 实例。Amazon FSx for Windows 文件服务器文件系统充当法定人数见证人,存储共享的数据和日志文件。无论配置了多少个实例,SQL Server 实例节点始终会创建并加入 FCI 群集,以确保环境奇偶校验。(通常,会为开发配置一个实例,为生产环境配置两个实例。) 对于使用两个节点以实现高可用性的配置,会预调配一个内部网络负载均衡器。网络负载均衡器使用在 FCI 集群上配置的运行状况探针,来识别哪个节点是主节点。

先决条件和限制

先决条件

  • 活跃 AWS 账户的.

  • Amazon Virtual Private Cloud(Amazon VPC),其中包含两个位于不同可用区的子网。

  • Amazon VPC DHCP 选项集。配置域名以解析您的 Active Directory 域名,并配置域和 NetBIOS 名称服务器,使其指向您的 Active Directory 域控制器。有关更多信息,请参阅其他信息中的 VPC 配置

  • AWS Directory Service for Microsoft Active Directory (AWS Managed Microsoft AD).

  • 自定义亚马逊机器映像(AMI) 有关更多详细信息,请参阅其他信息中的 AMI 配置

  • 包含 SQL Server ISO 映像的 Amazon Simple Storage Service(Amazon S3)存储桶。只有在使用带有所提供component.yaml文件的 EC2 Image Builder 来构建自定义 AMI 时,才需要此先决条件。

  • AWS Key Management Service (AWS KMS) 加密密钥。

  • 默认情况下,可使用开发者版产品密钥来安装 SQL Server。生产系统应使用由相关变量传递给模块的有效产品密钥。

限制

  • 此解决方案需要 AWS Managed Microsoft AD。但是,如果您愿意,也可以改用自管理 Active Directory 实施。为此,请修改随附的 Amazon FSx Terraform 模块以删除该属性。active_directory_id然后,按照 Terraform 文档中所示说明,添加自管理 Active Directory 所需的四个属性。

  • SQL Server 已设置为使用混合模式身份验证。如果您愿意,也可以使用仅 Windows 身份验证。为此,请在提供的用户数据脚本中,移除提供给 setup.exe 命令的 /SECURITYMODE/SAPWD 参数。您可以移除 sql_accounts.tf 文件,也可以修改 instances.tf 文件以移除 sql_sa_password 条目。

  • 删除已部署的集群时,您必须移除 Active Directory 中相应的虚拟计算机对象和单个计算机对象。要移除对象,请使用 Active Directory 管理工具。

  • 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅按区域划分的AWS 服务。有关特定端点,请参阅服务端点和配额,然后选择相应服务的链接。

产品版本

此解决方案已使用以下版本进行测试:

架构

源技术堆栈

  • SQL Server

目标技术堆栈

  • 使用亚马逊在 WSFC 节点上使用 SQL Server FCI EC2

  • FSx 适用于 Windows 文件服务器的亚马逊

  • 亚马逊 S3 存储桶

  • AWS Secrets Manager

  • AWS Managed Microsoft AD

  • AWS KMS

  • AWS Identity and Access Management (IAM)

目标架构

下图显示了该解决方案的架构。

跨亚马逊上的 Windows 服务器故障转移群集节点部署 SQL Server 故障转移群集实例的架构 EC2。

此图显示以下内容:

  • 一个 IAM 角色为 EC2 实例提供访问权限 AWS KMS 和 Secrets Manager

  • 两个 SQL Server 节点部署在跨两个可用区的私有子网中的 Amazon EC2 实例上

  • 一个网络负载均衡器,用于促进与活动 SQL Server 实例的连接(设置单节点集群时未部署)

  • Amazon f FSx or Windows 文件服务器文件系统部署在两个私有子网中,由 SQL Server 节点共享存储

  • Secrets Manager,用于存储 Active Directory 和 SQL Server 凭证和配置

  • Amazon S3 存储桶,用于存储 SQL Server 安装映像

  • AWS Managed Microsoft AD 用于 Windows 身份验证

  • AWS KMS 用于创建加密密钥

自动化和扩展

您可以使用存储库中的 Terraform 模块自动部署目标架构。GitHub 您必须修改 terraform.tfvars 文件以包含特定于您的环境的变量值。Amazon S3 存储桶、 AWS Managed Microsoft AD 组件、 AWS KMS 加密密钥和一些机密是此次部署的先决条件,不包含在 Terraform 代码中。

工具

AWS 服务

  • AWS Directory Service for Microsoft Active Directory允许你的目录感知工作负载和 AWS 资源使用中的 Microsoft Active Directory。 AWS 云在这种模式中,用 AWS Managed Microsoft AD 于 Windows 服务器和 SQL Server 身份验证以及 DNS。

  • 亚马逊弹性计算云 (Amazon EC2) 在中提供可扩展的计算容量 AWS 云。您可以根据需要启动任意数量的虚拟服务器,并快速纵向扩展或缩减这些服务器。在这种模式下,SQL Server 故障转移群集实例安装在亚马逊 EC2 实例上。

  • EC2 Image Builder 可帮助您自动创建、管理和部署自定义服务器映像。

  • 亚马逊版 Window FSx s 文件服务器在 Windows 服务器上提供完全托管的共享存储。在这种模式中, FSx 适用于 Windows 的文件服务器为 SQL Server 数据和日志文件以及法定见证人提供共享存储。

  • AWS Identity and Access Management (IAM) 通过控制谁经过身份验证并有权使用 AWS 资源,从而帮助您安全地管理对资源的访问权限。

  • AWS Key Management Service (AWS KMS) 可帮助您创建和控制加密密钥以帮助保护您的数据。在这种模式中,它用于加密 Secrets Manager 的密钥、亚马逊弹性区块存储 (Amazon EBS) 卷上的 SQL Server 存储以及 FSx 适用于 Windows 文件服务器的文件系统。

  • AWS Secrets Manager 可帮助您将代码中的硬编码凭证(包括密码)替换为对 Secrets Manager 进行的 API 调用,以便以编程方式检索此密钥。在此模式中,用于安装和运行 SQL Server 的 Active Directory 凭证、sa 用户凭证和数据库连接信息存储在 Secrets Manager 中。

  • Amazon Simple Storage Service(Amazon S3)是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。此模式使用 Amazon S3 存储桶来存储 SQL Server 安装映像。

  • Amazon Virtual Private Cloud(亚马逊 VPC)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络,并具有使用 AWS的可扩展基础设施的优势。

其他工具

  • 微软 SQL Server FCIs 安装在 Windows 服务器群集节点上。此外,可跨多个子网进行安装。在此模式中,可跨 WSFC 节点安装 SQL Server FCI 实例。

  • Terraform 是一款基础设施即代码(IaC)工具,可帮助您使用代码来预调配和管理云基础设施和资源。在此模式中,Terraform 可用于创建资源和配置 SQL Server FCI 实例。

  • Windows Server 失效转移群集提供了数项基础设施功能,可支持托管服务器应用程序(例如 SQL Server)的高可用性。在此模式中,FCI 节点利用 WSFC 功能,可通过冗余在实例级别提供本地高可用性。

代码存储库

此模式的代码可在 cloud-amazon-fsx-microsoft-sql GitHub cluster-amazon-elastic-compute-s erver 存储库中找到。存储库中提供了以下资源:

  • README.md 文件,提供解决方案以及其他安装和使用信息的概述

  • 一组基本的 Terraform 配置文件和一个用于为此模式配置组件的 Amazon FSx 特定模块

  • 作为 Amazon EC2 用户数据脚本运行的实例设置脚本

  • 一个 component.yaml 文件,Image Builder 可用它来创建自定义 AMI

最佳实践

安全和修补

  • AMI 先决条件安装和配置是部署 SQL Server FCI 集群的最低要求。可能需要额外的软件和配置才能符合组织的标准和安全要求。

  • 部署完成后,持续修补 Windows。要么直接修补正在运行的实例,要么使用最新的 Windows 补丁创建新 AMI,然后使用新的 AMI 替换实例(一次一个)。 AWS AMIs 每月发布新的 Windows,其中包含最新的操作系统补丁、驱动程序和启动代理。我们建议您在启动新实例或构建自己的自定义映像时检查最新的 AMI。

  • Amazon EC2 实例配置为允许所有传出流量。在生产环境中部署时,应在安全组中设置出站规则,以限制此流量进入所需目标。

  • FSx 适用于 Windows File Server 的文件系统可以自动记录文件共享以及文件和文件夹访问的审核日志,并在您的环境中需要时将其发送到所需的目的地。

  • 定期自动轮换 Secrets Manager 密钥。对于亚马逊 EC2 实例密钥对,请考虑使用自动轮换解决方案,如如何使用 AWS Secrets Manager 安全存储和轮换 SSH 密钥对中所述。对于 Active Directory 凭证和 SQL Server sa 凭证密钥,请根据您的密码管理策略设置自动轮换。

Active Directory 管理

  • 作为 FCI 集群的一部分,Windows 会在 Active Directory 中生成一个计算机名称对象(CNO)。CNO 响应 DNS 请求并将流量转发到活跃 SQL 节点。我们建议使用这个 Active Directory 提供的 DNS。TTL 太高而无法提供合理的失效转移时间,并且通常需要 5 分钟以上的时间才能反映出新的主要 IP 地址。相比之下,对于高度可用的安装,内部网络负载均衡器会配置为在 30 秒内进行失效转移。

  • 需要 Active Directory 域管理员才能创建集群。由于在 Active Directory 中创建集群对象和修改权限需要提升权限,因此才会有此要求。但是,SQL Server 服务不需要以域管理员身份运行。因此,我们建议您针对此目的创建第二个 Active Directory 用户。但是,如果服务将以域管理员用户身份运行,则可消除该用户。在这种情况下,必须将域管理员用户添加到作为此模式的一部分创建的 Active Directory 管理员组中。

操作说明

Task说明所需技能

创建 Active Directory 组。

在中 AWS Managed Microsoft AD,创建以下群组:

  • 集群管理员组 – 此组将添加到每个集群节点上的本地管理员组。

  • 集群远程桌面组 – 此组将添加到每个集群节点上的本地远程桌面用户组中。

有关更多详细信息,请参阅 AWS 文档中的创建 AWS Managed Microsoft AD 群组

AD 管理员

创建 Active Directory 用户。

在 AWS Managed Microsoft AD中,创建以下用户

  • 域管理员用户 – 使用此账户创建集群。

  • 域用户 – SQL Server 服务将使用此账户运行。将此用户添加到上一个任务中创建的集群管理员组。

有关更多详细信息,请参阅 AWS 文档中的创建 AWS Managed Microsoft AD 用户

AD 管理员

将 Active Directory 凭证添加到密钥。

使用 Secrets Manager 创建四个密钥,以存储以下信息:

  • 域管理员用户的用户名

  • 域管理员用户的密码

  • 域用户的用户名

  • 域用户的密码

有关更多详细信息,请参阅 AWS 文档中的创建 AWS Secrets Manager 密钥

AWS 管理员
Task说明所需技能

创建 Windows AMI。

创建包含必备软件和配置的自定义 Windows AMI。有关更多详细信息,请参阅其他信息

AWS 管理员,AWS DevOps

安装 Terraform。

要安装 Terraform,请按照 Terraform 网站上的说明进行操作。

AWS DevOps

克隆存储库。

克隆此模式的存储库。有关更多详细信息,请参阅 GitHub 网站上的 “克隆仓库”。

AWS DevOps
Task说明所需技能

修改 Terraform 变量。

更新提供的 terraform.tfvars 文件,将所有变量设置为适合您环境的值。

例如,更新 domain_group_administratorsdomain_group_rdp_users 变量,以使用您的 Active Directory 域名和之前创建的 Active Directory 组的名称。

AWS DevOps

初始化 Terraform。

要查看建议的部署,请导航至存储库的根目录。使用 Terraform 命令行界面(CLI)运行 terraform init,然后运行 terraform plan

AWS DevOps

部署资源。

要部署 SQL 集群和关联的资源,请使用 Terraform CLI 运行 terraform apply

AWS DevOps,AWS 管理员

验证部署。

要验证部署,请使用以下步骤:

  1. 使用远程桌面连接到其中一个已部署的 Windows Amazon EC2 实例。

  2. 有关更多详细信息,请参阅 AWS 文档中的使用 RDP 连接您的 Windows 实例

  3. 打开 Windows 失效转移群集管理器。验证集群是否已创建,以及 SQL Server 角色是否已创建并正在运行。

  4. 要测试与 SQL Server 的连接和身份验证,请使用 SQL Server Management Studio 等数据库工具连接到 SQL Server 端点。(端点值存储在 Secrets Manager 中。) 有关更多详细信息,请参阅 AWS 文档 EC2中的在亚马逊上连接微软 SQL Server

数据库管理员、AWS 系统管理员

问题排查

问题解决方案

Terraform 预调配已完成,但是 Windows 失效转移群集管理器未显示集群已创建或集群处于不可操作状态。

资源的整个安装和集群的配置可能需要 45-60 分钟。Terraform 完成后,用户数据脚本必须运行直至完成,而这一过程需要多次重启。要监控进度,您可以使用 C:\ 驱动程序中的 Checkpoints 目录和 C:\Program Data\Microsoft SQL Server\150\Log 中的 SQL Server 安装日志。完成后,C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log 文件中将显示安装完成消息。

预调配运行正常的集群后,使用 Terraform 删除并重新创建集群并未成功。Terraform 已完成,但集群未正确设置。

预调配过程的一部分涉及将计算机和虚拟对象注册到 Active Directory 和 Active Directory DNS。如果存在 Amazon EC2 群集节点和群集节点的计算机名称,FCI 将无法正确初始化,因此配置将失败。

要修复这一问题,请执行以下步骤:

  1. 删除 Active Directory 用户和计算机中的 Amazon EC2 节点、集群虚拟计算机和集群 ID。

  2. 在 Active Directory DNS 中,删除集群虚拟计算机的 DNS 条目。

  3. 运行以下命令,删除集群 ID 随机字符串 Terraform 资源 terragrunt destroy -target=random_string.cluster_id。此操作将删除现有的 Amazon EC2 实例。

  4. 运行terraform apply并期待以下三个新资源:两个 FCI Amazon EC2 实例和 1 个随机字符串集群 ID。

相关资源

AWS 文档

附加信息

Terraform 模块信息

该模块混合使用 AMI 配置和用户数据配置,以实现预调配时间和稳定性的良好平衡。在预调配期间,Windows 需要多次重启和等待。为防止在重新启动持久性用户数据期间出现无限循环,我们已实施了一种检查点方法。用户数据配置为持久。因此,用户数据配置脚本必须开发为幂等性,而且必须继续保持为幂等性。幂等性可简化更新过程,允许在更新周期内交换实例,无需手动配置即可重新加入或重新创建 FCI 集群。

SQL Server 连接字符串和失效转移群集

该模块将发布一个密钥,其中包含应在此数据库的连接字符串中使用的端点地址。此密钥名称遵循以下格式:{environment_name}/sqlserver/{cluster_name}/endpoint。对于仅使用一个节点的安装,您可以预期这是亚马逊 EC2 实例 SQL Server 接口的 IP 地址。对于高可用性安装(两个实例),您可以预期这是内部网络负载均衡器的 DNS 名称。

此模块 IPs 不支持虚拟故障转移群集。虚拟 IP 必须保持在同一个子网中才能正常运作。在中 AWS,单个子网不能跨越多个可用区。因此,使用虚拟 IPs 将使该模块无法被视为高可用性。

每个 Amazon EC2 实例都有三个私有 IP 地址。其用法如下所示:

  • 网络流量的主要 IP – 出口流量的源 IP。

  • FCI 通信 – 用于维护失效转移群集的状态和同步。

  • SQL Server(TCP 端口 1433)– 侦听器,还可以侦听心跳流量以确定哪个实例是主实例。

VPC 配置

先决条件列出了配置为使用 Active Directory for DNS 解析的 DHCP 选项集。但是,此先决条件并非硬性要求。硬性要求是,这些 EC2 实例必须能够解析您的 Active Directory 域名。可以通过其他方式来满足此要求,例如使用 Amazon Route 53 Resolver 端点。有关更多信息,请参阅将目录服务的 DNS 解析与 Amazon Route 53 解析器集成(AWS 博客文章)。

AMI 配置

此模式中使用的 AMI 必须包含以下必备软件和配置:

  1. 下载 SQL Server 2019 安装文件并将其扩展为 C:\SQL_Install_media

  2. 安装以下 Windows 功能:

    • Install-WindowsFeature Failover-Clustering

    • Install-WindowsFeature RSAT-AD-PowerShell

    • Install-WindowsFeature RSAT-AD-Tools

    • Install-WindowsFeature RSAT-Clustering-Mgmt

    • Install-WindowsFeature RSAT-Clustering-PowerShell

    • Install-WindowsFeature RSAT-Clustering-CmdInterface

  3. 禁用 Windows 防火墙,如下所示:

    • Get-NetFirewallProfile | Set-NetFirewallProfile -Enabled False

  4. 启用 CredSSP 身份验证方法(将 <domain> 替换为组织的 Windows 域名),如下所示:

    • Enable-WSManCredSSP -Role "Server" -Force

    • Enable-WSManCredSSP -Role "Client" -DelegateComputer *.<domain>.com -Force

  5. 设置以下注册表项:

    • 允许 NTLM 身份验证凭证:

      • HKLM:\Software\Policies\Microsoft\Windows\CredentialsDelegation

        • 名称: AllowFreshCredentialsWhenNTLMOnly

        • 值:1

        • 类型:REG_DWORD

    • 允许本地域计算机从以下位置使用 NTLM: PowerShell

      • 路径:HKLM:\Software\Policies\Microsoft\Windows\CredentialsDelegation\AllowFreshCredentialsWhenNTLMOnly

        • 名称: 1

        • 值:wsman/*.<domain>.com

        • 类型:REG_SZ

  6. 按如下方式设置PowerShell 图库

    • [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

    • Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force

    • Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

  7. 安装以下 Windows PowerShell 模块*

    • Install-Module -Name ComputerManagementDsc

    • Install-Module -Name FailOverClusterDsc

    • Install-Module -Name PSDscResources

    • Install-Module -Name xSmbShare

    • Install-Module -Name xActiveDirectory

    • Install-Module -Name SqlServer

要使用 Image Builder 创建 AMI,请按照 Image Builder 文档中使用 EC2 映像生成器控制台向导创建映像管道中的说明进行操作。要创建具有先决条件的配方组件,请使用以下步骤:

  1. 从存储库的ami 文件夹中下载 component.yaml 文件。GitHub

  2. 将内容复制到新的 Image Builder 组件中。

  3. 使用您的信息更新以下占位符:

    • <domain> – 您的 Active Directory 域名

    • <bucket_name> – 包含 SQL Server 映像的 Amazon S3 存储桶的名称