zoukankan      html  css  js  c++  java
  • AlwaysOn Group Listener

    1.Listener是什么

    Listener实际上是一个 VirtualNetworkName,客户端通过这个VNN来连接的具体的sqlserver实例 .Listener包含了DNS名称,portIPaddress

    当客户端通过Listener进行连接时,Listener会将请求自动导向到PrimaryReplica或者SecondaryReplica了。

    SQL Server Management Studio对应的记录

       

    对应的VCO记录

    对应的DNS记录

    下面是一个ADO.NET的连接字符串Server=AgListener;Initial Catalog=agdb1;Integrated Security=SSPI;

    在这个连接字符串中指定了要连接的Listener名称,这样客户端就会自动连接到primaryreplica了。如果发生了failover,在新的primaryreplica上线后,listener会自动将连接导向到新的primaryreplica,无需人为的干预。

    2.负载平衡

    SecondaryReplica可以配置成readonly模式,这样就可以将一些只读的工作放置到secondaryreplica中进行(例如报表),这样就可以实现一定程度的负载平衡。并且Listener可以将这些只读的连接自动导向到SecondaryReplica

    要实现这一功能,需要在SQLServer端和客户端同时进行一些配置。

    SQL Server端

    1)Secondary replica要配置成read-intent only或者Yes

    2)设置READ_ONLY_ROUTING_URL

    下面是一个的READ_ONLY_ROUTING_URL的例子。 语句里指定了每个replica使用的端口,这里的端口号需要根据实际instance使用的端口号进行相应调整

    alter availability group ag modify replica on 'SQL108W2K8R21' with (secondary_role(read_only_routing_url='tcp://SQL108W2K8R21.259442DOM.COM:1433'))

    alter availability group ag modify replica on 'SQL108W2K8R22' with (secondary_role(read_only_routing_url='tcp://SQL108W2K8R22.259442DOM.COM:1433'))

    alter availability group ag modify replica on 'SQL108W2K8R23' with (secondary_role(read_only_routing_url='tcp://SQL108W2K8R23.259442DOM.COM:1433'))

        

    3) READ_ONLY_ROUTING_LIST

    为三个replica分别设置readonly routing的顺序。以SQL108W2K8R21为例,当SQL108W2K8R21成为Primary replica时,readonly routing的顺序依次为SQL108W2K8R22->SQL108W2K8R23-> SQL108W2K8R21. Listener会将客户端的请求导向到SQL108W2K8R22,如果SQL108W2K8R22不可用,导向到SQL108W2K8R23,以此类推。

    alter availability group ag MODIFY REPLICA ON N'SQL108W2K8R21' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=(N'SQL108W2K8R22', N'SQL108W2K8R23', N'SQL108W2K8R21')))

    alter availability group ag MODIFY REPLICA ON N'SQL108W2K8R22' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=(N'SQL108W2K8R21', N'SQL108W2K8R23', N'SQL108W2K8R22')))

    alter availability group ag MODIFY REPLICA ON N'SQL108W2K8R23' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=(N'SQL108W2K8R21', N'SQL108W2K8R22', N'SQL108W2K8R23')))

    客户端的设置

    需要在连接字符串内指定ApplicationIntent=Readonly 并且将database指定为AG内的数据库

    例如:

    Server=AgListener;database=agdb1;Integrated Security=SSPI;ApplicationIntent=Readonly

    3.Multiple Listener

    默认情况下,一个Ag只支持一个listener,当尝试创建第二个listener时会返回19477错误:

    The availability group '%.*ls' already has a listener with DNS name '%.*ls'. Availability groups can have only one listener. Use the existing listener, or drop the existing listener and create a new one.

    但实际上我们可以通过下面的方式为AG创建多个Listener

    1)打开Failover Cluster Manager,右键ag->Add a resource->Client Access Point

    2)填写Listener名称

    3)右键为其分配IPAddress

    4) 右键ag resource property,设置dependency. 将agListener2添加到Dependencies

    5)为Listener分配port,此时portnull

    select *from sys.availability_group_listeners

    执行下面的语句创建port

    alter availability group [ag]

    modify listener 'agListener2'

    (port = 1433)

    7)新的Listener就可以使用了,我们在SSMS里也可以找到相应的记录

    4.MultiSubnetFailover

    SQLServer2012开始支持Multi Site SQL Cluster。 一般而言,多个数据中心分布在不同的地理位置,例如在上海和北京分别建立了数据中心,这样当一个数据中心出现故障后(例如地震等灾害),备用的数据中心可以继续提供服务

    下面是一个多子网的Listener截图

    在多子网环境中,一个Listener下会注册多个IP Address(之间为OR关系),但只有primary replica所在子网的IP是处于Online状态的,其余的均为Offline。如果发生failover,这些IPAddress的状态会依据对应的replica的角色发生变化。

    那么多子网环境会对Listener有什么影响呢?

    首先要介绍一下RegisterAllProvidersIP属性。如果值为1,那么Listener对应的DNS就会出现同名的多条记录,每个记录地应一个IP Address

    如果RegisterAllProvidersIP的值为0,那么只会存在一条DNS记录,也就是Primary replica所在子网的IP。

    如果存在多条重名的DNS(RegisterAllProvidersIP=1)记录,客户端会依次请求这些IP Address,如果得到的IP是offline的,那么会继续请求一下条记录.这样就增加了连接时间,您的应用也可能会出现连接问题。

    为了解决这个问题,ADO.NET(.NET 3.5.1)引入了MultiSubnetFailover关键字,如果MultiSubnetFailover

    为True,那么客户端会同时尝试连接所有子网的IPAddress使用最先响应的那个IP地址来作为最终使用的地址,这样就极大地缩短了连接时间.

    如果RegisterAllProvidersIP=0,那只有PrimaryReplica子网下的IP会注册到DNS,当failover发生时,新的primaryreplica子网下的listenerIP会代替之前的IP。这样就避免的之前的情况。

    但在实际环境中,我们还需要考虑DNS的TTL值(Time-To-Live),TTL默认值是1200秒。也就是说当failover发生后,失效的DNS记录要在客户端可能要保持20分钟才会失效,在此期间,客户端无法通过listener进行连接。

    当然我们可以手工执行ipconfig /flushdns才更新记录,但这样毕竟需要人工介入。

    或者缩短TTL,但TTL值越小,DNSServer的性能消耗就严重。需要权衡两者。微软的建议值是300秒(5分钟).

    1 OR 0

    那么是什么时候应当将RegisterAllProvidersIP这是为1,而什么时候为0呢? 如果您的客户端支持MultiSubnetFailover关键字,那么建议设置成1,并且在连接字符串将MultiSubnetFailover设置为true.

    如果客户端不支持MultiSubnetFailover关键字,那么就设置成0,并修改TTL300

    更多信息

    ===

    如果Listener使用过T-SQL语句或者SSMS创建的,RegisterAllProvidersIP为1

    如果是通过ClusterFailovermanager创建的, RegisterAllProvidersIP为0

    可以通过powershell修改RegisterAllProvidersIP的值

    Get-ClusterResource "SQL Network Name (SQLMULTISUBCLUS)" | Set-ClusterParameter RegisterAllProvidersIP 1/0

     

     

    update 20190104

    ===

    starting from SQL Server 2016, it supports loadbalance readonly feature

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

     

    alter availability group pubag modify replica on 'liweiy744VMsql17' with (secondary_role(read_only_routing_url='tcp://liweiy744VM.liweiyin1.lab:58896')) 
    alter availability group pubag modify replica on 'liweiy745VMsql17' with (secondary_role(read_only_routing_url='tcp://liweiy745VM.liweiyin1.lab:58896')) 
    alter availability group pubag modify replica on 'liweiy746VMsql17' with (secondary_role(read_only_routing_url='tcp://liweiy746VM.liweiyin1.lab:58896')) 
    alter availability group pubag modify replica on 'liweiy747VMsql17' with (secondary_role(read_only_routing_url='tcp://liweiy747VM.liweiyin1.lab:58896')) 
    
         
    
    
    alter availability group pubag MODIFY REPLICA ON N'liweiy744VMsql17' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=((N'liweiy745VMsql17', N'liweiy746VMsql17', N'liweiy747VMsql17'),'liweiy744VMsql17'))) 
    alter availability group pubag MODIFY REPLICA ON N'liweiy745VMsql17' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=((N'liweiy746VMsql17', N'liweiy747VMsql17',N'liweiy744VMsql17'),'liweiy745VMsql17'))) 
    alter availability group pubag MODIFY REPLICA ON N'liweiy746VMsql17' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=((N'liweiy744VMsql17', N'liweiy745VMsql17', N'liweiy747VMsql17'),'liweiy746VMsql17'))) 
    alter availability group pubag MODIFY REPLICA ON N'liweiy747VMsql17' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=((N'liweiy744VMsql17', N'liweiy745VMsql17', N'liweiy746VMsql17'),'liweiy747VMsql17'))) 
  • 相关阅读:
    windows RabbitMQ Server 环境配置中的一些坑
    Redis自定义fastJson Serializer
    如何使用Feign构造多参数的请求
    跨域访问支持(Spring Boot、Nginx、浏览器)
    chrome浏览器的跨域设置
    Jenkins手把手图文教程[基于Jenkins 2.164.1]
    Spring Boot 2发送邮件手把手图文教程
    poi读取Excel模板并修改模板内容与动态的增加行
    Lock类-ReentrantLock的使用
    类ThreadLocal的使用与源码分析
  • 原文地址:https://www.cnblogs.com/stswordman/p/3821538.html
Copyright © 2011-2022 走看看