我踩过的Alwayson的坑!
最近被sql server Alwayson高可用组和读写分离,弄得神魂颠倒,身心俱疲。遇到了下面一些问题,提醒自己也给后来人做些记录。
EntityFramework支不支持Alwayson?
起因:
因为要进行数据库的优化,所以想在现有的sql server基础上采用微软的Alwayson解决方案,实现读写分离把数据库的压力减小一下。
之前两篇文章关于Alwayson的都是建立在直接使用Ado.net的基础上,因为EF也是基于Ado.net的orm所以,我认为也是支持Alwayson的。
写一个测试程序吧:
、
代码很简单,我就省略了注释,数据库有三个字段如下:
USE [test]
GO /****** Object: Table [dbo].[test1] Script Date: 2016/05/23 10:43:41 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[test1](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [datetime] NULL,
[test_id] [int] NULL,
CONSTRAINT [PK_test1] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO
private void button1_Click(object sender, EventArgs e)
{
using (testEntities dbcontext = new testEntities())
{
try
{ var list = (from info in dbcontext.test1
select info).ToList(); dataGridView1.DataSource = list;
}
catch (Exception ex)
{
//do nothing
} }
} private void button2_Click(object sender, EventArgs e)
{
var count = Convert.ToInt32(textBox1.Text);
using (testEntities dbcontext = new testEntities())
{
for(var i = ; i <= count;i++)
{
test1 t = new test1()
{
name = System.DateTime.Now,
test_id = i
}; dbcontext.test1.Add(t);
}
dbcontext.SaveChanges();
}
} private void button3_Click(object sender, EventArgs e)
{
using (testEntities dbcontext = new testEntities())
{
var item = dbcontext.test1.Where(p => p.id != ); dbcontext.test1.RemoveRange(item); dbcontext.SaveChanges(); }
}
环境简介:
1.主副本:193.160.26.28
2.辅助副本:193.160.26.32
3.侦听器:193.160.26.30
4.客户端:10.167.218.27
DB First方式连接字符串:(怎么做可以自行查询)
①不进行读写分离的时候
连接字符串如下:
<connectionStrings>
<add name="testEntities"
connectionString="metadata=res://*/test.csdl|res://*/test.ssdl|res://*/test.msl;provider=System.Data.SqlClient;provider connection string="data sou rce=tcp:193.160.26.30,1433;initial catalog=test;persist security info=True;user id=sa;password=123456;"" providerName="System.Data.EntityClient"/>
</connectionStrings>
期待结果:可以读,可以写,并且都是在主副本上进行的。
实际结果:
上图说明,不使用只读的时候,和我们的期待结果一致。
2.采用只读路由
修改连接字符串如下:
<connectionStrings>
<add name="testEntities" connectionString="metadata=res://*/test.csdl|res://*/test.ssdl|res://*/test.msl;provider=System.Data.SqlClient;provider connection string="data source=tcp:193.160.26.30,1433;initial catalog=test;persist security info=True;user id=sa;password=123456;ApplicationIntent=ReadOnly;MultiSubnetFailover=True"" providerName="System.Data.EntityClient"/>
</connectionStrings>
期待结果:能读取(辅助副本),不能写入(因为设定了只读)
实际结果:读取和写入的时候出现了如下的错误:
如上图所示:
在建立与服务器的连接时出错。 在连接到 SQL Server 时,在默认的设置下 SQL Server 不允许远程连接可能会导致此失败。(访问接口: TCP 访问接口,错误: 0 - 无法识别这种主机)(.Net SqlClient 数据访问接口)
为什么呢?
I.最先猜想到的是sql Client的问题,是不是不支持ReadOnly,查了一下msdn,上面解释如下:
https://msdn.microsoft.com/zh-cn/library/system.data.sqlclient(v=vs.110).aspx 意思就是4.0以上版本是支持 ApplicationIntent 的值。可能的值为 ReadWrite 和 ReadOnly。
查看一下:目前使用的sql Client,是支持的。
II.不是sqlClinet的问题,又仔细看了一下错误的,host不能识别,考虑是不是DNS的问题,在客户端使用cmd中的ping命令,ping一下侦听器地址
在主副本或者辅助副本中ping一下:
感觉好像是DNS的问题:把程序拷贝到主副本或者辅助副本中执行:
结果:
读过程:
读过程没出现问题。
写过程:出现了只读异常,貌似和我的期待结果一样。
分析问题:
因为我的客户端和两天虚拟机从属于不同的域账户,所以这可能就是问题的点。
解决问题:
怎么才能解决呢?
第一个方法:把客户端加到和虚拟机同一个域当中,但是这样做是很有风险的,不能保证每一个客户端都和服务器在同一个域当中。所以我不能采用这样的方式
第二个方法:仔细回览了一下只读路由配置的脚本, 下面是微软官方提供的示例
ALTER AVAILABILITY GROUP [AG1]
MODIFY REPLICA ON
N'COMPUTER01' WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));
ALTER AVAILABILITY GROUP [AG1]
MODIFY REPLICA ON
N'COMPUTER01' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://COMPUTER01.contoso.com:1433'));
在进行指定只读路由的时候,发现他使用的是实例名字COMPUTER01.contoso.com,所以猜想可能和这个有关系,要使用IP地址估计问题就能解决
修改前一篇的只读路由:http://www.cnblogs.com/dcz2015/p/5444438.html 如下:
①删除只读路由表:
ALTER AVAILABILITY GROUP [testAG]
MODIFY REPLICA ON N'WIN-14VNU7CGQO1' WITH
(
PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=NONE)
);
GO
ALTER AVAILABILITY GROUP [testAG]
MODIFY REPLICA ON N'WIN-14VNU7CGQO2' WITH
(
PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=NONE)
);
GO
②添加只读路由:
--①配置A副本的只读路由属性(ReadOnly代表‘只读意向’)
ALTER AVAILABILITY GROUP [testAG]
MODIFY REPLICA ON N'WIN-14VNU7CGQO1' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));
--②配置A副本的只读路由URL
ALTER AVAILABILITY GROUP [testAG]
MODIFY REPLICA ON N'WIN-14VNU7CGQO1' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'tcp://193.160.26.32:1433'));
--③配置B副本的只读路由属性
ALTER AVAILABILITY GROUP [testAG]
MODIFY REPLICA ON N'WIN-14VNU7CGQO2' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));
--④配置B副本的只读路由URL
ALTER AVAILABILITY GROUP [testAG]
MODIFY REPLICA ON N'WIN-14VNU7CGQO2' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'tcp://193.160.26.28:1433'));
--⑤配置A副本作为主副本时候的只读路由表
ALTER AVAILABILITY GROUP [testAG]
MODIFY REPLICA ON N'WIN-14VNU7CGQO1' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('WIN-14VNU7CGQO2','WIN-14VNU7CGQO1')));
--⑥配置B副本作为主副本时候的只读路由表
ALTER AVAILABILITY GROUP [testAG]
MODIFY REPLICA ON N'WIN-14VNU7CGQO2' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('WIN-14VNU7CGQO1','WIN-14VNU7CGQO2')));
GO
在客户端进行测试:
读过程:
写过程:
我踩过的Alwayson的坑!的更多相关文章
- 我踩过的Alwayson的坑!(上集)
最近被sql server Alwayson高可用组和读写分离,弄得神魂颠倒,身心俱疲.遇到了下面一些问题,提醒自己也给后来人做些记录. EntityFramework支不支持Alwayson? 起因 ...
- 微信小程序项目踩过的几个坑
一.前言 近期,开始了一段辛酸的还未开始就已经结束的"创业"(参见我的第二次创业,以梦为马,莫负韶华).大体上是开发了一款微信小程序,关于创业这件事情就不细说了,本文主要介绍一下开 ...
- 订餐系统之微信支付,踩了官方demo的坑
最近一个项目要增加微信支付的功能,想来这个东西出来这么久了,按微信提供的应该可以很快搞定的,结果提供的demo( JS API网页支付)中各种坑,咨询他们的客服,态度倒是非常好,就是解决不了问 ...
- 关于select标签曾经踩过的几个坑!
1.情景展示 select标签,是前端开发界面展示,经常需要用到一个标签,看看下面的坑,你中招了吗? 2.坑区展示 踩坑一:option标签没有声明value属性: 没有声明value属性 < ...
- 使用 Markdown 写技术博客,踩过的 6个坑
目录 Markdown 特性 Markdown 简介 常用语法 为什么流行 设计哲学 工具支持 版本演进 标准化之路 踩过了坑 平台帮助文档 语法差异 显示效果 我的最佳实践 摘要:本文记录我在使用 ...
- 踩过好多次的坑 - ajax访问【mango】项目的service
这个坑真的是踩过好多次了,好记性不如烂笔头,我总是太高估我的记忆力,这次真的是要写下来了. 项目是用的seam框架 + hibernate搭建的,架构是前辈们搭好的劳动成果,在配置service的访问 ...
- 线上问题排查,一不小心踩到阿里的 arthas坑了
最近帮新来的校招同学排查一个线上问题,问题本身不是很难,但是过程中踩到了一个arthas的坑,挺有意思的. 同时,也分享下在排查过程中使用的一些比较实用的工具,包括tcpdump.arthas.sim ...
- 我踩过的Django的坑
把自己在使用Django过程中吃过的亏 踩过的坑 记录一下 1. unique_together传的是元组 正确:unique_together = (('app_id', 'module_id', ...
- 那些年独自踩过的flascc的坑
[一个工程中使用多个flascc编译出来的swc] 1.如果是swf工程, 工程中同时使用多个flascc编译出来的swc, 可以顺利通过. 2.如果是swc工程, 工程中同时使用多个flascc编译 ...
随机推荐
- c++_work
while((ch=getopt(argc, argv, "X:Y:C:")) != EOF) { switch((char)ch) { case 'X': strcpy(strS ...
- 关于eclipse tomcat 无法启动(8080,8005,8009端口被占用)的解决方法,附 eclipse tomcat 与 tomcat 并存方式
eclipse 在编译运行时 新建的tomcat连接始终为stopped状态,描述为8080,8005,8009端口被占用. 这是因为在装完tomcat后,tomcat服务已启动,而eclipse仅仅 ...
- GitHub上README.md编写教程(基本语法)
一.标题写法: 第一种方法: 1.在文本下面加上 等于号 = ,那么上方的文本就变成了大标题.等于号的个数无限制,但一定要大于0个哦.. 2.在文本下面加上 下划线 - ,那么上方的文本就变成了中标题 ...
- Let's-Bug修复日志
Version 1.1 2015/11/16 修复了上传图片画质问题的Bug 修复了搜索功能的部分Bug 增加了下拉刷新的功能 修复了部分界面跳转之间的问题
- Feel Good POJ - 2796 (前缀和+单调栈)(详解)
Bill is developing a new mathematical theory for human emotions. His recent investigations are dedic ...
- mybatis的mapper注入失败
因为处在两个不同的资源文件夹下: 导致classpath无法加载其中一些文件,所以修改为classpath*后顺利进行. <!-- 加载spring容器 --> <!-- neede ...
- Mysql 中的MVCC原理,undo日志的依赖
一. MVCC 原理了解 原文点击:MVCC原理浅析 读锁: 也叫共享锁.S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的 ...
- [官网]Linux版本历史
This is a list of links to every changelog. https://kernelnewbies.org/LinuxVersions 总结一下 2.6.x 存在了八年 ...
- 【开讲啦】20181029 oracle教学笔记
--创建表空间 create tablespace waterboss--表空间名称 datafile 'd:\waterboss.dbf'--用于设置物理文件名称 size 100m--用于设置表空 ...
- 补充:pyhton 2 和3中的beyts类型
在python2里,bytes == str python2里还有个单独的类型是unicode , 把字符串解码后,就会变成unicode. 既然python2中byets == str,那为什么还要 ...