vlambda博客
学习文章列表

数据库中间件该如何归类?

加关注哦



数据库中间件,百度百科定义:

2018年公布的计算机科学技术名词。处于底层数据库和用户应用系统之间,主要用于屏蔽异构数据库的底层细节的中间件。是客户端与后台的数据库之间进行通信的桥梁。


    

        这个定义的其实并不是很准确,不一定只是屏蔽异构数据库之间,也可以屏蔽同构数据库之间。之所以要屏蔽,更多的是解决单一数据库性能瓶颈,无法突破单一物理资源的问题。最大的贡献是分库分表的功能,提升了单一数据库的扩展能力。

业界现在比较出名的数据库中间件产品也不少,如apache开源的sharding-jdbc,mycat开源项目,爱可生开源的DBLE...,数据库中间件做为分布式数据库也曾风靡一时,随着PGXC架构、NEWSQL流行开来,分布式理论大范围推广,分布式技术越发成熟,数据库中间件却有日落西山之势,但这不代表这项技术会消失,在涉足分布式数据库领域后,我想去细细体会一下数据库中间件!


        数据库中间件最大的价值就如其定义,可以屏蔽同构或异构数据库的底层细节,让应用使用数据库中间件就像使用一个普通数据库一样。愿景是好的,只是在使用场景上限制诸多,并不像真的普通数据库那样。


1. 语法的限制


        限制的内容其实还不少,包括DDL、DML、查询、管理,这也导致通过数据库中间件作为数据库桥梁的方式,应用不应过度依赖数据库,SQL语句要尽量简单,表连接也是尽量不要超过2个。总之要做到一个词“简单”。


2. 事务能力

        大部分数据库中间件具备分布式事务xa的能力,但这个xa能否在生产上使用是要去评估影响的,像Oracle、MySQL本身是具备xa事务接口的,数据库中间件产品也是借助数据库本身的分布式事务xa接口来实现分布式事务的能力。


        分布式事务一般为两阶段提交,角色分为RM(resource manager)和TM(Transaction manager),数据库中间件作为普通数据库的客户端角色为TM,作为协调者;普通数据库角色为RM,作为执行者,回滚或提交。


        这里有一个疑问,在Oracle中,我们经常会跨Oracle库使用dblink,在对两库联查时,会惊奇的发现两个数据库的scn变一致了,在这里可以理解其具有全局事务的能力。这是可以实现读一致性的能力的。MySQL数据库跨库的xa事务并没有看到有这样的功能,那是不是可以理解必须借助外在全局事务才能达到这样的效果?


3. 管理能力

        几乎所有的数据库中间件只是单独的维护其产品本身,不会涉及到底层普通数据库的高可用管理、备份管理等等。而本身的管理,也局限在配置文件的配置,且能实现自身高可用的又很少,监控能力也多不足。并不具备完整的企业生产能力,如果要增加这些功能,需要额外的开发。


        现阶段,业界达成的共识是,作为一个分布式数据库,应该具备的模块包括:CN/DN/GTM/其他,CN作为计算层,具有调度,路由等能力,DN作为存储层,具有数据持久化,高可用等能力,GTM/其他,作为管理层,具有事务管理、运维管控等能力。


        在看数据库中间件,如果要和业界达成共识的分布式数据库对标,可以作为CN的角色,普通数据库可作为DN的角色。实际所欠缺的还很多。也因此其无法作为独立的分布式数据库产品而存在,只能当做一个时代的过度产品。实际上,我们也不能说其现在一无是处了,针对于传统数据库单库支撑确实吃紧,业务逻辑又简单,采用数据库中间件方案,不仅可以为企业带来更低的改造成本,也可降低运维的难度。