

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

# 在 SQL Server 的 “始终开启” 可用性组中配置只读路由 AWS
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws"></a>

*Subhani Shaik，Amazon Web Services*

## Summary
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-summary"></a>

此模式介绍如何在 SQL Server“始终打开”中使用备用辅助副本，方法是将只读工作负载从主副本卸载到辅助副本。

数据库镜像具有 one-to-one映射。您无法直接读取辅助数据库，因此必须创建快照。“始终打开”可用性组功能是在 Microsoft SQL Server 2012 中引入的。在后来的版本中，引入了主要功能，包括只读路由。在“始终打开”可用性组中，您可以通过将副本模式更改为只读来直接从辅助副本读取数据。

“始终打开”可用性组解决方案支持高可用性（HA）、灾难恢复（DR）和数据库镜像的替代方案。“始终打开”可用性组在数据库级别工作，可最大限度地提高一组用户数据库的可用性。

SQL Server 使用只读路由机制将传入的只读连接重定向到辅助只读副本。为此，应在连接字符串中添加以下参数和值：
+ `ApplicationIntent=ReadOnly`
+ `Initial Catalog=<database name>`

## 先决条件和限制
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-prereqs"></a>

**先决条件**
+  AWS 账户 具有虚拟私有云 (VPC)、两个可用区、私有子网和一个安全组的处于活动状态
+ 两台亚马逊弹性计算云 (Amazon EC2) 计算机在实例级别配置了 [SQL Server 2019 企业版亚马逊计算机](https://aws.amazon.com/marketplace/pp/prodview-btjcozd246p6w)映像和 [Windows Server 故障转移群集 (WSFC](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-sql-server/ec2-fci.html))，在主节点 `WSFCNODE1` () 和辅助节点 () 之间在 SQL Server 级别配置了一个始终开启可用组，它们属于名为的目录的一部分 `WSFCNODE2` AWS Directory Service for Microsoft Active Directory `tagechtalk.com`
+ 配置的一个或多个节点，用于在辅助副本中接受 `read-only`
+ 名为 `SQLAG1` 的侦听器，适用于“始终打开”可用性组
+ SQL Server 数据库引擎，在两个节点上使用相同的服务账户运行
+ 打开 SQL Server Management Studio (SSMS)
+ 名为 `test` 的测试数据库

**产品版本**
+ SQL Server 2014 及更高版本

## 架构
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-architecture"></a>

**目标技术堆栈**
+ Amazon EC2
+ AWS Managed Microsoft AD
+ Amazon FSx

**目标架构**

下图显示了“始终打开”可用性组（AG）侦听器如何将连接中包含该 `ApplicationIntent` 参数的查询重定向到相应的辅助节点。

![在两个可用区（节点 1 WSFC 和节点 2 WSFC）之间使用 Amazon EFS 的三步流程。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/19b5937b-da10-4c74-8619-fdcb758f2211/images/f9ba0f89-7dc2-4f4c-8eee-bef56968ad2d.png)


1. 将向“始终打开”可用性组侦听器发送请求。

1. 如果连接字符串没有 `ApplicationIntent` 参数，该请求会发送到主实例。

1. 如果连接字符串包含`ApplicationIntent=ReadOnly`，则请求将发送到具有只读路由配置的辅助实例，即具有 Always On 可用性组的 WSFC。

## 工具
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-tools"></a>

**AWS 服务**
+ [AWS Directory Service for Microsoft Active Directory](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html)允许你的目录感知工作负载和 AWS 资源使用中的 Microsoft Active Directory。 AWS Cloud
+ [Amazon Elastic Compute Cloud（Amazon EC2）](https://docs.aws.amazon.com/ec2/)在 AWS Cloud中提供可扩展的计算容量。您可以根据需要启动任意数量的虚拟服务器，并快速纵向扩展或缩减这些服务器。
+ [Amazon FSx](https://docs.aws.amazon.com/fsx/?id=docs_gateway) 提供的文件系统支持行业标准的连接协议，并提供高可用性和跨 AWS 区域复制功能。

**其他服务**
+ SQL Server Management Studio（SSMS）是用于连接、管理和控制 SQL Server 实例的工具。
+ sqlcmd 是一个命令行实用程序。

## 最佳实践
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-best-practices"></a>

有关“始终打开”可用性组的更多信息，请参阅 [SQL Server 文档](https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/always-on-availability-groups-sql-server?view=sql-server-ver16)。

## 操作说明
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-epics"></a>

### 设置只读路由
<a name="set-up-read-only-routing"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将副本更新为只读的。 | 要将主副本和辅助副本更新为只读，请从 SSMS 连接到主副本，然后运行[其他信息](#configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-additional)部分中的*步骤 1* 代码。 | 数据库管理员 | 
| 创建路由 URL。 | 要为两个副本创建路由 URL，请运行[其他信息](#configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-additional)部分中的*步骤 2* 代码。在这段代码中，`tagechtalk.com`是 AWS Managed Microsoft AD 目录的名称。 | 数据库管理员 | 
| 创建路由列表。 | 要为两个副本创建路由列表，请运行 “[其他信息](#configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-additional)” 部分中的*步骤 3* 代码。 | 数据库管理员 | 
| 验证路由列表。 | 从 SQL Server Management Studio 连接到主实例，然后运行[其他信息](#configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-additional)部分中的*步骤 4* 代码来验证路由列表。 | 数据库管理员 | 

### 测试只读路由
<a name="test-the-read-only-routing"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用`ApplicationIntent`参数连接。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws.html) | 数据库管理员 | 
| 执行失效转移。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws.html) | 数据库管理员 | 

### 使用 sqlcmd 命令行实用程序进行连接
<a name="connect-by-using-the-sqlcmd-command-line-utility"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 sqlcmd 进行连接。 | 要从 sqlcmd 进行连接，请在命令提示符下运行[其他信息](#configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-additional)部分中的*步骤 5* 代码。在连接后，请运行以下命令，显示连接的服务器名称。<pre>SELECT SERVERPROPERTY('ComputernamePhysicalNetBios') .</pre><br />输出将显示当前的辅助副本名称 (`WSFCNODE1`)。 | 数据库管理员 | 

## 问题排查
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 创建侦听器失败，并显示消息“WSFC 集群无法使网络名称资源联机”。 | 有关信息，请参阅 Microsoft 博客文章[创建侦听器失败，并显示消息“WSFC 集群无法使网络名称资源联机”](https://techcommunity.microsoft.com/blog/sqlserversupport/create-listener-fails-with-message-the-wsfc-cluster-could-not-bring-the-network-/318235)。 | 
| 潜在问题，包括其他侦听器问题或网络访问问题。 | 请参阅 Microsoft 文档中的[对“始终打开”可用性组配置（SQL Server）进行故障排除](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/troubleshoot-always-on-availability-groups-configuration-sql-server?view=sql-server-ver16)。 | 

## 相关资源
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-resources"></a>
+ [在“始终打开”可用性组中配置只读路由](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/configure-read-only-routing-for-an-availability-group-sql-server?view=sql-server-ver16)
+ [对“始终打开”可用性组配置（SQL Server）进行故障排除](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/troubleshoot-always-on-availability-groups-configuration-sql-server?view=sql-server-ver16)

## 附加信息
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-additional"></a>

*步骤 1：将副本更新为只读的*

```
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE1' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY))
GO
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE2' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY))
GO
```

*步骤 2：创建路由 URL*

```
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE1' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://WSFCNode1.tagechtalk.com:1433'))
GO
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE2' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://WSFCNode2.tagechtalk.com:1433'))
GO
```

*第 3 步：创建路由列表*

```
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE1' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=('WSFCNODE2','WSFCNODE1')));
GO
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE2' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('WSFCNODE1','WSFCNODE2')));
GO
```

*步骤 4：验证路由列表*

```
SELECT AGSrc.replica_server_name AS PrimaryReplica, AGRepl.replica_server_name AS ReadOnlyReplica, AGRepl.read_only_routing_url AS RoutingURL , AGRL.routing_priority AS RoutingPriority FROM sys.availability_read_only_routing_lists AGRL INNER JOIN sys.availability_replicas AGSrc ON AGRL.replica_id = AGSrc.replica_id INNER JOIN sys.availability_replicas AGRepl ON AGRL.read_only_replica_id = AGRepl.replica_id INNER JOIN sys.availability_groups AV ON AV.group_id = AGSrc.group_id ORDER BY PrimaryReplica
```

*第 5 步。SQL 命令实用程序*

```
sqlcmd -S SQLAG1,1433 -E -d test -K ReadOnly
```