Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >究竟为什么要引入数据库中间件

究竟为什么要引入数据库中间件

作者头像
Java架构师必看
发布于 2021-09-26 07:19:30
发布于 2021-09-26 07:19:30
6790
举报
文章被收录于专栏:Java架构师必看Java架构师必看

不少朋友经常会问我以下问题:

  • 58到家有没有使用数据库中间件
  • 使用了什么数据库中间件,是自研,还是第三方
  • 怎么实现的,是基于客户端的中间件,还是基于服务端的中间件
  • 使用中间件后,join/子查询/集函数/事务等问题是怎么解决的

你是不是也有类似的疑问?

然而,“究竟为什么要引入数据库中间件”却很少有人问及。 “架构师之路”文章思路,以解决“为什么”为优先,借着近期撰写互联网分层架构系列文章,讲一讲这个核心问题:

  • 究竟为什么要引入数据库中间件

经过连续分层架构演进,DAO层基础数据服务通用业务服务化前后端分离之后,一个业务系统的后端结构如上:

  • web-view层通过http接口,从web-data获取json数据(前后端分离)
  • web-data层通过RPC接口,从biz-service获取数据(通用业务服务)
  • biz-service层通过RPC接口,从base-service获取数据(基础数据服务)
  • base-service层通过DAO,从db获取数据(DAO)
  • db存储数据

随着时间的推移,数据量会越来越大,base-service通过DAO来访问db的性能会越来越低需要开始考虑对db进行水平切分,一旦db进行水平切分,原来很多SQL可以支持的功能,就需要base-service层来进行特殊处理:

  • 有些数据需要路由到特定的水平切分库
  • 有些数据不确定落在哪一个水平切分库,就需要访问所有库
  • 有些数据需要访问全局的库,拿到数据的全局视野,到service层进行额外处理

更具体的,对于前台高并发的业务,db水平切分后,有这么几类典型的业务场景及应对方案。特别强调一下,此处应对的是“前台”“高并发”“db水平切分”的场景,对于后台的需求,将通过前台与后台分离的架构处理,不在此处讨论。

一:partition key上的单行查询

典型场景:通过uid查询user

场景特点

  • 通过patition key查询
  • 每次只返回一行记录

解决方案:base-service层通过patition key来进行库路由

如上图:

  • user-service底层user库,分库patition key是uid
  • uid上的查询,user-service可以直接定位到库

二、非patition key上的单行查询

典型场景:通过login_name查询user

场景特点

  • 通过非patition key查询
  • 每次只返回一行记录

解决方案1:base-service层访问所有库

如上图:

  • user-service通过login_name先查全库
  • 结果集在user-service再合并,最终返回一条记录

解决方案2:base-service先查mapping库,再通过patition key路由

如上图:

  • 新建mapping库,记录login_name到uid的映射关系
  • 当有非 patition key的查询时,先通过login_name查询uid
  • 再通过patition key进行路由,最终返回一条记录

解决方案3:基因法

关于“基因法”解决非patition key上的查询需求详见《分库后,非patition key上访问的多种解决办法》。

三、patition key上的批量查询

典型场景:用户列表uid上的IN查询

场景特点

  • 通过patition key查询
  • 每次返回多行记录

解决方案1:base-service层访问所有库,结果集到base-service合并

解决方案2:base-service分析路由规则,按需访问

如上图:

  • base-service根据路由规则分析,判断出有些数据落在库1,有些数据落在库2
  • base-service按需访问相关库,而不是访问全库
  • base-service合并结果集,返回列表数据

四、非patition key上的夸库分页需求

关于分库后,夸库分页的查询需求,详见《业界难题,夸库分页的四种方案》。

五、其他需求…

本文写到这里,上述一、二、三、四、五其实都不是重点,base-service层通过各种各样的奇技淫巧,能够解决db水平切分后的数据访问问题,只不过:

  • base-service层的复杂度提高了
  • 数据的获取效率降低了

当需要进行db水平切分的base-service越来越多以后,此时分层架构会变成下面这个样子:

底层的复杂性会扩散到各个base-service,所有的base-service都要关注:

  • patition key路由
  • 非patition key查询,先mapping,再路由
  • 先全库,再合并
  • 先分析,再按需路由
  • 夸库分页处理

这个架构图是不是看上去很别扭?如何让数据的获取更加高效快捷呢?

数据库中间件的引入,势在必行。

这是“基于服务端”的数据库中间件架构图:

  • base-service层,就像访问db一样,访问db-proxy,高效获取数据
  • 所有底层的复杂性,都屏蔽在db-proxy这一层

这是“基于客户端”的数据库中间件架构图:

  • base-service层,通过db-proxy.jar,高效获取数据
  • 所有底层的复杂性,都屏蔽在db-proxy.jar这一层

结论

数据库水平切分,base-service层获取db数据过于复杂,成为通用痛点的时候,就应该抽象出数据库中间件,简化数据获取过程,提高数据获取效率,向上游屏蔽底层的复杂性。

任何脱离业务的架构设计,都是耍流氓

“为什么”比“怎么样”更重要。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
假如让你来设计数据库中间件
13年底负责数据库中间件设计时的设计文档,拿出来和大家分享: 可以了解下数据库中间件技术 可以了解下架构师系统设计的思路 一、总体目标 数据库中间层项目背景不再展开,根据前期的调研以及和公司同事的讨论,中间层的核心目标主要有两个: db虚拟化:让db对业务线透明(本文的db均指mysql),业务线不再需要知道db的真实ip,port,主从关系,读写关系,高可用等 分库的支持:让db的分库对业务线透明 二、实现的功能 上述目标相对比较宽泛,具体来说,数据库中间层需要实现以下功能。 (1)统一接入入口 如果统一
架构师之路
2018/03/02
1.5K0
假如让你来设计数据库中间件
单KEY业务,数据库水平切分架构实践 | 架构师之路
提醒,本文较长,可提前收藏/转发。 本文将以“用户中心”为例,介绍“单KEY”类业务,随着数据量的逐步增大,数据库性能显著降低,数据库水平切分相关的架构实践: 如何来实施水平切分 水平切分后常见的问题 典型问题的优化思路及实践 一、用户中心 用户中心是一个非常常见的业务,主要提供用户注册、登录、信息查询与修改的服务,其核心元数据为: User(uid, login_name, passwd, sex, age, nickname, …) 其中: uid为用户ID,主键 login_name, passwd,
架构师之路
2018/03/01
1.1K0
单KEY业务,数据库水平切分架构实践 | 架构师之路
数据库中间件TDDL调研笔记
前篇: 《数据库中间件cobar调研笔记》 13年底负责数据库中间件设计时的调研笔记,拿出来和大家分享,轻拍。 一,TDDL是什么 TDDL是Taobao Distribute Data Layer的简称 淘宝一个基于客户端的数据库中间件产品 基于JDBC规范,没有server,以client-jar的形式存在 画外音:数据库中间件有基于服务端的,也有基于客户端的,TDDL属于后者;而cobar是一个中间层服务,使用mysql协议,属于前者。 二,TDDL不支持什么SQL 不支持各类join 不支持多表查询
架构师之路
2018/03/02
2.5K0
数据库中间件TDDL调研笔记
读写分离--美团数据库中间件DBProxy
好久没更博了,今天引用美团技术团队的一篇文章来给大家分享一款数据库中间件-美团DBProxy!
kl博主
2023/11/18
7630
数据库中间件为何不支持join
有网友对《假如让你来设计数据库中间件》一文中,数据库中间件仅仅支持四类SQL存有疑问: partition key普通查询 partition key上的IN查询 非partition key上的查询 有限功能的排序+分页查询 这四类SQL就能满足公司业务的需求么,这个结论是怎么来的? 看来《假如让你来设计数据库中间件》的架构结论并不能让刨根究底的网友们满意,于是把13年底,需求调研的过程细节也说一说,作为一个一线架构师,治学还是得严谨。 一、业务侧的分库后SQL需求 先说结论,通过初步的调研,发现58各
架构师之路
2018/03/02
8940
数据库中间件为何不支持join
数据库中间件cobar调研笔记
13年底负责数据库中间件设计时的调研笔记,拿出来和大家分享,轻拍。文章很长,可提前收藏,转发。 一,cobar是什么 开源的mysql的中间件服务 使用mysql协议 对上游,cobar就是传统mys
架构师之路
2018/03/02
1.8K0
数据库中间件cobar调研笔记
看完这篇高性能数据库集群架构文章,你能比大多数人知道得更多!
不管是为了满足业务发展的需要,还是为了提升自己的竞争力,关系数据库厂商(Oracle、DB2、MySQL 等)在优化和提升单个数据库服务器的性能方面也做了非常多的技术优化和改进。但业务发展速度和数据增长速度,远远超出数据库厂商的优化速度,尤其是互联网业务兴起之后,海量用户加上海量数据的特点,单个数据库服务器已经难以满足业务需要,必须考虑数据库集群的方式来提升性能。
iMike
2019/09/24
1.4K0
看完这篇高性能数据库集群架构文章,你能比大多数人知道得更多!
一款优秀数据库中间件的不完全解析
有一天,你去三亚玩耍,就想玩个冲浪,即时你不差钱,难道还要自己采买快艇、滑板等等装备来满足这为数不多的心血来潮么。租一个就行了嘛。这其实就是连接池的作用。
Coder的技术之路
2021/06/23
5260
一款优秀数据库中间件的不完全解析
数据库架构设计中,最重要的“基概”!!!
本文源自今年系统架构师大会,我在会上分享《数据库工程架构实践》的前3页PPT,数据库架构设计中的一些基本概念。 画外音:会上分享了近4个小时,见《十年》。
架构师之路
2020/03/23
4100
数据库架构设计中,最重要的“基概”!!!
揭秘Mycat数据库中间件:优化数据库操作的神奇之旅
数据库,就像是我们生活中的一本厚重的日记,记录着各种信息和故事。而在这个庞大的数据库世界中,有一位魔法师名叫Mycat。今天,我们将一同踏入这个神奇的领域,深入了解Mycat的原理和使用方法,让我们的数据库操作变得如丝般顺滑。
繁依Fanyi
2024/01/26
3991
为了给你们讲清楚数据库中间件有哪些,我也是拼了!
卖羊肉串首先就得有羊肉,于是我就联系了很多养殖场,我又是一个比较负责任的人,为了保证羊肉的质量,我就去考察了一家又一家养殖场,同时我也是个“小气”的人,所以我考察过程中,和对方谈判、比价,最终选了一个养殖场作为我的羊肉供应商,为我提供羊肉。
Java技术江湖
2019/12/27
1K0
为了给你们讲清楚数据库中间件有哪些,我也是拼了!
数据库分库分表思路
关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。
lyb-geek
2019/06/17
7250
mysql分布式数据库中间件对比mysql分布式数据库中间件对比
mysql分布式数据库中间件对比 目前数据库中间件有很多,基本这些中间件在下都有了解和使用,各种中间件优缺点及使用场景也都有些心的。所以总结一个关于中间件比较的系列,希望可以对大家有帮助。 什么是中间件 传统的架构模式就是 应用连接数据库直接对数据进行访问,这种架构特点就是简单方便。 但是随着目前数据量不断的增大我们就遇到了问题: 单个表数据量太大 单个库数据量太大 单台数据量服务器压力很大 读写速度遇到瓶颈 当面临以上问题时,我们会想到的第一种解决方式就是 向上扩展(scale up) 简单来说就
Albert陈凯
2018/04/08
3.1K0
mysql分布式数据库中间件对比mysql分布式数据库中间件对比
用户中心,1亿数据,架构如何设计?
用户中心,几乎是所有互联网公司,必备的子系统。随着数据量不断增加,吞吐量不断增大,用户中心的架构,该如何演进呢。
架构师之路
2020/07/16
5.2K0
开源数据库中间件-MyCa初探与分片实践
rpm -ivh MySQL-server-5.5.49-1.linux2.6.i386.rpm
蒋老湿
2019/07/31
7800
架构设计-数据库篇
之前我们讲过架构设计的一些原则,和架构设计的方法论,今天我们谈谈高性能数据库集群的设计与应用。
架构狂人
2023/08/16
3800
架构设计-数据库篇
分库分表,读写分离后,数据库中间件扮演了一个怎样的角色?
前面一篇文章图解分布式系统架构(看推荐阅读)大概讲了一下分库分表,以及读写分离出现的场景,分库分表为了解决高并发和海量数据的问题。
Java识堂
2019/08/13
5380
数据库中间件那些事儿
互联网当下的数据库拆分过程基本遵循的顺序是:垂直拆分、读写分离、分库分表(水平拆分)。每个拆分过程都能解决业务上的一些问题,但同时也面临了一些挑战。
涤生
2019/05/13
1.1K0
数据库中间件那些事儿
数据库中间件 - Mycat
随着时间的推移,数据的产生越来越多,软件系统对庞大数据的各种操作已经显得愈发困难,传统的关系型数据库已经无法满足快速查询与插入数据的需求。NoSQL通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,以此来获取性能上的提升,暂时缓解了这一危机。但是,有些数据操作场景是绝对需要有事务和安全性指标的,此时NoSQL是无法满足的,依然需要使用关系型数据库。 为了提高关系型数据库的查询性能,于是将一个数据库的数据分散到不同的数据库中存储,以抵抗高访问量高并发对数据库的压力,相当于对数据进行拆分操作并且做数据库集群。 如何拆分数据,同时让程序和数据库解耦,使数据的分片存储对于开发者来说完全透明,数据库中间件油然而生。
兜兜转转
2023/03/28
2.8K0
数据库中间件 - Mycat
数据库中间件
作者:[美]威廉·肯尼迪(William Kennedy)布赖恩·克特森(Brian
李海彬
2018/07/26
2.7K0
数据库中间件
相关推荐
假如让你来设计数据库中间件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档