最近被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=&quot;data sou rce=tcp:193.160.26.30,1433;initial catalog=test;persist security info=True;user id=sa;password=123456;&quot;" 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=&quot;data source=tcp:193.160.26.30,1433;initial catalog=test;persist security info=True;user id=sa;password=123456;ApplicationIntent=ReadOnly;MultiSubnetFailover=True&quot;" 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的坑!(上集)的更多相关文章

  1. 我踩过的Alwayson的坑!

    最近被sql server Alwayson高可用组和读写分离,弄得神魂颠倒,身心俱疲.遇到了下面一些问题,提醒自己也给后来人做些记录. EntityFramework支不支持Alwayson? 起因 ...

  2. 微信小程序项目踩过的几个坑

    一.前言 近期,开始了一段辛酸的还未开始就已经结束的"创业"(参见我的第二次创业,以梦为马,莫负韶华).大体上是开发了一款微信小程序,关于创业这件事情就不细说了,本文主要介绍一下开 ...

  3. 小程序框架WePY 从入门到放弃踩坑合集

    小程序框架WePY 从入门到放弃踩坑合集 一点点介绍WePY 因为小程序的语法设计略迷, 所以x1 模块化起来并不方便, 所以x2 各厂就出了不少的框架用以方便小程序的开发, 腾讯看到别人家都出了框架 ...

  4. better-scroll踩坑合集

    better-scroll踩坑合集:https://www.jianshu.com/p/6338a8033281

  5. 坎坷路:ASP.NET 5 Identity 身份验证(上集)

    之所以为上集,是因为我并没有解决这个问题,写这篇博文的目的是纪录一下我所遇到的问题,以免自己忘记,其实已经忘了差不多了,写的过程也是自己回顾的过程,并且之前收集有关 ASP.NET 5 身份验证的书签 ...

  6. K8S线上集群排查,实测排查Node节点NotReady异常状态

    一,文章简述 大家好,本篇是个人的第 2 篇文章.是关于在之前项目中,k8s 线上集群中 Node 节点状态变成 NotReady 状态,导致整个 Node 节点中容器停止服务后的问题排查. 文章中所 ...

  7. 线上问题排查,一不小心踩到阿里的 arthas坑了

    最近帮新来的校招同学排查一个线上问题,问题本身不是很难,但是过程中踩到了一个arthas的坑,挺有意思的. 同时,也分享下在排查过程中使用的一些比较实用的工具,包括tcpdump.arthas.sim ...

  8. 订餐系统之微信支付,踩了官方demo的坑

        最近一个项目要增加微信支付的功能,想来这个东西出来这么久了,按微信提供的应该可以很快搞定的,结果提供的demo( JS API网页支付)中各种坑,咨询他们的客服,态度倒是非常好,就是解决不了问 ...

  9. 使用 Markdown 写技术博客,踩过的 6个坑

    目录 Markdown 特性 Markdown 简介 常用语法 为什么流行 设计哲学 工具支持 版本演进 标准化之路 踩过了坑 平台帮助文档 语法差异 显示效果 我的最佳实践 摘要:本文记录我在使用 ...

随机推荐

  1. AVD Snapshot功能

    写程序的时候,经常会碰到:The application has stopped unexpectly… 有时候,会想对原来软件增加新功能或者修改bug.在eclipse修改后保存代码(注意,要保存所 ...

  2. TCP恋爱史:三次握手和四次分手

    TCP协议非常重要,这里把它的连接和释放整理一下. 首先是三次握手: 1.  客户端发起,像服务器发送的报文SYN=1,ACK=0,然后选择了一个初始序号:seq=x. SYN是干什么用的? 在链接的 ...

  3. MSSQLSERVER数据库- 一条代码搞定单表备份表结构和表数据

    在百度上找到的,很实用这个容易操作,不就两张表,我的建议就是备份表带上日期,以便以后要恢复数据的时候,可以快速找到他,这样备份是表结构和数据一起处理.select * into share_20090 ...

  4. [转]Java 动态代理机制分析及扩展

    引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  5. struts2—拦截器

    在Struts2中,如果用户没有指定执行哪些拦截器,struts2有一个默认执行的栈,defaultStack; 一旦如果用户有指定执行哪些拦截器,默认的拦截器栈就不会被执行 拦截器配置举例(stru ...

  6. ssh免密码登录记录

    做mha.hadoop安装过程中都要用ssh免密码登陆,查过一些资料,踩过很多坑,下面用简单记录一下 首先要安装ssh linux : centOS 6.5 yum -y install *ssh* ...

  7. 关于STM32下载问题的简单理解

    首先STM32分为两种下载方式1.ISP(IN-SYSTEM-PROGRAMMING在线编程)  2.JTAG 这里简单谈谈对ISP下载的理解: ISP下载是51单片机,STM等单片机比较常见的一种下 ...

  8. Scribefire发CSDN博客

    历史 在非常久非常久曾经,CSDN是支持外部工具来写文章的,但是在还有一个非常久非常久曾经就不行了. 突然看到CSDN有能够用外部工具来写博客了(CSDN的公告),一直以来都纠结这个问题,CSDN的编 ...

  9. 理解CRC校验

    举个最简单的例子,A向B发送一个数字,B如何检测数字在传输过程中有没有发生错误呢? A和B之间,定下一个协议,两边都知道一个除数X,A向B发送数字的时候,同时把余数附带后面发过去.比如,两边定的除数是 ...

  10. multiselect获取选中的多个下拉项的值(逗号分割的字符串)

    /*传入下拉select标签*/ function get_selected(mslt_employees) { var emplo =mslt_employees.multiselect(" ...