SQL Server AlwaysON从多个seconderies读取

时间:2017-01-31 11:14:28

标签: sql-server alwayson

我在其中一个环境中配置了永远在线。

SQL1 = Primary
SQL2 = Slave1 (readonly)
SQL3 = Slave2 (readonly)

我的问题:
我希望我的应用程序将从两个从属服务器读取(例如SQL2和SQL3,如果它们是从属服务器而SQL1是主服务器)。

是否有可能,如果可以,我是怎么做的

我已经配置了路由表,如:

ALTER AVAILABILITY GROUP [AG1]
 MODIFY REPLICA ON N'SQL1' WITH 
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL1.aws.ir:1433'));
GO

ALTER AVAILABILITY GROUP [AG1]
 MODIFY REPLICA ON N'SQL2' WITH 
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL2.aws.ir:1433'));
GO

ALTER AVAILABILITY GROUP [AG1]
 MODIFY REPLICA ON N'SQL3' WITH 
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL3.aws.ir:1433'));
GO


ALTER AVAILABILITY GROUP [AG1]
MODIFY REPLICA ON N'SQL1' WITH 
(PRIMARY_ROLE(READ_ONLY_ROUTING_LIST = (N'SQL2',N'SQL3')))
GO

ALTER AVAILABILITY GROUP [AG1]
MODIFY REPLICA ON N'SQL2' WITH 
(PRIMARY_ROLE(READ_ONLY_ROUTING_LIST = (N'SQL1',N'SQL3')))
GO

ALTER AVAILABILITY GROUP [AG1]
MODIFY REPLICA ON N'SQL3' WITH 
(PRIMARY_ROLE(READ_ONLY_ROUTING_LIST = (N'SQL1',N'SQL2')))
GO

10X enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

您需要创建一个监听器。它是客户端可以连接的虚拟网络名称,以便访问Always On可用性组的主副本或副本副本中的数据库。

在此处阅读有关AG的更多信息https://msdn.microsoft.com/en-us/library/hh213417.aspx#AGlisteners

答案 1 :(得分:0)

  

我希望我的应用程序将从两个从属服务器读取(例如SQL2和SQL3,如果它们是从属服务器而SQL1是主服务器)

这是不可能的,除非你在SQL2016 ..

  

SQL Server 2104和SQL 2012只读路由将流量路由到路由列表中的第一个可用副本,除非它不可访问,然后它会将连接定向到路由列表中的下一个副本。

     

如果有多个辅助副本可供读取,则无法在这些副本之间分配读取负载。

但是在2016年,您可以在一组只读副本中配置负载平衡。

例如,

ALTER AVAILABILITY GROUP ag
MODIFY REPLICA ON N’SQL16N1′ 
WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=((‘SQL16N3’, ‘SQL16N2’), ‘SQL16N1’)));

在上面的路由列表中

  

第一个传入的只读连接将路由到SQL16N3,第二个只读连接将路由到SQL16N2,第三个只读连接将路由到SQL16N3,第四个只读连接将路由到SQL16N3 SQL16N2,等等

<强>参考文献:
https://blogs.msdn.microsoft.com/alwaysonpro/2016/05/02/sql-server-2016-alwayson-availability-group-enhancements-load-balance-read-only-routing/