代码改变世界

SQL Server AlwaysOn的监听

2022-05-18 23:03  abce  阅读(846)  评论(0编辑  收藏  举报

有两个节点采用同步复制的模式。我们可以只在主节点上做读写操作。在应用配置中,我们使用主实例的名字。如果发生了故障转移,辅助节点变成了主节点,就有不好的影响,所有的用户连接必须重新指向新的主节点。故障转移后修改应用的配置不是一个理想的使用场景。

在SQL Server alwayson中,我们可以定义一个SQL Server alwayson 可用性监听,用于所有的用户连接。一个虚拟的网络名称始终指向主节点。客户端应用不需要知道AlwaysOn后面的具体配置。

在下面这张图里,我们在三节点的alwayson环境配置了监听

Listener overview

配置AG的监听,登录SSMS-->"availability group listener"-->"add listenr"

Add Listener

提供以下的信息:

·DNS中唯一的虚拟网络名

·端口。默认是1433。本例子使用5123

SQL Always On - SQL listener configuration

SQL listener configuration

一旦配置端口,也就变成了集群资源。你可以打开集群故障转移管理器,查看角色。在角色中,你可以看到监听名和虚拟ip。

SQL listener configuration

多子网的SQL Server AlwaysOn Availability Groups

在多子网环境,我们需要使用多个ip用于监听。每个子网都要对应配置一个虚拟ip。因此,如果我们配置DC-DR的alwayson,我们需要给DC配置一个ip、给DR配置一个ip。

SQL Always On - Multi-Subnet SQL Server Always On Availability Groups

一旦客户端通过dns解析到虚拟网络的名称,会返回所有可用的ip地址。会尝试连接每个ip地址,并连接到可用的ip地址。

假设我们配置了两个监听ip,一个用于DC,一个用于DR子网。由于网络问题,可用故障转移到了DR。切换之前是DC的监听在线;切换之后是DR的监听在线了。如果应用尝试连接主库,通过dns解析后得到ip地址列表。应用尝试第一个ip,无法连接。一旦超时,就会检查另外一个ip地址,并建立连接。多次尝试,如果我们有多个子网,应用连接延迟可能会加大。

 

我们可以在连接字符串中配置MultiSubnetFailover=True,来解决这个问题。一旦开启了这个参数,应用尝试同时连接两个ip。哪个ip可以建立连接,应用就使用ip连接到主库,并将读写路由到那个节点。

我们通过图来理解一下多子网故障转移。在下面这个图中,两个节点在不同的子网。监听配置了两个ip。

步骤1:一旦应用使用监听尝试连接到数据库,会连接dns并询问ip地址

SQL Always On - MultiSubnetFailover=True  configuration

步骤2:dns返回所有的虚拟ip监听地址

步骤3和步骤4:任一时刻,只有一个虚拟ip在线。应用尝试建立连接地址1,但是没有连接到主节点,因为地址1是offline的。

步骤5:连接超时,默认是12秒,尝试连接ip地址2,并成功建立连接。

在SSMS连接中指定多子网故障转移

现在,来看看MultiSubnetFailover= True的例子。如果你想使用SSMS连接数据库,进入"additional connection parameters"界面,设置MultiSubnetFailover= True。

SQL Server - MultiSubnetFailover=True

在ODBC连接中指定多子网故障转移

缺省情况下,是不开启的。

SQL Server - Specifying MultiSubnetFailover in ODBC Connection

ADO.NET连接中指定多子网故障转移

Server=tcp:SQListenerName,Port;Database=TestDB;IntegratedSecurity=SSPI; MultiSubnetFailover=True

步骤1:一旦应用尝试与数据库监听建立连接。连接到dns并请求ip地址

步骤2:dns返回所有的监听ip地址。在上面这个例子中返回两个ip

步骤3:在MultiSubnetFailover=True时,尝试并行向所有ip建立连接。不会等待连接超时

步骤4:一旦建立连接,应用就可以连接到数据库了

SQL Server - Specifying MultiSubnetFailover in ODBC Connection

对与单个子网的AG,也应该开启multisubnetfailover。有助与帮助应用扩展成多子网的AG。

MultiSubnetFailover的限制

·不支持超过64位的主机名

·只是支持tcp协议

·不会连接到镜像sqlserver实例

·It does not support SQL named instances. We can connect named SQL instances using a SQL listener

在SQL Server AlwaysOn AG中的RegisterAllProvidesIP配置

大多数客户端工具支持多子网,通过开启 MultiSubnetFailover。然而,缺省情况是,应用连接多个虚拟ip是串行模式。我们需要显式定义多子网支持。

一旦配置了MultiSubnetFailover,就会将RegisterAllProvidesIP的值设置为1。

如果RegisterAllProvidesIP的值是1,所有的ip都被注册,并被提供给应用建立连接。如果应用不支持多子网故障转移,我们仍然可以避免连接所有的ip。

检查当前RegisterAllProvidesIP的设置。打开powershell,并使用管理员权限执行:

>Get-ClusterResource "Cluster Resource Name" | Get-ClusterParameter

结果如下显示:

RegisterAllProvidersIP configuration

我们可以将该值改为0。一旦设置为0.只有活跃节点的ip被注册。应用连接到dns的时候,只会得到活跃节点的ip地址,建立连接。就排除了多ip超时的问题。

打开powershell,并使用管理员权限执行修改:

>Get-ClusterResource “Cluster Resource Name”| Set-ClusterParameter RegisterAllProvidersIP 0

如果,我们不知道集群的名字,执行get-clusterresource获取。

执行修改操作后,需要重启集群角色。要么将集群角色offline,然后online;

也可以是使用MultiSubnetfailover=True 选项在应用级别的连接字符串中设置。不过我们建议修改RegisterAllProvidesIP为0。

 

https://www.sqlshack.com/sql-server-always-on-listeners