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

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

1.       版本信息和源码

1.1 版本信息

v1.0 beta(2015-04-02),基于 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 中的多 DbContext 类型配置:

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

2.8 支持 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,并按规则修改其中的内容,以下是一份参考的配置方式:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <configuration>
 3   <configSections>
 4     <section name="ef.masterslave" type="NDF.Data.EntityFramework.MasterSlaves.ConfigFile.EFMasterSlaveSection, NDF.Data.EntityFramework"
 5              requirePermission="false" />
 6   </configSections>
 7   <ef.masterslave>
 8     <!-- 以下是为所有用 EF 实体上下文(DbContext)类型为 MyProject.Data.MyDbContext 的数据库操作配置主从读写分离服务  -->
 9     <applyItem targetContext="MyProject.Data.MyDbContext, MyProject.Data"
10                autoSwitchSlaveOnMasterFauled="false" autoSwitchMasterOnSlavesFauled="true"
11                slaveRandomization="true" slaveScanInterval="60" >
12       <master connectionString="server=192.168.0.99;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" />
13       <slaves>
14         <add connectionString="server=192.168.0.101;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" order="0" />
15         <add connectionString="server=192.168.0.102;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" order="1" />
16         <add connectionString="server=192.168.0.103;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" order="2" />
17       </slaves>
18     </applyItem>
19     <!-- 以下是为另一个 EF 实体上下文(DbContext)配置主从读写分离服务  -->
20     <!--<applyItem ...="">
21       <master ...="" />
22       <slaves>
23         <add ...="" />
24         <add ...="" />
25       </slaves>
26     </applyItem>-->
27   </ef.masterslave>
28 </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 代码块)加入如下代码段:

1 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 数据库主从读写分离插件,关于该插件的源码实现原理和思路,本人将会在以后的博文中展开介绍。

时间: 2024-07-31 16:53:32

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

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

基于 EntityFramework 的数据库主从读写分离架构 回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录: src\ NDF.Data.EntityFramework\MasterSlaves 基于 EntityFramework 的数据库主从读写分离架构 - 需求/功能概述 基于 EntityFramework 的数据库主从读写分离架构(1)- 原理概述和基本功能实现 基于 EntityFramework 的

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

回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录: src\ NDF.Data.EntityFramework\MasterSlaves 上一回中(http://www.cnblogs.com/cjw0511/p/4398267.html),我们简单讲述了基于 EF 来实现数据库读写分离的原理.当然,这只是一个 demo 级别的简单实现,实际上,在我们工作环境中,碰到的情况远比这复杂多了,例如数据库连接的配置是通过 c

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

http://www.midifan.com/moduleuser-index-435678.htmhttp://www.midifan.com/moduleuser-index-435633.htmhttp://www.midifan.com/moduleuser-index-435673.htmhttp://www.midifan.com/moduleuser-index-435744.htmhttp://www.midifan.com/moduleuser-index-435660.htm

基于Mycat的MySQL主从读写分离配置详解与示例

1.mycat二进制包安装 tar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gzcd mycatmv mycat /opt/ useradd mycatchown -R mycat:mycat mycat 2.mysql操作搭建主库环境省略...... 创建数据库CREATE DATABASE `integration01` DEFAULT CHARACTER SET utf8 ; 创建物理表 CREATE TABLE

MySQL数据库之读写分离

一.概述: MySQL数据库主从结构配置以后,正常情况下数据库的所有读写操作全部都在主数据库上面,从数据库仅仅作为数据备份使用,显然无法有效的使用服务器资源,那么实现读写分离的需求就不可避免. 二.拓扑图说明: 如上图所示,本文要实现的是读MySQL数据库的写入操作(增删改)等在Master服务器(192.168.4.10)上面实现,而对MySQL数据库的读取操作(查询)等在Slave服务器(192.168.4.20)上面完成. 如果在程序员编程时创建两个数据库连接Connection,在程序中

linux下mysql基于mycat做主从复制和读写分离之基础篇

Linux下mysql基于mycat实现主从复制和读写分离1.基础设施 两台虚拟机:172.20.79.232(主) 172.20.79.233(从) 1.1软件设施 mysql5.6.39 , mycat1.6-RELEASE jdk1.7及其以上版本2.实现步骤一(mycat实现读写分离) 1.首先在两台服务器安装mysql 1.下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rp

Mycat - 实现数据库的读写分离与高可用【转】

文章地址:https://www.cnblogs.com/youzhibing/p/9553766.html 前言 开心一刻 上语文课,不小心睡着了,坐在边上的同桌突然叫醒了我,并小声说道:“读课文第三段”.我立马起身大声读了起来.正在黑板写字的老师吓了一跳,老师郁闷的看着我,问道:“同学有什么问题吗?”,我貌似知道了什么,蛋定的说了一句:“这段写的真好!我给大伙念念!”,老师还较真了:“你说说看,好在哪里?”,顿时我就无语了,脸黑着望向了同桌了,心想着:“这是个畜生啊!” 路漫漫其修远兮,吾将

mycat 使用 (主从 + 读写分离)

mycat 使用 mycat 源码地址 mycat 概述 是一个开源的分布式数据库系统,一个实现了 MySQL 协议的的 Server.前端用户可以把它看作是一个数据库代理,用 MySQL客户端工具和命令行访问,而其后端可以用 MySQL 原生(Native)协议与多个 MySQL服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信.其核心功能是 分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里. 数据切分 指通过某种特定的条件,将存放在

数据库_读写分离-多实例应用

1.数据读写分离介绍及搭建案例; 2.多实例服务. 一,数据读写分离介绍 1.概念:把客户端访问的查询请求和写请求,分别给不同的数据库服务器处理. 2.优点: 减轻主服务器的工作压力; 提高从服务器的硬件利用率 3.实现方式,有客户端指定和服务端指定两种. 客户端指定:程序写代码实现.例,插入数据的时候,连接主库;查询数据的时候,连接从库. 服务端指定:在服务器上部署数据读写分离的服务. 4.数据分离的软件:maxscal,mysql-proxy,mycat.这些软件也叫中间件. 5.原理: 由