• SQL Server AlwaysOn的监听


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

    在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

  • 相关阅读:
    money 和 smallmoney
    Sql server decimal 和 numeric
    SQL server数据类型int、bigint、smallint、tinyint
    c# 的传递参数值传递与传递引用的区别,ref与out区别
    释放SQL Server占用的内存
    JavaScript学习总结(一)——JavaScript基础
    js1
    Expected URL scheme 'http' or 'https' but no colon was found
    转载:SpringBoot Process finished with exit code 0
    转载:十大经典排序算法(动图演示)
  • 原文地址:https://www.cnblogs.com/abclife/p/16183290.html
Copyright © 2020-2023  润新知