0

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

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 在此处输入图像描述

在此处输入图像描述

4

2 回答 2

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,第四个只读连接将被路由到 SQL16N2,并且很快

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

于 2017-01-31T13:49:54.843 回答
0

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

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

于 2017-01-31T11:33:20.280 回答