Skip to main content

SQL Server Always On AG(WSFC)配置指南(10) - 配置只读路由地址和只读路由列表

分类:  SQL Server 标签:  #SQL Server #SQL Server Always on AG 发布于: 2026-03-16 18:55:18

我们已经完成了如下工作:

  1. 安装了Windows Server
  2. 已经配置了网络,禁止了IPV6
  3. 创建了域控和DNS
  4. 将所有的节点都已经加入了域
  5. 安装了SQL Server
  6. 安装了故障转移集群
  7. 创建和配置了gMSA账户或者专用域账户
  8. gMSA账户或者专用域账户分配了必要的权限,包括读写SPN以及节点上的文件权限,同时在每个节点上设置了作为服务登录
  9. 将已经安装好的SQL Server服务和SQL Agent服务更改成了使用gMSA服务或者专用域账户运行。
  10. 配置好了基于SMB共享文件的Witness, 网络路径是:\\hongad\witness
  11. 故障转移集群的配置以及共享文件见证的配置
  12. 我们在每一台SQL节点上启用了高可用性
  13. 我们在每一台SQL节点上为SQL Server服务启用了TCP连接
  14. 我们在每一台SQL节点上配置了防火墙,集群内放通了必要的端口。
  15. 我们已经确认好了主节点和副本节点,并且已经选择好了需要高可用的数据库,并且在主节点和副本节点上准备好了数据库。
  16. 我们成功创建了可用性组,并且在配置可用性组时选择了选项"可读辅助副本"。
  17. 创建了可用性组的侦听器,并测试了故障转移。

之前我们在创建可用性组时,两个节点上都选择了"可读辅助副本", 为了使得这个特性生效,我们需要进一步配置每个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云上配置,也看看有哪些不同的地方。