数据库中间件漫谈——看看云时代,它会走向何方

来源 | 阿丸笔记

封图| CSDN 下载于视觉中国

前言

随着业务的发展,MySQL数据库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作的开销也会越来越大;另外,无论怎样升级硬件资源,单台服务器的资源(CPU、磁盘、内存、网络IO、事务数、连接数)总是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。

分表、分库和读写分离可以有效地减小单台数据库的压力。

而数据库中间件,也火了很长一段时间,基本上每个大厂都会自研一套。

本文主要针对业界主流的数据库中间件的实现、功能、成本等方面进行对比,总结数据库中间件的实现方式,并展望未来的可能发展。

实现方式

一般来说,对于数据库中间件,可以在以下六个层次做切入。

2.1 代码层

在同一个项目中创建多个数据源,采用if else的方式,直接根据条件在代码中路由。

Spring中有动态切换数据源的抽象类,具体参见AbstractRoutingDataSource。

如果项目不是很庞大,使用这种方式能够快速的进行分库。但缺点也是显而易见的,这种海量的代码侵入是绝不能被接受的。

而且当查询结果返回时,需要对跨库、聚合等查询结果进行归并,开发工作量非常巨大。

这种方式了解一下即可,一般不会去使用。

2.2 框架层

主要是修改或增强现有ORM框架的功能,在SQL中增加一些自定义原语或者hint来实现。

常见的比如实现一些拦截器(比如Mybatis的Interceptor接口),增加一些自定义解析来控制数据的流向,效果虽然较好,但会改变一些现有的编程经验。

这种情况适合公司ORM框架统一的情况,但在很多情况下不太现实。

而且大部分情况下要修改框架源码,因此,也不推荐。

2.3 驱动层

无论是从代码层还是框架层做处理,都是高侵入、难维护的。

因此,常见的数据库中间件,至少需要从驱动层开始,我们可以理解为一个smart-client。

什么意思是smart-client呢?

通常smart-client是在连接池或者driver的基础上进行了一层封装。

这个smart-client内部可以与不同的数据库建立连接。

服务需要查询的sql,就交给smart-client进行解析、优化,然后发送给具体的数据库进行操作。

例如在读写分离情况下,smart-client会选择sql走从库还是主库;在分库分表的情况下,进行sql解析、sql改写等操作,然后路由到不同的分库,将得到的结果进行合并,返回给应用。

我们熟知的TDDL、Sharding-JDBC等,都是在此层切入。

优点:

1)实现方便,业务无入侵。smart-client不需要实现客户端通信协议,只需要在数据数据库厂商提供的不同语言的数据库驱动上做封装即可。例如mysql针对java语言提供了mysql-connector-java驱动,针对python提供了mysql-connector-python驱动。

2)天然去中心化。smart-client以sdk的方式被应用引入,然后部署到不同的服务节点上,不需要有代理层proxy。因此相较于代理方式而言,不需要考虑高可用的问题。只要应用的节点没有全部宕机,就可以访问数据库。(这里的高可用是相比代理层proxy而言,数据库本身的高可用还是需要保证的)

缺点:

1)通常仅支持某一种语言。例如tddl、zebra、sharding-jdbc都是使用java语言开发,因此对于使用其他语言的用户,就无法使用这些中间件。如果其他语言要使用,那么就要开发多语言客户端。

2)版本升级困难。因为应用使用数据源代理就是引入一个jar包的依赖,在有多个应用都对某个版本的jar包产生依赖时,一旦这个版本有bug,所有的应用都需要升级。而数据库代理升级则相对容易,因为服务是单独部署的,只要升级这个代理服务器,所有连接到这个代理的应用自然也就相当于都升级了。

3)去中心化的缺点,比如无法做全局的sql限流

2.4 代理层

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

像MySQL Router、MyCat、ShardingSphere(proxy模式)等,都是在此层切入。

优点:

1)多语言支持。也就是说,不论你用的php、java或是其他语言,都可以支持。以mysql数据库为例,如果proxy本身实现了mysql的通信协议,那么你可以就将其看成一个mysql 服务器,因此不同语言的开发者都可以使用mysql官方提供的对应的驱动来与这个代理服务器建通信。

2)对业务开发同学透明。由于可以把proxy当成mysql服务器,理论上业务同学不需要进行太多代码改造,既可以完成接入。

缺点:

1)实现复杂。因为proxy需要实现被代理的数据库server端的通信协议,实现难度较大。

2)proxy本身需要保证高可用。由于应用本来是直接访问数据库,现在改成了访问proxy,意味着proxy必须保证高可用。否则,数据库没有宕机,proxy挂了,导致数据库无法正常访问,就尴尬了。

3)租户隔离。可能有多个应用访问proxy代理的底层数据库,必然会对proxy自身的内存、网络、cpu等产生资源竞争,proxy需要需要具备隔离的能力。

2.5 Sidecar

Sharding-Sidecar是ShardingSphere的第三个产品,目前仍然在规划中。定位为Kubernetes或Mesos的云原生数据库代理,以DaemonSet的形式代理所有对数据库的访问。

通过无中心、零侵入的方案提供与数据库交互的的啮合层,即Database Mesh,又可称数据网格。Database Mesh的关注重点在于如何将分布式的数据访问应用与数据库有机串联起来,它更加关注的是交互,是将杂乱无章的应用与数据库之间的交互有效的梳理。使用Database Mesh,访问数据库的应用和数据库终将形成一个巨大的网格体系,应用和数据库只需在网格体系中对号入座即可,它们都是被啮合层所治理的对象。

优点:

分布式云原生的数据库中间件模式,集成了jdbc和proxy各自的优点,能满足高可用、跨语言、无感知升级等多种优势特性

缺点:

需要整体架构支持云原生体系

目前还没正式上线。

2.6 存储层

这个层次实际上不应该叫数据库中间件了,需要更换存储。

比如Aurora、polardb、tidb等分布式数据库,通过计算节点和存储节点分离,计算节点scale up,存储节点scale out的理念将公有云的关系数据库产品推向了一个新的高度。

这样一来,实际上已经不再需要传统的数据库中间件了,一切问题天然就不存在了。

功能对比

从上文可以了解到,目前最主流的数据库中间件主要是从驱动层smart-client和代理层proxy切入的。

下面,我们来了解下业界主流的中间件产品在这两个层次的站队情况与实现的功能对比。

其他还有比如:

Atlas、Kingshard、DBProxy、mysql router、MaxScale、58 Oceanus、ArkProxy、Ctrip DAL、Tsharding、Youtube vitess、网易DDB、Heisenberg、proxysql、Mango、DDAL、Datahekr、MTAtlas、

我们可以看到,基本各个大厂都撸过一遍自己的中间件产品。不过目前开源而且比较火的已经不多了,主要还是以shardingsphere为主。

我们从功能维度,来对比一下几个产品。

展望

从上文的分析可以看出,尽管目前主流的数据库中间件还是在smart-client和proxy两个层面进行处理的,但是,已经能看到未来的方向了。云原生的到来,数据库中间件也会拥抱变化。

一方面是作为sidecar的模式,可能会有一个新的阶段,比如shardingsphere推出sidecar模式后。

而另一方面,云数据库通过全新的计算存储分离的架构方式,打破传统关系型数据库的性能瓶颈,传统数据库中间件将不再需要关注,一切都将以数据库基础设施的形式提供给使用者。

推荐阅读:还不知道 AWS 是什么?这 11 个重点带你认识 AWS !
数据库连接池的原理没你想得这么复杂
为什么程序员如此“嫌弃”主干开发模式?
智能合约编写之 Solidity 的设计模式
2020年,5种将死的编程语言
我去,同事居然用明文存储密码!!!
真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

即插即用,基于阿里云Ganos快速构建云上开源GIS方案

对于轻量级GIS应用,选择具备时空能力的云上数据库再搭配开源GIS软件,能够快速构建稳定、廉价、实用的GIS解决方案。Ganos是阿里云自研时空基础设施(PaaS层)的核心引擎,该引擎整合了云上异构计算并行加速、OSS大规模存储…

Knative 初体验:Serving Hello World

通过前面两章的学习你已经掌握了很多 Knative 的理论知识,基于这些知识你应该对 Knative 是谁、它来自哪里以及它要做什么有了一定的认识。可是即便如此你可能还是会有一种犹抱琵琶半遮面,看不清真容的感觉,这就好比红娘拿姑娘的 100 张生活照…

Java-if选择结构

if单选择结构 if双选择结构 if多选择结构 嵌套if结构 https://www.bilibili.com/video/BV12J41137hu?p36&spm_id_frompageDriver

数据仓库介绍与实时数仓案例

1.数据仓库简介 数据仓库是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策…

优酷背后的大数据秘密

在本文中优酷数据中台的数据技术专家门德亮分享了优酷从Hadoop迁移到阿里云MaxCompute后对业务及平台的价值。 本文内容根据演讲视频以及PPT整理而成。 大家好,我是门德亮,现在在优酷数据中台做数据相关的事情。很荣幸,我正好见证了优酷从没…

从提取层、处理层、基础结构入手,带你了解Spark和Kafka!

作者 | Jaskaran S. Puri译者 | 火火酱 责编 | 徐威龙封图| CSDN 下载于视觉中国电子商务市场中典型的一天是这样的:每分钟发生1万个事件流,并且要选择合适的工具对其进行处理。本文将帮助你重新创建一个场景,其中有大量的数据流入&#xff0…

Java-switch选择结构

基本类型 public class SwitchDemo01 {public static void main(String[] args) {// case 穿透char grade B;switch (grade) {case A:System.out.println("优秀");break;case B:System.out.println("良好");break;case C:System.out.println("及格&…

高性能服务器架构思路【不仅是思路】

在服务器端程序开发领域,性能问题一直是备受关注的重点。业界有大量的框架、组件、类库都是以性能为卖点而广为人知。然而,服务器端程序在性能问题上应该有何种基本思路,这个却很少被这些项目的文档提及。本文正式希望介绍服务器端解决性能问…

v-if v-show区别(面试题)

v-if、v-show顾名思义就是用来判断视图层展示效果的,在Vue中文社区说明文档的介绍有: 相同点: v-if与v-show都可以动态控制dom元素显示隐藏 不同点: 1.v-if :可以根据表达式的值在DOM中生成或移除一个元素。 v-show:可…

专访世界顶级游戏背后的男人

‍作者 | 华为云和TA的朋友们封图| CSDN 下载于视觉中国如今,对于网易不鸣工作室CEO王希来说,团队的代表作《战意》已经获得阶段性成功。但不为人知的是,从下定决心要做世界顶级游戏,到这款作品萌生想法,再到正式公测&…

Java-While循环

public class WhileDemo01 {public static void main(String[] args) {// 输出 1 ~ 100int i 0;while (i<100) {i;System.out.println(i);}// 计算 1234...100&#xff1f;int j 0;int sum 0;while (j<100){sum sum j;j;}System.out.println(sum); // 5050} }https…

如何将深度学习训练速度提升一百倍?PAISoar 来了

阿里妹导读&#xff1a;得力于数据规模增长、神经网络结构的演进和计算能力的增强&#xff0c;深度学习的图像处理、语音识别等领域取得了飞速发展。随着训练数据规模和模型复杂度的不断增大&#xff0c;如何充分利用分布式集群的计算资源加快训练速度&#xff0c;提升业务支持…

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause 的问题 MySQL

show variables like "sql_mode"; set sql_mode; set sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES;

破解面试难题8个角度带你解读SQL面试技巧!

作者 | Xinran Waibel译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国SQL是用于数据分析和数据处理的最重要的编程语言之一&#xff0c;因此SQL问题始终是与数据科学相关工作&#xff08;例如数据分析师、数据科学家和数据工程师&#xff09;面试过程中的一部分。 SQ…

一文读懂架构整洁之道(附知识脉络图)

程序的世界飞速发展&#xff0c;今天所掌握的技能可能明年就过时了&#xff0c;但有一些东西是历久弥新&#xff0c;永远不变的&#xff0c;掌握了这些&#xff0c;在程序的海洋里就不会迷路&#xff0c;架构思想就是这样一种东西。 本文是《架构整洁之道》的读书笔记&#xf…

python获取视频时长方法

1.使用subprocess和re import re import subprocess video r"work/train/video/a8b96f016a28d8f3836f7cbb7734ecde.mp4" import subprocessdef get_length(filename):result subprocess.run(["ffprobe", "-v", "error", "-sho…

阿里敏捷教练全面解析淘宝直播敏捷实践之路

背景介绍 阿里很少提敏捷转型或DevOps&#xff0c;阿里是强业务驱动的&#xff0c;不管用什么办法&#xff0c;一定要达到业务目标。 我来自敏捷教练团队&#xff0c;我们的职责是帮助团队拿结果。这里的团队不限于研发团队&#xff0c;我现在支持的团队包括销售团队和产品运…

int默认值为0,Integer默认值为null

前提概要 Java为每个原始类型提供了封装类&#xff0c;Integer是java为int提供的封装类。 int的默认值为0&#xff0c;而Integer的默认值为null&#xff0c;即Integer可以区分出未赋值和值为0的区别&#xff0c;int则无法表达出未赋值的情况。 代码示例 public class…

GitHub 接连封杀开源项目惹众怒,CEO 亲自道歉!

作者 | 唐小引头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;王坚博士曾经做过这样一个非常形象的比喻&#xff0c;他将做 App 比作是在别人的花园里弄盆栽&#xff0c;「种点花草是没有问题的」&#xff0c;不过「别人叫你的产品下架你…

一键托管,阿里云全链路追踪服务正式商用:成本仅自建1/5或更少

随着互联网架构的扩张&#xff0c;分布式系统变得日趋复杂&#xff0c;越来越多的组件开始走向分布式化&#xff0c;如微服务、消息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用&#xff0c;这些组件共同构成了繁杂的分布式网络。 在一次800多人的开发者调研中&…