一、开篇

在进行配置只读路由的时候,需要进行配置可用性组中的可用性副本,如下如所示:

每一项都是啥意思可以看看这个链接

https://msdn.microsoft.com/zh-cn/library/hh213002(v=sql.120).aspx

  1. “可用性副本属性”对话框中,可以更改主角色和辅助角色的连接访问设置,如下所示:

    • 对于辅助角色,从“可读取辅助角色”下拉列表中选择一个新值,如下所示:

      不允许与此副本的辅助数据库的用户连接。它们不可用于读访问。这是默认设置。

      仅读意向

      仅允许与此副本的辅助数据库的只读连接。辅助数据库全都可用于读访问。

      允许与此副本的辅助数据库的所有连接,但仅限读访问。辅助数据库全都可用于读访问。

    • 对于主角色,从“主角色中的连接”下拉列表中选择一个新值,如下所示:

      允许所有连接

      主副本中的数据库允许所有连接。这是默认设置。

      允许读/写连接

      在 Application Intent 属性设置为 ReadWrite 或者未设置 Application Intent 连接属性时,将允许连接。不允许 Application Intent 连接属性设置为 ReadOnly 的连接。这可帮助阻止客户错误地将读意向工作负荷连接到主副本。有关 Application Intent 连接属性的详细信息,请参阅将连接字符串关键字用于 SQL Server Native Client

看完之后几个地方很暧昧:

1.什么是“仅读意向”?

2.啥是“主角色中的连接”和“可读辅助副本”,它们都是做什么的?有啥联系?

特别对于“主角色中的连接”和“可读辅助副本”两个选项的解释,让人匪夷所思,扑朔迷离,看了网友的一些文章,基本都是配置完解释一下,但是也没讲清楚,不同的配置可能出现什么现象,

于是乎我有点较真了,有时候我较真起来,都吓到了我自己,囧!!!

分析一下:

首先:我们知道副本分为“主副本”和“辅助副本”,对应的就是上面的“主角色”和“辅助角色”,并且“主角色”只有一个

其次:像我图中的两个副本,他们的配置是一样的,是为了保证,当主副本和辅助副本因为故障切换之后,能够依然保证像故障前一样工作。

最后:我的理解是作为主角色的时候,副本的“可读辅助副本”是不生效的,而作为辅助角色时候“主角色中的连接”也是不生效的。

那么下面我就来具体看看,当只有两个副本时候,他们的不同组合会产生什么样的效果。

二、测试

1.环境呢依然是上一篇的环境:http://www.cnblogs.com/dcz2015/p/5444438.html

2.列出需要测试的观点:(测试图有点多,可以直接略过看结果和结论)

  主角色中的连接 可读辅助角色 客户端行为 读请求 写请求
1 允许所有 不设置ReadOnly    
2 允许所有 仅读意向 不设置ReadOnly    
3 允许所有 不设置ReadOnly    
4 允许所有 设置ReadOnly    
5 允许所有 仅读意向 设置ReadOnly    
6 允许所有 设置ReadOnly    
7 允许读写 不设置ReadOnly    
8 允许读写 仅读意向 不设置ReadOnly    
9 允许读写 不设置ReadOnly    
10 允许读写 设置ReadOnly    
11 允许读写 仅读意向 设置ReadOnly    
12 允许读写 设置ReadOnly    

测试1:

配置:

结果:

测试2:

配置:

结果:

测试3:

配置:

结果:

测试4:

配置:

结果:

测试5:

配置:

写数据库:

读数据库:

结果:写数据库会路由到辅助副本,辅助副本是只读的,所以抛出异常

测试6:

配置:

结果:

测试7:

配置:

结果:

测试8:

配置:

结果:

测试9:

配置:

结果:

测试10:

配置:

结果:

测试11:

配置:

结果:

写操作:

读操作:

测试12:

配置:

结果:

写操作:

读操作:

三、总结 

经过上面的12次测试,进行一下总结:

  主角色中的连接 可读辅助角色 客户端行为 读请求 写请求
1 允许所有 不设置ReadOnly 主副本 主副本
2 允许所有 仅读意向 不设置ReadOnly 主副本 主副本
3 允许所有 不设置ReadOnly 主副本 主副本
4 允许所有 设置ReadOnly 主副本 主副本
5 允许所有 仅读意向 设置ReadOnly 辅助副本 异常
6 允许所有 设置ReadOnly 辅助副本 异常
7 允许读写 不设置ReadOnly 主副本 主副本
8 允许读写 仅读意向 不设置ReadOnly 主副本 主副本
9 允许读写 不设置ReadOnly 主副本 主副本
10 允许读写 设置ReadOnly 异常 异常
11 允许读写 仅读意向 设置ReadOnly 辅助副本 异常
12 允许读写 设置ReadOnly 辅助副本 异常

结论一:客户端配置ApplicationIntent=ReadOnly;启用只读路由功能,所有的请求先交给辅助副本来处理

结论二:客户端不配置ApplicationIntent=ReadOnly;那么读和写请求处理,都是主副本进行处理的,如1、2、3、7、8、9

结论三:在4中,主副本处理只读请求先交给辅助路由,因为所有的辅助副本都是不可写的,所以再由自己来处理只读路由

    在10中,所有的辅助副本都是不可写,但是主副本又不处理ReadOnly的请求,所以就异常了

MSSQL AlwaysOn中的“主角色中的连接”和“可读辅助副本”初探的更多相关文章

  1. 从Win32程序中的主函数中获取命令行参数

    在标准C或者Win32控制台程序的main函数中,它们都有两个参数:"argc" 和 "argv",如下所示: int main(int argc, char ...

  2. Unity3d中角色模型和角色名字保持相对位置

    3D游戏中,经常遇到这样的情况.角色模型上需要显示角色名字或者血条等信息. 如果用一个摄像机会有可能出现名字或血条显示不正常等问题,所以我采用两个摄像机.一个渲染名字或血条等UI,另一个渲染角色模型. ...

  3. Transactional Replication2:在Subscriber中,主键列是只读的

    在使用Transactional Replication时,Subscriber 被认为是“Read-Only”的 , All data at the Subscriber is “read-only ...

  4. asp.net中使用基于角色role的Forms验证

    http://www.cnblogs.com/yao/archive/2006/06/24/434783.html asp.net中使用基于角色role的Forms验证,大致经过几下四步:1.配置系统 ...

  5. 简单练习题2编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能

    编写Java应用程序.首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”.“取款”和“余额查询”.其次, 编写一个主类,在主类中测试Account类的 ...

  6. 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

    //在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10 ...

  7. 在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行

    package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) ...

  8. (ios7) 解决Ios7中,Navigatebar 显示在主View中,和ios6 不一致问题

    在ios 7 系统中 NavigateBar 显示在主View中 ,Ios6 不在主View中,导致后台代码的方式编写View不一致 解决方法: 在ViewControl的viewDidLoad 方法 ...

  9. 域控制器中的FSMO角色

    FSMO是Flexible single master operation的缩写,意思就是灵活单主机操作.营运主机(Operation Masters,又称为Flexible Single Maste ...

随机推荐

  1. C++成员变量、构造函数的初始化顺序

    一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静态变量(本地化数据和代码范围): st ...

  2. Redis学习_01 windows下的环境搭建

    一.Redis 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset( ...

  3. java连接数据库的解决方法大全(mysql)

    解决方法一:(最重要的一种方法) 你看下my.ini,有无  [mysql] default-character-set=utf8 [client]  default-character-set=ut ...

  4. DuiLib(一)——窗口及消息

    最近看了下开源界面库duilib的代码,写几篇相关的文章.网上已经有好多相关的文章了,我这里只是记录自己的学习过程,写到哪里算哪里,权当自娱自乐. duilib是一轻量级的direcui界面库,所谓d ...

  5. Windows 7系统安装MySQL5.5.21图解

    Win7系统安装MySQL5.5.21图解 大家都知道MySQL是一款中.小型关系型数据库管理系统,非常具有有用性,对于我们学习非常多技术都有帮助,前几天我分别装了SQL Server 2008和Or ...

  6. Anroid自定义RatingBar,显示半个(小数个)的stepSize时,变为整数个的问题

    <RatingBar android:id="@+id/rb_starbar" style="@style/joblist_item_ratingbar_style ...

  7. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

  8. perl 变量详解

    http://www.perlmonks.org/?node_id=933450 use strict; use Devel::Peek; my $a; Dump($a); $a=4; Dump($a ...

  9. 今天再分享一个TextView内容风格化的类

    /* * Copyright (C) 2014 Jason Fang ( ijasonfang@gmail.com ) * * Licensed under the Apache License, V ...

  10. java_类承继其他类的内部类例子

    package ming; class Outer { class In { public In(String msg) { System.out.println(msg); } } } public ...