ApplicationIntent=ReadOnly选项连接至只读副本的问题
今天在配置某个AlwaysOn环境的只读路由(read-only routing),主副本(Primary)的只读路由中设置了两个优先级不同的只读副本,SSMS通过侦听器并增加ApplicationIntent=ReadOnly参数连接,来验证是否路由到只读副本。通过select @@servername发现一直连接的是主副本,翻来覆去看两遍,只读路由配置的也没有问题。
懵逼了几分钟后突然想到,SSMS通过Listener侦听器默认连接的是master数据库,然后新建连接默认也是master数据库,通过侦听器连接至master数据库,肯定不会重定向到辅助副本。
只有通过Available group的数据库新建的连接,才能设定路由规则。于是基于Available group的库新建查询(数据库session),发现正确重定向到辅助副本。
如果是应用程序,连接串中直接指定的AG库具体的的名字,而不是默认的master(或者修改login的默认数据库为AG中包含的库),就不会出现这个乌龙。
读写连接串用ApplicationIntent=ReadWrite,自动定位为主副本
string connectionString = @"Data Source=192.168.1.111,1433;pooling=true;Initial Catalog=DB01;User Id=sa;Password=******;ApplicationIntent=ReadWrite;Timeout = 1";
只读连接串用ApplicationIntent=ReadOnly,自动定位到只读路由中优先级高的节点
string connectionString = @"Data Source=192.168.1.111,1433;pooling=true;Initial Catalog=DB01;User Id=sa;Password=******;ApplicationIntent=ReadOnly;Timeout = 1";
从只读路由的设置来看 ,read-only routing URL的格式为:tcp://servername.domain.name:db_port,多个副本之间设置read-only routing list的时候指定一个或者多个Server名字,
需要注意的是,read-only routing list指定多个Server名字的时候,多个Server之间是有优先级的,
比如Server2是主节点,Server3是从节点,
那么Server2的read-only routing list为Server3和Server2,通过侦听器连接到Always On群里的时候,当连接串中指定ApplicationIntent=ReadOnly的时候,会从Server3和Server2中优先选择Server3作为只读节点,为了防止Server3宕机 ,次优先选Server2,也即自身
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]