SQL Server AlwaysOn 可用性

Posted

技术标签:

【中文标题】SQL Server AlwaysOn 可用性【英文标题】:SQL Server AlwaysOn Availability 【发布时间】:2017-09-12 12:15:03 【问题描述】:

我有两台服务器 SQL Server 2016,我想实现 AlwaysOn 可用性。

第一个服务器是Read_Write

第二个服务器是只读的

我将 AlwaysOn 可用性配置如下:

CREATE AVAILABILITY GROUP ag
WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
DB_FAILOVER = OFF,
DTC_SUPPORT = NONE,
FAILURE_CONDITION_LEVEL = 3,
HEALTH_CHECK_TIMEOUT = 30000)
FOR DATABASE DATABASE_NAME
REPLICA ON N'server1' WITH (ENDPOINT_URL = N'TCP://server1_adress:port', FAILOVER_MODE = AUTOMATIC, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, SESSION_TIMEOUT = 10, BACKUP_PRIORITY = 50, SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://server1_adress:port')),
N'server2' WITH (ENDPOINT_URL = N'TCP://server2_adress:5022', FAILOVER_MODE = AUTOMATIC, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, SESSION_TIMEOUT = 10, BACKUP_PRIORITY = 50, PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=('server1')))
LISTENER N'listener_server' (
WITH IP
((N'ip', N'mask')
)
, PORT=port);

我的问题是所有查询都被路由到第一台服务器。

我必须如何配置 AlwaysOn 以平衡两台服务器之间的读取查询?

谢谢。

【问题讨论】:

除了 Basti 所说的,您还需要确保在连接字符串中包含目标数据库名称。 【参考方案1】:

首先你必须定义一个特殊的连接字符串来告诉 SQL Server 连接到一个只读副本(称为“应用程序意图”):

Server=tcp:MyAgListener,1433;Database=Db1;IntegratedSecurity=SSPI;ApplicationIntent=ReadOnly;MultiSubnetFailover=True  

在第二步中,如果是辅助节点,您必须允许对所有节点进行只读访问:

ALTER AVAILABILITY GROUP [ag]
MODIFY REPLICA ON N'server1' WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = 
READ_ONLY))
GO
ALTER AVAILABILITY GROUP [ag]
MODIFY REPLICA ON N'server2' WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = 
READ_ONLY))
GO

进一步添加只读路由URL到server2:

ALTER AVAILABILITY GROUP [ag]
MODIFY REPLICA ON N'server2' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = 
N'TCP://server2_adress:port'));
GO

在下一步中,您必须定义一个路由列表,当特定服务器是主要服务器时应该连接到哪个服务器。您已经定义了一个 READ_ONLY_ROUTING_LIST。但只有一台服务器。 server1 中断时会发生什么?您应该为每个可能的主节点定义一个路由列表。

ALTER AVAILABILITY GROUP [ag] 
MODIFY REPLICA ON
N'server1' WITH 
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('server2','server1')));

ALTER AVAILABILITY GROUP [ag] 
MODIFY REPLICA ON
N'server2' WITH 
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('server1','server2')));
GO

对于 SQL Server 2016 中 AlwaysOn 的新负载平衡功能,您至少需要第三个只读节点,该节点允许只读连接并配置“嵌套”路由列表:

ALTER AVAILABILITY GROUP ag 
MODIFY REPLICA ON N'server1' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=
(('server2', 'server3'), 'server1')));

【讨论】:

以上是关于SQL Server AlwaysOn 可用性的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2016 AlwaysOn 安装及配置介绍

SQL Server AlwaysOn 可用性组许可

SQL Server 2016 Failover +AlwaysOn 增加数据库到可用性组

SQL Server 2012 AlwaysOn 可用性组,始终连接到主服务器

SQL Server Alwayson概念总结

SQL Server 2022 AlwaysOn新特性之包含可用性组介绍