基于 EntityFramework 的数据库主从读写分离服务插件

1. 版本信息和源码

1.1 版本信息

v1.01 beta(2015-04-07),基于 EF 6.1 开发,支持 EF 6.1 之后的所有 EF6 版本。

1.2 开放源码地址

https://github.com/cjw0511/NDF.Infrastructure

关于该 EF 数据库主从读写分离服务核心源码位于文件夹:src\ NDF.Data.EntityFramework\MasterSlaves 文件夹中。

2. 功能概述

2.1 支持在基于 EF6 进行数据操作时:

2.1.1   针对所有的数据写入操作,自动将请求转发至 主服务器(Master,即写入操作服务器);

2.1.2   针对所有的数据查询操作,自动将请求转发至 从服务器(Slave ,即查询操作服务器);

2.1.3   以上的数据库操作请求转发通过在执行命令前更改数据库连接字符串来完成,但是该数据连接字符串的更改动作,不需要业务开发人员改动任何现有代码;

2.2 在将读写命令请求转发至相应数据库服务器时,支持一主多从管理

即可以设定一台数据库服务器作为 Master 服务器,同时可以设置一台或者多台数据库服务器作为 Slave 服务器;

注:Master 服务器和 Slave 服务器之间的需提前建立数据同步机制,该部分工作可通过配置 DBMS 系统来完成。

2.3 支持自动检测服务器运行状态:

2.3.1   可自动检测 Master 服务器的在线状态;

2.3.2   可自动检测设定的 Slave 服务器列表中每台 Slave 服务器节点的在线状态;

2.3.3   可自定义设定自动检测服务器状态的时间频率;

2.4 支持在 Slave 服务器节点不可用时自动切换至 Master 节点:

如果设置了多台 Slave 服务器节点,将在每次执行查询操作时,根据自动检测的 Slave 服务器在线状态自动选择可用的服务器节点;如果所有的 Slave 都不可用,则可以根据配置确定是否自动将数据查询操作切换至 Master 服务器;

2.5 支持在 Master 服务器节点不可用时自动切换至 Slave 节点:

在基于 EF6 的数据更改操作时,如果检测到 Master 服务器状态不可用,则可以根据配置确定是否自动将数据更改操作切换至 Slave 服务器列表中的第一个可用项(一般情况下不建议进行该设定,因为将 Slave 服务器作为 Master 服务器使用虽然能使在 Master 故障后应用程序不离线,但是同样也会带来在 Slave 服务器节点之间的数据一致性问题。);

2.6 支持多台 Slave 节点之间的负载均衡:

如果设定了多台 Slave 服务器节点,在每次执行查询操作时,支持按照设定顺序选择第一台可用的 Slave 服务器,也支持随机选择所有可用的 Slave 服务器中任意一台(该设置可以有效分散 Slave 服务器查询压力)以执行查询命令。

2.7 支持面向切面的 EF 数据库主从读写分离服务动作拦截器配置:

可通过定义和注册实现接口 IMasterSlaveInterceptor 的拦截器,以实现在 EF 数据库主从读写分离服务执行特定动作:

扫描服务器节点可用状态前、扫描服务器节点可用状态后、修改数据库操作命令的连接字符串前、修改数据库操作命令的连接字符串后时以执行用户指定的附加动作(例如在扫描到服务器节点不可用时自动记录日志或发送消息通知)。

2.8 支持 EF 中的多 DbContext 类型配置:

如果项目中使用多种类型的  EF 实体上下文(System.Data.Entity.DbContext) 对象,支持为每个不同类型的 DbContext 分别配置不同的主从读写分离数据库连接方案;

2.9 支持 Master 服务器节点和 Slave 服务器节点的热插拔配置:

即可以不用停止项目的运行,直接通过修改配置文件 ef.masterslave.config 中的内容,来达到自动刷新相关配置连接的效果;在修改配置文件后并重新生效时,支持自定义的更改事件通知。

3. 使用说明

3.1 设置多个数据库服务器实例之间的自动同步

首选通过数据库管理系统(DBMS)来配置多个数据库服务器实例之间的主从自动同步机制,例如:

3.1.1   如果是用 MSSQLSERVER 数据库系统,可以配置多台数据库服务器实例之间的复制、订阅策略;

3.1.2   如果是用 MySQL 数据库系统,可以配置多台数据库服务器实例之间的主从复制策略;

3.1.3   其他 Oracle、DB2...

3.2 在项目中添加配置文件

在项目根目录下添加配置文件 ef.masterslave.config,并按规则修改其中的内容,以下是一份参考的配置方式:

         <?xml version="1.0" encoding="utf-8" ?>

         <configuration>

           <configSections>

             <section name="ef.masterslave" type="NDF.Data.EntityFramework.MasterSlaves.ConfigFile.EFMasterSlaveSection, NDF.Data.EntityFramework"

                      requirePermission="false" />

           </configSections>

           <ef.masterslave>

             <!-- 以下是为所有用 EF 实体上下文(DbContext)类型为 MyProject.Data.MyDbContext 的数据库操作配置主从读写分离服务  -->

             <applyItem targetContext="MyProject.Data.MyDbContext, MyProject.Data"

                        autoSwitchSlaveOnMasterFauled="false" autoSwitchMasterOnSlavesFauled="true"

                        serverStateScanInterval="60" serverStateScanWithNoOffline="false"

                        slaveRandomization="true" >

               <master connectionString="server=192.168.0.99;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" />

               <slaves>

                 <add connectionString="server=192.168.0.101;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" order="0" />

                 <add connectionString="server=192.168.0.102;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" order="1" />

                 <add connectionString="server=192.168.0.103;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" order="2" />

               </slaves>

             </applyItem>

             <!-- 以下是为另一个 EF 实体上下文(DbContext)配置主从读写分离服务  -->

             <!--<applyItem ...>

               <master ... />

               <slaves>

                 <add ... />

                 <add ... />

               </slaves>

             </applyItem>-->

           </ef.masterslave>

         </configuration>

3.3 在项目中引入依赖的程序包

3.3.1   EntityFramework 6.1 以上版本;

3.3.2   Microsoft Enterprise Library - Data Access Application Block 6;

3.3.3   Newtonsoft.Json.dll 6.0 以上版本;

3.3.4   NDF.Utilities.dll;

3.3.5   NDF.Data.dll;

3.3.6   NDF.Data.EntityFramework.dll;

3.4 在项目中添加启动代码

在项目的启动代码中(控制台和桌面程序一般为 Program 类型的 Main 方法、ASP.NET 程序一般为 Global.asax 文件的 Application_Start 代码块)加入如下代码段:

NDF.Data.EntityFramework.MasterSlaves.EFMasterSlaveConfig.Register(typeof(MyDbContext));

其中方法中传入的类型参数应该是 ef.masterslave.config 配置文件中 applyItem 节的 targetContext 属性所示的类型,表示要为具体哪个类型的 EF 实体上下文(DbContext) 配置读写分离服务。

4. 其他

4.1  关于主从数据库中相关数据内容的自动同步机制,由数据库管理系统(DBMS,如 MSSQLSERVER、Oracle、MySQL、DB2 等)来完成,该部分的功能不由本插件来提供;目前几乎所有的主流 DBMS 系统都提供了主从数据库自动同步机制相关功能;

4.2  该 EF 数据库主从读写分离方案支持所有普通数据库事务和分布式事务操作,不过分布式事务也同样需要数据库管理系统(DBMS)的支持否则无效;

4.3  在基于 EF6 和该插件的配合进行数据库主从读写分离操作,程序会自动检测所执行的数据库操作的事务状态,并自动将带有数据库事务或分布式事务的所有 增删改请求 和 查询请求 都转发至 Master 服务器。

4.4  本篇文章只是概述性的介绍了本人编写的这个 EF 数据库主从读写分离插件,关于该插件的源码实现原理和思路,本人将会在以后的博文中展开介绍。

基于 EntityFramework 的数据库主从读写分离服务插件的更多相关文章

  1. 基于 EntityFramework 的数据库主从读写分离架构(1) - 原理概述和基本功能实现

        回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录:      src\ NDF.Data.EntityFramew ...

  2. 基于 EntityFramework 的数据库主从读写分离架构 - 目录

    基于 EntityFramework 的数据库主从读写分离架构       回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目 ...

  3. 基于 EntityFramework 的数据库主从读写分离架构(2)- 改进配置和添加事务支持

        回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录:      src\ NDF.Data.EntityFramew ...

  4. 基于 EntityFramework 的数据库主从读写分离

    现在刚开始来研究EntityFramwork,起初是在vs2012中通过工具来创建EF ,但是对我这种不熟悉菜鸟来说 有很多业务用EF做出来还是有点难度的,今天来手动搭建一个EF框架,大神勿喷

  5. 基于Amoba实现mysql主从读写分离

    一.Amoeba简介           Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特 ...

  6. MySQL搭建主从数据库 实现读写分离

    首先声明,实际生产中,网站为了提高用户体验,性能等,将数据库实现读写分离是有必要的,我们让主数据库去写入数据,然后当用户查询的时候,然后在从数据库读取数据,故能减轻数据库的压力,实现良好的用户体验! ...

  7. Amoeba搞定mysql主从读写分离

    前言:一直想找一个工具,能很好的实现mysql主从的读写分离架构,曾经试用过mysql-proxy发现lua用起来很不爽,尤其是不懂lua脚本,突然发现了Amoeba这个项目,试用了下,感觉还不错,写 ...

  8. Amoeba实现mysql主从读写分离

    Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...

  9. Mycat - 实现数据库的读写分离与高可用

    前言 开心一刻 上语文课,不小心睡着了,坐在边上的同桌突然叫醒了我,并小声说道:“读课文第三段”.我立马起身大声读了起来.正在黑板写字的老师吓了一跳,老师郁闷的看着我,问道:“同学有什么问题吗?”,我 ...

随机推荐

  1. 移动端H5调用摄像头(选择上传图片)

    <label>照相机</label> <input type="file" id='image' accept="image/*" ...

  2. 使用python获取路径问题

    import sys curDir = sys.path[0] sys.path.append(curDir + '\\models') sys.path.append(curDir + '/mode ...

  3. mybatis异常:Could not find result map Java.util.Map 问题分析及解决 定位不到具体的位置的错误

    mybatis异常:Could not find result map Java.util.Map 问题分析及解决 报这个错误呢,很难受的就是你定位不到具体的地方,找不到位置修改,你只知道有错误,但是 ...

  4. C#对Jason序列化匿名对象

    引用: using System.Web.Script.Serialization; 代码: var resp = new { flag = false, url = ConfigReader.Log ...

  5. UOJ 55 【WC2014】紫荆花之恋——点分治+平衡树

    题目:http://uoj.ac/problem/55 点分治.在点分树上每个点上用 splay 维护管辖的点的情况.做几次就重构点分树.TLE.只能过 20 分. #include<cstdi ...

  6. oracle数据库启动时出现ORA-01157和ORA-01110问题

    sql>startup mount; sql>alter database open; RA-01157: 无法标识/锁定数据文件 10 - 请参阅 DBWR 跟踪文件ORA-01110: ...

  7. NOIP 2005 校门外的树

    #include<iostream> #include<cstring> using namespace std; int a[10005]; int main() { mem ...

  8. 黄聪:WordPress 多站点建站教程(四):获取子站点相关信息(站点的注册时间,修改时间,总文章数,URL等)

    1.获取子站点blogs表里面的内容信息 $blog_details = get_blog_details(1); echo 'Blog '.$blog_details->blog_id.' i ...

  9. WebService返回json格式数据供苹果或者安卓程序调用

    1.新建一个WebService. 2. /// <summary> /// DemoToJson 的摘要说明 /// </summary> [WebService(Names ...

  10. Bootstrap-Other:可视化布局

    ylbtech-Bootstrap-Other:可视化布局 1.返回顶部 1. 2. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 1. http://www.runoob.co ...