始终在读意图

Pet*_*ter 3 availability-groups sql-server-2016

我最近接管了一个可用性组的管理工作,该组由两个节点组成,同步提交模式。

该组的配置如下所示: 可用性组属性

我的理解是,当Yes两个副本上的 Readable Secondary 选项都设置为时,任何带有 applicationIntent=ReadOnly 的连接字符串都将路由到 Node1。

同样,如果我将 Node2 的 Readable Secondary 选项更改为“Read-intent”,则任何具有 applicationIntent=ReadOnly 的连接字符串都将路由到 Node2。

那么,为什么当两个节点都设置为“Readable Secondary = Yes”时,此连接字符串会路由到 Node2:

'数据源=redacted.domain.com; 初始目录= MyDatabase; ApplicationIntent=只读;用户 ID=用户;密码=********;MultiSubnetFailover=True'

基本上,将“ReadOnly”参数更改为“ReadWrite”会导致连接转到 Node1。改回“只读”会导致连接路由到 Node2。如果没有“Readable Secondary= Read-intent”选项,这怎么可能?

编辑:输出 SELECT ag.name as "Availability Group", ar.replica_server_name as "When Primary Replica Is", rl.routing_priority as "Routing Priority", ar2.replica_server_name as "RO Routed To", ar.secondary_role_allow_connections_desc, ar2.read_only_routing_url FROM sys.availability_read_only_routing_lists rl inner join sys.availability_replicas ar on rl.replica_id = ar.replica_id inner join sys.availability_replicas ar2 on rl.read_only_replica_id = ar2.replica_id inner join sys.availability_groups ag on ar.group_id = ag.group_id ORDER BY ag.name, ar.replica_server_name, rl.routing_priority

输出

对于需要帮助理解这一点的其他人,我发现以下内容很有帮助: 在此处输入图片说明

Sha*_*nky 5

我的理解是,当两个副本上的 Readable Secondary 选项都设置为 Yes 时,任何带有 applicationIntent=ReadOnly 的连接字符串都将路由到 Node1

不,它应该首先转到节点 2,因为节点 2 是只读副本,节点 1 是主要副本,它将负责读写操作。根据 BOL

只读路由是指 SQL Server 能够将符合条件的只读连接请求路由到可用的 Always On 可读辅助副本(即配置为在辅助角色下运行时允许只读工作负载的副本

什么是输出

SELECT ag.name as "Availability Group", ar.replica_server_name as "When 
  Primary Replica Is",
rl.routing_priority as "Routing Priority", 
ar2.replica_server_name as "RO Routed To", 
ar.secondary_role_allow_connections_desc, 
ar2.read_only_routing_url
FROM sys.availability_read_only_routing_lists rl
inner join sys.availability_replicas ar on rl.replica_id = ar.replica_id
inner join sys.availability_replicas ar2 on rl.read_only_replica_id = ar2.replica_id
inner join sys.availability_groups ag on ar.group_id = ag.group_id
ORDER BY ag.name, ar.replica_server_name, rl.routing_priority
Run Code Online (Sandbox Code Playgroud)

因此,从输出中您可以看到,当节点 1 是主要副本时,只读连接将作为首选连接到节点 2,反之亦然