数据库中间件的主要作用是向应用程序开发人员屏蔽读写分离和分库分表面临的挑战,并隐藏底层实现细节,使得开发人员可以像操作单库单表那样去操作数据。在介绍分库分表的主流设计方案前,我们首先回顾一下在单个库的情况下,应用的架构,可以用下图进行描述:

可以看到在操作单库单表的情况下,我们是直接在应用中通过数据源(c3p0、druid、dbcp等)与数据库建立连接,进行读写操作。而对于读写分离和分库分表,应用都要操作多个数据库实例,在这种情况下,我们就需要使用到数据库中间件。

1 主流的数据库中间件设计方案

典型的数据库中间件设计方案有2种:服务端代理(代理数据库)、客户端代理(代理数据源)。下图演示了这两种方案的架构:

可以看到不论是代理数据库还是代理数据源,底层都操作了多个数据库实例。不同的是:

在数据库代理中:

我们独立部署一个代理服务,这个代理服务背后管理多个数据库实例。而在应用中,我们通过一个普通的数据源(c3p0、druid、dbcp等)与代理服务器建立连接,所有的sql操作语句都是发送给这个代理,由这个代理去操作底层数据库,得到结果并返回给应用。在这种方案下,分库分表和读写分离的逻辑对开发人员是完全透明的。

在数据源代理中:

应用程序需要使用一个特定的数据源,其作用是代理,内部管理了多个普通的数据源(c3p0、druid、dbcp等),每个普通数据源各自与不同的库建立连接。应用程序产生的sql交给数据源代理进行处理,数据源内部对sql进行必要的操作,如sql改写等,然后交给各个普通的数据源去执行,将得到的结果进行合并,返回给应用。数据源代理通常也实现了JDBC规范定义的API,因此能够直接与orm框架整合。

2 主流的数据库中间件实现

无论是代理数据库,还是代理数据源,二者的作用都是类似的。以下列出了这两种方案目前已有的实现以及各自的优缺点:

数据库代理

目前的实现方案有:阿里巴巴开源的cobar,mycat团队在cobar基础上开发的mycat,mysql官方提供的mysql-proxy,奇虎360在mysql-proxy基础开发的atlas。目前除了mycat,其他几个项目基本已经没有维护。

优点:多语言支持。也就是说,不论你用的php、java或是其他语言,都可以支持。原因在于数据库代理本身就实现了mysql的通信协议,你可以就将其看成一个mysql 服务器。mysql官方团队为不同语言提供了不同的客户端却动,如java语言的mysql-connector-java,python语言的mysql-connector-python等等。因此不同语言的开发者都可以使用mysql官方提供的对应的驱动来与这个代理服务器建通信。

缺点:实现复杂。因为代理服务器需要实现mysql服务端的通信协议,因此实现难度较大。

数据源代理

目前的实现方案有:阿里巴巴开源的tddl,大众点评开源的zebra,当当网开源的sharding-jdbc。需要注意的是tddl的开源版本只有读写分离功能,没有分库分表,且开源版本已经不再维护。大众点评的zebra开源版本代码已经很久更新,基本上处于停滞的状态。当当网的sharding-jdbc目前算是做的比较好的,代码时有更新,文档资料比较全。

优点:更加轻量,可以与任何orm框架整合。这种方案不需要实现mysql的通信协议,因为底层管理的普通数据源,可以直接通过mysql-connector-java驱动与mysql服务器进行通信,因此实现相对简单。

缺点:仅支持某一种语言。例如tddl、zebra、sharding-jdbc都是使用java语言开发,因此对于使用其他语言的用户,就无法使用这些中间件。版本升级困难,因为应用使用数据源代理就是引入一个jar包的依赖,在有多个应用都对某个版本的jar包产生依赖时,一旦这个版本有bug,所有的应用都需要升级。而数据库代理升级则相对容易,因为服务是单独部署的,只要升级这个代理服务器,所有连接到这个代理的应用自然也就相当于都升级了。

ORM框架代理:

目前有hibernate提供的hibernate-shards,也可以通过mybatis插件的方式编写。相对于前面两种方案,这种方案可以说是只有缺点,没有优点。

Dragon项目采用的方案是代理客户端数据源的方式。

python的数据库中间件_数据库中间件设计方案相关推荐

  1. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

    原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

  2. 元组可以直接添加进数据库吗_数据库篇-第一章:数据库基本概念

    面试必备基础数据库知识,扫码关注公众号提升 01 第一,什么是数据库? 维基百科上是这样定义的: 所谓"数据库"是以一定方式储存在一起.能予多个用户共享.具有尽可能小的冗余度.与应 ...

  3. 创建mysql数据库快照_数据库教程

    下面,容我来向大家介绍数据库学习内容,主要讲述的是SQL Server 2008高可用性系列之数据库快照.想了解的就来看看吧! 一:简介:数据库快照是一个数据库的只读副本,它是数据库所有数据的映射,由 ...

  4. sql 数据库检查_数据库检查点– SQL Server 2016中的增强功能

    sql 数据库检查 When a new row is inserted or an existing one is updated in your database, the SQL Server ...

  5. phpcms数据库备份与恢复_数据库备份与恢复方案

    推荐教程:SQL教程 SQL SERVER数据备份方案 SQL SERVER数据库的备份方法主要有完整备份,差异备份,事务日志备份等.根据数据安全性的要求,推荐的备份方式为每周一次完整备份,每天一次差 ...

  6. java mysql数据库回退_数据库事务及Java中的处理

    事 务是指一组相互依赖的操作行为,举一个举得不能再被举的例子就是银行交易,当然还有其他像网上购物,电子货币交易等等,事务的成功取决于这些相互依赖的操 作行为是否都能执行成功,只要有一个操作行为失败,就 ...

  7. credspp数据库修正_数据库审计招标参数(修正)

    一.性能要求: 基本要求 描述 备注 资质要求 1 . 提供三年以上国家公安部颁发的<计算机信息系统安全专用产品销售许可证> : 2 . 通过国家信息安全产品强制认证(增强型认证) : 3 ...

  8. python非法变量名_数据库错误:ORA-01036:非法变量名/numb

    我认为您误解了绑定变量如何与Oracle和cx_Oracle一起工作. Oracle将SQL查询中的:myvar等表达式识别为绑定变量占位符.当遇到这种情况时,它会注意到在运行查询之前它需要这个变量的 ...

  9. python飞机票预定系统_数据库课程设计 - 机票预订系统

    一.机票预定系统 1.1 题目要求 要求具备如下基本功能 班机基本信息的管理: 航班信息的管理: 旅客预定机票.取消预约.付款取票.退票的管理: 查询航班信息.航班预定情况.旅客信息,计算航班满座率. ...

最新文章

  1. PyTorch 自动微分示例
  2. Unity使用陀螺仪控制Camera
  3. .describe() python_Python编程从入门到实践日记Day26
  4. 计算机硬盘满了怎么解决,使用SSD硬盘空间清理 C盘爆满怎么办
  5. java 线程组作用_Java线程组(ThreadGroup)使用
  6. 前端学习(1428):ajax封装三
  7. python的email模块_python email 模块
  8. 【C语言】(指针) 将两个数排序
  9. vs设计窗口不见了_龙猫腕表评测:VS沛纳海320V2版本
  10. jpa 连接多个mysql 数据库_SpringBoot 连接多个数据库
  11. Java8 map转list集合
  12. 深度学习的权重衰减是什么_深度学习-权重衰减
  13. 互联网创业如何收集用户反馈?
  14. Flutter 修改Slider 滑杆刻度
  15. 【多源融合】自适应卡尔曼滤波的多种形式:遗忘卡尔曼滤波、渐消记忆卡尔曼滤波和自适应卡尔曼滤波
  16. 03 数据载入、存储及文件格式
  17. android 8.1 9.0 10.0 app应用卸载黑名单
  18. TOEIC PLAN CHANGING
  19. k-均值聚类算法_聚类算法-K-均值算法
  20. 你是如何坚持读完《算法导论》这本书的?

热门文章

  1. JAVA Opencv在图片上添加中文
  2. List 去重的 6 种方法,这个方法最完美!
  3. C# partial 部分类使用简单举例说明
  4. [深入学习C#]利用反射给对象赋值
  5. 明令禁止工作“996”,是对“生而为人”的基本尊重
  6. 电脑长截图软件_电脑屏幕长截图+WORD文档里没有插入PDF文件选项时怎么办? 简单一招轻松完成...
  7. 计算机应用基础 a卷,计算机应用基础笔试A卷.doc
  8. 小米手机硬改技术_小米11手机爆料:首发骁龙875 或采用屏下摄像头技术
  9. matlab 判断鼠标按下_轻巧可爱,支持多设备——雷柏Ralemo Air1乐萌鼠标
  10. 苹果验证电子邮件地址服务器错误,苹果7P账户申请,验证电子邮件地址创建新Apple ID发生未知错误...