本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Terraform 在亚马逊 EC2 和亚马逊 FSx 上部署 SQL Server 故障转移集群实例
亚马逊 Web Services 的 Mark Hudson 和 Matt Burgess
摘要
这种模式使用 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 群集,以确保环境平等。(通常,为开发配置一个实例,为生产环境配置两个实例。) 对于使用两个节点实现高可用性的配置,系统会配置一个内部 Network Load Balancer。Network Load Balancer 使用在 FCI 集群上配置的运行状况探测器来识别哪个节点是主节点。
先决条件和限制
先决条件
活跃 AWS 账户的.
Amazon Virtual Private Cloud(亚马逊 VPC),在不同的可用区中有两个子网。
亚马逊 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 S3) Server Server Service 存储桶。只有在使用带有所提供
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
然后,添加自我管理 Active Directory 所需的四个属性,如 Terraform文档中所示。 SQL Server 已设置为使用混合模式身份验证。如果你愿意,你可以使用仅限 Windows 的身份验证。为此,请在提供的用户数据脚本中,删除为该
setup.exe
命令提供的/SECURITYMODE
和/SAPWD
参数。您可以删除该sql_accounts.tf
文件,也可以修改instances.tf
文件以删除该sql_sa_password
条目。删除已部署的集群时,必须删除 Active Directory 中相应的虚拟计算机对象和单个计算机对象。要移除对象,请使用 Active Directory 管理工具。
有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅按地区划分的AWS 服务
。有关特定终端节点,请参阅服务终端节点和配额,然后选择服务的链接。
产品版本
此解决方案已使用以下版本进行测试:
Windows Server 2019
SQL Server 2019
架构
源技术堆栈
SQL Server
目标技术堆栈
使用亚马逊在 WSFC 节点上使用 SQL Server FCI EC2
FSx 适用于 Windows 文件服务器的亚马逊
Amazon S3 存储桶
AWS Secrets Manager
AWS Managed Microsoft AD
AWS KMS
AWS Identity and Access Management (IAM)
目标架构
下图显示了此解决方案的架构。

此图显示以下内容:
一个 IAM 角色为 EC2 实例提供访问权限 AWS KMS 和 Secrets Manager
两个 SQL Server 节点部署在跨两个可用区的私有子网中的 Amazon EC2 实例上
用于促进与活动 SQL Server 实例的连接的 Network Load Balancer(在设置单节点群集时未部署)
Amazon f FSx or Windows 文件服务器文件系统部署在两个私有子网中,由 SQL Server 节点共享存储
Secrets Manager 用于存储 Active Directory 和 SQL S
用于存储 SQL Server 安装映像的 Amazon S3 存储桶
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 Cloud在此模式中,用 AWS Managed Microsoft AD 于 Windows 服务器和 SQL Server 身份验证以及 DNS。
亚马逊弹性计算云 (Amazon EC2) 在中提供可扩展的计算容量 AWS Cloud。您可以根据需要启动任意数量的虚拟服务器,并快速扩展或缩减它们。在这种模式下,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 服务器群集节点上。此外,它们可以跨多个子网安装。在这种模式下,SQL Server FCI 实例安装在 WSFC 节点上。 Terraform
是一款基础设施即代码 (IaC) 工具,可帮助您使用代码来配置和管理云基础架构和资源。在这种模式中,Terraform 用于创建资源和配置 SQL Server FCI 实例。 Windows Server 故障转移群集
提供的基础架构功能支持托管服务器应用程序(例如 SQL Server)的高可用性。在这种模式中,FCI 节点利用 WSFC 功能通过实例级别的冗余来提供本地高可用性。
代码存储库
此模式的代码可在 cloud-amazon-fsx-microsoft-sql GitHub cluster-amazon-elastic-compute-s
提供解决方案概述以及其他安装和使用信息的
README.md
文件一组基本的 Terraform 配置文件和一个用于为此模式配置组件的 Amazon FSx 特定模块
作为 Amazon EC2 用户数据脚本运行的实例设置脚本
一个
component.yam
l 文件,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 sa
凭据和 SQL Server 凭据密钥,请根据您的密码管理策略设置自动轮换。
活动目录管理
作为 FCI 群集的一部分,Windows 在 Active Directory 中生成计算机名称对象 (CNO)。CNO 响应 DNS 请求并将流量转发到主动 SQL 节点。我们不建议使用这个 Active Directory 提供的 DNS。TTL 太高,无法提供合理的故障转移时间,并且通常需要 5 分钟以上的时间才能反映出新的主 IP 地址。相比之下,对于高可用性安装,内部 Network Load Balancer 配置为在 30 秒内进行故障转移。
需要一个 Active Directory 域管理员才能创建集群。此要求是因为创建群集对象和修改 Active Directory 中的权限需要提升权限。但是,SQL Server 服务不需要以域管理员身份运行。因此,我们建议您为此创建第二个 Active Directory 用户。但是,如果服务将以域管理员用户身份运行,则可以删除该用户。在这种情况下,必须将域管理员用户添加到作为此模式的一部分创建的 Active Directory 管理员组中。
操作说明
Task | 描述 | 所需技能 |
---|---|---|
创建活动目录组。 | 在中 AWS Managed Microsoft AD,创建以下群组:
有关更多详细信息,请参阅 AWS 文档中的创建 AWS Managed Microsoft AD 群组。 | AD 管理员 |
创建活动目录用户。 | 在 AWS Managed Microsoft AD中,创建以下用户
有关更多详细信息,请参阅 AWS 文档中的创建 AWS Managed Microsoft AD 用户。 | AD 管理员 |
将活动目录凭据添加到密钥中。 | 使用 Secrets Manager 创建四个密钥来存储以下信息:
有关更多详细信息,请参阅 AWS 文档中的创建 AWS Secrets Manager 密钥。 | AWS 管理员 |
Task | 描述 | 所需技能 |
---|---|---|
修改 Terraform 变量。 | 更新提供的 例如,更新 | AWS DevOps |
初始化 Terraform。 | 要查看建议的部署,请导航到存储库的根目录。使用 Terraform 命令行界面 (CLI) 运行 | AWS DevOps |
部署资源。 | 要部署 SQL 集群和相关资源,请使用 Terraform CLI 运行。 | AWS DevOps,AWS 管理员 |
验证部署。 | 要验证部署,请使用以下步骤:
| 数据库管理员、AWS 系统管理员 |
故障排除
事务 | 解决方案 |
---|---|
Terraform 配置已完成,但是 Windows 故障转移群集管理器未显示集群已创建或群集处于不可操作状态。 | 整个资源安装和群集配置可能需要 45-60 分钟。Terraform 完成后,用户数据脚本必须运行至完成,这需要多次重启。要监控进度,您可以使用 |
配置正常运行的集群后,使用 Terraform 删除并重新创建集群失败。Terraform 已完成,但集群设置不正确。 | 配置过程的一部分涉及将计算机和虚拟对象注册到活动目录和活动目录 DNS。如果存在 Amazon EC2 群集节点和群集节点的计算机名称,FCI 将无法正确初始化,因此配置将失败。 要修复此问题,请执行以下步骤:
|
相关资源
AWS 文档
其他信息
Terraform 模块信息
该模块混合使用 AMI 配置和用户数据配置,以获得配置时间和稳定性的良好组合。在配置期间,Windows 需要多次重启和等待。已经实现了一种检查点方法,以防止在重新启动永久用户数据期间出现无限循环。用户数据被配置为永久数据。因此,必须将用户数据配置脚本开发为等性,而且必须继续开发。Idempotency 简化了更新过程,允许在更新周期内更换实例,无需手动配置即可重新加入或重新创建 FCI 集群。
SQL Server 连接字符串和故障转移群集
该模块将发布一个密钥,其中包含应在此数据库的连接字符串中使用的端点地址。机密名称遵循以下格式{environment_name}/sqlserver/{cluster_name}/endpoint
。对于仅使用一个节点的安装,您可以预期这是亚马逊 EC2 实例 SQL Server 接口的 IP 地址。对于高可用性安装(两个实例),你可以预期这是内部 Network Load Balancer 的 DNS 名称。
此模块 IPs 不支持虚拟故障转移群集。虚拟 IP 必须保持在同一个子网中才能正常工作。在中 AWS,单个子网不能跨越多个可用区。因此,使用虚拟 IPs 将使该模块无法被视为高可用性。
每个 Amazon EC2 实例都有三个私有 IP 地址。它们的用法如下:
网络流量的主 IP-出口流量的源 IP。
FCI 通信 — 用于维护故障转移群集的状态和同步。
SQL Server(TCP 端口 1433)-监听器,还可以监听心跳流量以确定哪个实例是主实例。
VPC 配置
先决条件列出了配置为使用 Active Directory 进行 DNS 解析的 DHCP 选项集。但是,这个先决条件并不是硬性要求。硬性要求是,这些 EC2 实例必须能够解析您的 Active Directory 域名。可以通过其他方式来满足此要求,例如使用 Amazon Route 53 Resolver 端点。有关更多信息,请参阅将目录服务的 DNS 解析与 Amazon Route 53 解析器集成
AMI 配置
此模式中使用的 AMI 必须包含以下必备软件和配置:
下载 SQL Server 2019 安装文件并将其扩展为
C:\SQL_Install_media
。安装以下 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
按如下方式禁用 Windows 防火墙:
Get-NetFirewallProfile | Set-NetFirewallProfile -Enabled False
启用 CredSSP 身份验证方法(
<domain>
替换为组织的 Windows 域名),如下所示:Enable-WSManCredSSP -Role "Server" -Force
Enable-WSManCredSSP -Role "Client" -DelegateComputer *.<domain>.com -Force
设置以下注册表项:
允许 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
按如下方式设置PowerShell 图库
: [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
安装以下 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 映像生成器控制台向导创建映像管道中的说明进行操作。要使用前面的先决条件创建配方的组件,请使用以下步骤:
将内容复制到新的 Image Builder 组件中。
使用您的信息更新以下占位符:
<domain>
— 您的活动目录域名<bucket_name>
— 包含 SQL Server 镜像的 Amazon S3 存储桶的名称