zoukankan      html  css  js  c++  java
  • sql server alwayson 可用性组 只读路由的设置

     昨天晚上学习了【SQL Server 2012实施与管理实战指南】的第三章,于是今天想在前段时间建的那个alwayson

    可用性组测试环境上也配置一下只读路由,尝试实现读写分离。

    按照书中的方法,执行如下脚本(本来我是3节点的可用性组,由于笔记本开4台虚拟机实在是太卡,我把server03给关掉了,只读路由也没配置这个节点。):

    --指定在此可用性副本当前拥有辅助角色(即它是辅助副本)时要生效的角色有设置:
    ALTER AVAILABILITY GROUP [AG01]
    MODIFY REPLICA ON
    N'SERVER02ISS' WITH
    (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));
    ALTER AVAILABILITY GROUP [AG01]
    MODIFY REPLICA ON
    N'SERVER02ISS' WITH
    (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SERVER02.testad.com:1433'))
    
    ALTER AVAILABILITY GROUP [AG01]
    MODIFY REPLICA ON
    N'SERVER04ISS' WITH
    (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));
    ALTER AVAILABILITY GROUP [AG01]
    MODIFY REPLICA ON
    N'SERVER04ISS' WITH
    (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SERVER04.testad.com:1433'))
    
    --指定在此可用性副本当前拥有主角色(即它是主副本)时要生效的角色有设置:
    ALTER AVAILABILITY GROUP [AG01]
    MODIFY REPLICA ON
    N'SERVER04ISS' WITH
    (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST = (N'SERVER02ISS',N'SERVER04ISS')));
    
    ALTER AVAILABILITY GROUP [AG01]
    MODIFY REPLICA ON
    N'SERVER02ISS' WITH
    (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST = (N'SERVER04ISS',N'SERVER02ISS')));

    按道理说,脚本执行完后,在连接字符串中加入参数:ApplicationIntent = ReadOnly
    就能自动重定向到辅助副本。

    可是,在我的环境中只要加上ApplicationIntent = ReadOnly参数,就无法连接服务器。

    最后在大菠萝的帮助下,终于找出来是端口的问题。

    我的SQL Server服务并没有监听在1433端口,而是动态端口!

    修改成固定端口1433后并重启服务。

    再次使用ApplicationIntent = ReadOnly参数连接。

    虽然主副本是SERVER02,但是连接已经被重定向到了SERVER04

    如果不使用ApplicationIntent = ReadOnly参数连接。

    连接仍将指向主副本SERVER02。

    这里,附上大菠萝提供的几个脚本:

    查看副本间的只读路由关系:

    select 
     b.replica_server_name 
    ,a.routing_priority 
    ,c.replica_server_name 
    from
    sys.availability_read_only_routing_lists a
    left join
    sys.dm_hadr_availability_replica_cluster_states b
    on a.replica_id = b.replica_id 
    left join sys.dm_hadr_availability_replica_cluster_states  c
    on a.read_only_replica_id = c.replica_id 
    order by a.replica_id 

    当前的只读路由配置:

    select a.*,c.is_local,c.role_desc,d.endpoint_url,d.read_only_routing_url 
    from sys.dm_hadr_availability_replica_cluster_nodes a
    join sys.dm_hadr_availability_replica_cluster_states b
    on a.replica_server_name = b.replica_server_name 
    join sys.dm_hadr_availability_replica_states c
    on b.replica_id = c.replica_id 
    join sys.availability_replicas d
    on c.replica_id = d.replica_id 

    ----------------------------------------

    最后,对于要使用只读路由的客户端应用程序,其连接字符串必须满足以下要求:  

    • 使用 TCP 协议。      

    • 将应用程序意向特性/属性设置为只读。      

    • 引用配置为支持只读路由的可用性组的侦听器。      

    • 引用该可用性组中的数据库。

    参考链接:

    http://msdn.microsoft.com/zh-cn/subscriptions/downloads/ff878308.aspx#ror

    http://msdn.microsoft.com/zh-cn/subscriptions/downloads/hh213002.aspx

    http://hi.baidu.com/hanxiao2100/item/e0a46226519aab8b6f2cc368

    最后,特别感谢大菠萝,耽误你好久的时间哈~~

  • 相关阅读:
    [学习笔记]基于值域预处理的快速 GCD
    [学习笔记]整除偏序与zeta变换、Möbius变换、lcm卷积、gcd卷积
    [学习笔记]MinMax容斥
    [学习笔记]Pollard Rho算法
    [学习笔记]Miller Rabin测试
    [学习笔记]万能欧几里得
    用C#写程序安装包 Joe
    linux 命令
    几个有用的php字符串过滤,转换函数
    linux挂载 Windows分区
  • 原文地址:https://www.cnblogs.com/ajiangg/p/3668936.html
Copyright © 2011-2022 走看看