MSSQL AlwaysOn中的“主角色中的连接”和“可读辅助副本”初探
一、开篇
在进行配置只读路由的时候,需要进行配置可用性组中的可用性副本,如下如所示:
每一项都是啥意思可以看看这个链接
https://msdn.microsoft.com/zh-cn/library/hh213002(v=sql.120).aspx
在“可用性副本属性”对话框中,可以更改主角色和辅助角色的连接访问设置,如下所示:
对于辅助角色,从“可读取辅助角色”下拉列表中选择一个新值,如下所示:
- 否
-
不允许与此副本的辅助数据库的用户连接。它们不可用于读访问。这是默认设置。
- 仅读意向
-
仅允许与此副本的辅助数据库的只读连接。辅助数据库全都可用于读访问。
- 是
-
允许与此副本的辅助数据库的所有连接,但仅限读访问。辅助数据库全都可用于读访问。
对于主角色,从“主角色中的连接”下拉列表中选择一个新值,如下所示:
- 允许所有连接
-
主副本中的数据库允许所有连接。这是默认设置。
- 允许读/写连接
-
在 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中的“主角色中的连接”和“可读辅助副本”初探的更多相关文章
- 从Win32程序中的主函数中获取命令行参数
在标准C或者Win32控制台程序的main函数中,它们都有两个参数:"argc" 和 "argv",如下所示: int main(int argc, char ...
- Unity3d中角色模型和角色名字保持相对位置
3D游戏中,经常遇到这样的情况.角色模型上需要显示角色名字或者血条等信息. 如果用一个摄像机会有可能出现名字或血条显示不正常等问题,所以我采用两个摄像机.一个渲染名字或血条等UI,另一个渲染角色模型. ...
- Transactional Replication2:在Subscriber中,主键列是只读的
在使用Transactional Replication时,Subscriber 被认为是“Read-Only”的 , All data at the Subscriber is “read-only ...
- asp.net中使用基于角色role的Forms验证
http://www.cnblogs.com/yao/archive/2006/06/24/434783.html asp.net中使用基于角色role的Forms验证,大致经过几下四步:1.配置系统 ...
- 简单练习题2编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能
编写Java应用程序.首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”.“取款”和“余额查询”.其次, 编写一个主类,在主类中测试Account类的 ...
- 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。
//在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10 ...
- 在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行
package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) ...
- (ios7) 解决Ios7中,Navigatebar 显示在主View中,和ios6 不一致问题
在ios 7 系统中 NavigateBar 显示在主View中 ,Ios6 不在主View中,导致后台代码的方式编写View不一致 解决方法: 在ViewControl的viewDidLoad 方法 ...
- 域控制器中的FSMO角色
FSMO是Flexible single master operation的缩写,意思就是灵活单主机操作.营运主机(Operation Masters,又称为Flexible Single Maste ...
随机推荐
- c# Internet时间服务器同步
2009-02-02 17:48 8226人阅读 评论(2) 收藏 举报 服务器internetc#socketstringwindows 需要用到的名空间 using System.Net; usi ...
- oracle安装界面中文乱码解决
在安装oracle时如果我们用的是英文安装没有任何问题,但是我要安装中文的,结果中文界面就出现了乱码了,后来网上找了原因是要安装中文包才可以,下面我来介绍一下. 在Linux的X window里安装o ...
- IOS6 字体高亮显示
ios6之前在一个字符串中如果也让某个字体高亮或者特殊显示(如: 关注[ ]),需要用单独一个的标签进行显示,或者利用CoreText进行字体绘绘制,非常麻烦: 现在IOS6 中TextView,la ...
- Eclipse添加小工具_打开当前文件所在文件夹
CopyRight yuhuashi http://www.cnblogs.com/chuyuhuashi/archive/2012/05/06/2485831.html 默认情况下使用eclip ...
- 用C#.NET实现电子邮件客户程序
用C#.NET实现电子邮件客户程序 周华清 戴晟辉(东华理工学院计算机与通信系 江西 抚州 344000) [摘要]通过C#这种VisualSTudio.NET中新引入的面向对象且类型安全的编程语言, ...
- Visio Premium 2010密钥+破解激活方法
Visio Premium 2010密钥+破解激活方法: 在安装时能够使用下面密钥: GR24B-GC2XY-KRXRG-2TRJJ-4X7DC VWQ6G-37WBG-J7DJP-CY66Y-V27 ...
- 关于Android与pc通信时中文乱码的分析和解决
初步实现了Android与pc服务器的通信之后,又碰到了传说中令人头疼不已的中文乱码问题.既然出现了乱码,那么原因自然是协议不通了.我们知道eclipse中默认的编码标准是GBK,而安卓程序开发所默认 ...
- Java中介者设计模式
中介者设计模式是一种很常见的设计模式,当中我们最为熟悉的就是我们的MVC框架.当中的C作为控制器就是一个详细的中介者,它的作用是把业务逻辑(Model),和视图(Viwe)隔离开来.使M V协调工作, ...
- MYSQL源码 与 DBUG
一.前言 在规模稍微大点的项目中,为了方便快速找到bug的所在,我们往往需要在代码中加入一些调试用的代码,比如加入一些printf,打印出一些重点的信息:加入assert,进行断言判断.这些比较随意的 ...
- Objective-C语法之NSArray和NSMutableArray
转自:http://www.cnblogs.com/stoic/archive/2012/07/09/2582773.html Objective-C的数组比C++,Java的数组强大在于,NSArr ...