SQL Server Always On AG(WSFC)配置指南(10) - 配置只读路由地址和只读路由列表
分类: SQL Server ◆ 标签: #SQL Server #SQL Server Always on AG ◆ 发布于: 2026-03-16 18:55:18
我们已经完成了如下工作:
- 安装了
Windows Server - 已经配置了网络,禁止了
IPV6 - 创建了域控和
DNS - 将所有的节点都已经加入了域
- 安装了
SQL Server - 安装了故障转移集群
- 创建和配置了
gMSA账户或者专用域账户 - 为
gMSA账户或者专用域账户分配了必要的权限,包括读写SPN以及节点上的文件权限,同时在每个节点上设置了作为服务登录 - 将已经安装好的
SQL Server服务和SQL Agent服务更改成了使用gMSA服务或者专用域账户运行。 - 配置好了基于
SMB共享文件的Witness, 网络路径是:\\hongad\witness - 故障转移集群的配置以及共享文件见证的配置
- 我们在每一台
SQL节点上启用了高可用性 - 我们在每一台
SQL节点上为SQL Server服务启用了TCP连接 - 我们在每一台
SQL节点上配置了防火墙,集群内放通了必要的端口。 - 我们已经确认好了主节点和副本节点,并且已经选择好了需要高可用的数据库,并且在主节点和副本节点上准备好了数据库。
- 我们成功创建了可用性组,并且在配置可用性组时选择了选项"可读辅助副本"。
- 创建了可用性组的侦听器,并测试了故障转移。
之前我们在创建可用性组时,两个节点上都选择了"可读辅助副本", 为了使得这个特性生效,我们需要进一步配置每个SQL实例节点的只读路由URL以及路由列表。
使用SSMS工具通过侦听器登录到可用性组,新建查询窗口:
- 检查目前可用性组中的节点详细信息:
SELECT
ag.name AS [Availability Group Name],
ar.replica_server_name AS [Instance Name], -- 这就是你要的完整实例名
ar.endpoint_url,
ar.availability_mode_desc,
ar.failover_mode_desc,
ars.role_desc AS [Current Role],
ars.operational_state_desc,
ar.replica_server_name
FROM sys.availability_replicas ar
JOIN sys.availability_groups ag ON ar.group_id = ag.group_id
JOIN sys.dm_hadr_availability_replica_states ars ON ar.replica_id = ars.replica_id
ORDER BY ag.name, ar.replica_server_name;
结果如下图:

我们开始为每一个实例创建只读路由地址
-- 1. 为节点 dbserver3 配置只读路由 URL
-- 即使它现在是主库,也要配,以备将来它变身为辅库
ALTER AVAILABILITY GROUP [testdb1-ag]
MODIFY REPLICA ON 'dbserver3'
WITH (
SECONDARY_ROLE (
READ_ONLY_ROUTING_URL = 'TCP://dbserver3.hong.cn:1433'
)
);
-- 2. 为节点 dbserver4 配置只读路由 URL
ALTER AVAILABILITY GROUP [testdb1-ag]
MODIFY REPLICA ON 'dbserver4'
WITH (
SECONDARY_ROLE (
READ_ONLY_ROUTING_URL = 'TCP://dbserver4.hong.cn:1433'
)
);
只读路由地址配置好了,现在要规划当故障发生转移时,只读该怎么规划:
我们希望当dbserver3为主节点时,只读要到辅助节点dbserver4, 反之亦然。
-- 在当前的 主副本 (假设是 dbserver4) 上执行:
-- 定义:当 dbserver3 是主库时,只读路由列表指向 dbserver4
ALTER AVAILABILITY GROUP [testdb1-ag]
MODIFY REPLICA ON 'dbserver4'
WITH (
PRIMARY_ROLE (
READ_ONLY_ROUTING_LIST = ('dbserver3')
)
);
-- 定义:当 dbserver4 是主库时 (未来),只读路由列表指向 dbserver3
-- 注意:即使在 dbserver4 上,也可以修改 dbserver3 的配置属性
ALTER AVAILABILITY GROUP [testdb1-ag]
MODIFY REPLICA ON 'dbserver3'
WITH (
PRIMARY_ROLE (
READ_ONLY_ROUTING_LIST = ('dbserver4')
)
);
到这里我们就配置成功了。
还记得我们之前提及过,使用"可读辅助副本" 还有一个条件:应用连接侦听器时需要使用参数Application Intent=ReadOnly; 一定不要忘记。
至此我们在本地的机器上配置SQL Server Always on AG 都学习完了,我们继续来看如何在Azure云上配置,也看看有哪些不同的地方。