什么是分库分表?代表性框架有哪些?

在互联网系统开发过程中,所谓的分库分表并不是一个新概念。或者说,对于很多开发人员而言,说起分库分表,大家都或多或少有所了解,也都知道数据量大了就需要进行分库分表。但是究竟如何实现分库分表呢?

要想回答“如何让分库分表真正落地?”这个问题,我们先从一个典型的案例说起。试想在一个电商系统中,势必存在订单表。系统在初始运行期间,我们一般使用单库和单表的方式来存储和访问数据。因为数据量不大,所以数据库访问的瓶颈并不明显。

随着业务的演进,当需要支撑大规模电商业务时,系统每天可能会生成数十万甚至百万级别的订单数据。随着数据量越来越大,订单表的访问就会出现瓶颈。

以互联网系统中常用的MySQL数据库为例,虽然单表可以存储的数据原则上可以达到亿条级别,但这时候访问性能就会变得很差。即使采用各种调优策略,通常效果也微乎其微。业界普遍认为,MySQL单表容量在1千万以下是一种最佳状态,一旦超过这个量级,就需要考虑采用其他方案。

既然以MySQL为代表的关系型数据库中的单表无法支持大数据量存储和访问方案,我们自然而言可能想到是否可以采用诸如MongoDB等NoSQL的方式来管理数据呢?我们认为这并不是一个很好的选项。原因有很多,一方面关系型生态系统非常完善,关系型数据库经过几十年的持续发展,具有NoSQL所无法比拟的稳定性和可靠性。同时,关系型数据库的事务特性也是其他数据存储工具所不具备的一项核心功能。目前绝大部分公司的核心数据都是存储在关系型数据库中,就互联网公司而言,MySQL是主流的数据存储方案。

现在,我们选择了关系型数据库,那么就可以考虑采用分库分表的方案来解决单表瓶颈问题,这是目前互联网行业处理海量数据的通用方法。分库分表方案更多的是对关系型数据库数据存储和访问机制的一种补充,而不是颠覆。那么究竟什么是分库分表呢?

什么是数据分库分表?

分库和分表是两个概念,但通常我们会把它们合在一起简称为分库分表。所谓分库分表,业界并没有一个统一的定义,我们可以简单理解为:为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库,将原来数据量大的表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变得足够小,从而达到提升数据库性能的效果。分库分表的表现形式也有很多种,我们来看一下。

分库分表包括分库和分表两个维度,在开发过程中,对于每个维度都可以采用两种拆分思路,即垂直拆分和水平拆分,如下图所示:


我们先来讨论垂直拆分的应用方式,相比水平拆分,垂直拆分相对比较容易理解和实现。在电商系统中,用户在打开首页时,往往会加载一些用户的性别、地理位置等基础数据。对于用户表而言,这些位于首页的基础数据显然访问频率要比那些用户的头像等数据更高。基于这两种数据的不同访问特性,我们可以把用户单表进行拆分,将访问频次低的用户头像等信息单独存放在一张表中,访问频次较高的用户信息单独放在另一张表中,如下所示:


由此可以,垂直分表的处理方式就是将一个表按照字段分成多表,每个表存储其中一部分字段。在实现上,我们通常会把头像等blob类型的大字段数据或热度较低的数据放在一张独立的表中。将经常需要组合查询的列放在一张表中也可以认为是分表操作的一种表现形式。

通过垂直分表能得到来一定程度的性能提升,但毕竟数据仍然位于同一个数据库中,也就将操作范围限制在一台服务器,每个表还是会竞争同一台服务器中的CPU、内存、网络IO等资源。基于这一考虑,在有了垂直分表之后,我们就可以进一步引入垂直分库。

对于前面介绍的场景,分表之后的用户信息同样还是跟其他的商品、订单信息存放在同一台服务器中。基于垂直分库思想,这时候,我们就可以把用户相关的数据表单独拆分出来,放在一个独立的数据库中,如下图所示:


上图的效果就是垂直分库。从定义上讲,垂直分库是指按照业务将表进行分类,然后分布到不同的数据库上。然后,每个库可以位于不同的服务器上,其核心理念是专库专用。而从实现上讲,垂直分库的实现很大程度上取决于业务的规划和系统边界的划分。比如说,用户数据的独立拆分就需要考虑到系统用户体系与其他业务模块之间的关联关系,而不是说简单的创建一个用户库即可。在高并发场景下,垂直分库能够一定程度的提升IO访问效率和数据库连接数,并降低单机硬件资源的瓶颈。

从前面的分析中我们不难明白,垂直拆分尽管实现起来比较简单,但并不能解决单表数据量过大这一核心问题。所以,现实中我们往往需要在垂直拆分的基础上添加水平拆分机制。例如,我们可以对用户库中的用户信息按照用户ID进行取模,然后分别存储在不同的数据库中,这就是水平分库的常见做法,如下所示:


可以看到,水平分库是把同一个表的数据按一定规则拆分到不同的数据库中,每个库同样可以位于不同的服务器上。这种方案往往能解决单库存储量及性能瓶颈,但由于同一个表被分配在不同的数据库,数据的访问需要额外的路由工作,因此大大提升了系统复杂度。这里所谓的规则实际上就是一系列的算法,常见的包括:

  1. 取模算法

取模的方式有很多,例如前面介绍的按照用户ID进行取模,当然也可以通过表的一列字段进行hash求值来进行取模

  1. 范围限定算法

范围限定也很常见,例如我们可以采用按年份、按时间等策略路由到目标数据库或表

  1. 预定义算法

所谓预定义,就是指事先规划好具体库或表的数量,然后直接路由到指定库或表中

按照水平分库的思路,我们也可以对用户库中的用户表进行水平拆分,效果如下所示。也就是说,水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中。


显然,系统的数据存储架构演变到现在已经非常复杂了。与拆分前的单库单表相比,现在我们面临着一系列具有挑战性的问题,例如:

  1. 如何对多数据库进行高效治理?
  2. 如何进行跨节点关联查询?
  3. 如何实现跨节点的分页和排序操作?
  4. 如何生成全局唯一的主键?
  5. 如何确保事务一致性?
  6. 如何对数据进行迁移等?

如果没有很好的工具来支持数据的存储和访问,那么数据一致性将很难得到保障,这就是各种分库分表开发框架的价值所在。

分库分表解决方案和代表框架

基于前面关于分库分表的讨论,我们可以抽象其背后的一个核心概念,这个概念就是分片(Sharding),即无论是分库还是分表,都是把数据划分成不同的数据片,并存储在不同的目标对象中。而具体的分片方式就涉及到实现分库分表的不同解决方案。

如果要列举业界关于分库分表的框架,我们发现实际上也有不少。这些框架显然并不是采用同一种解决方案。但通过分析这些框架在实现数据分片方案上的区别,我们也可以把它们分成三大类型,即客户端分片、代码服务器分片以及分布式数据库。

客户端分片

所谓客户端分片,相当于在在数据库的客户端就完成了分片规则的实现。显然,这种方式将分片管理的工作进行前置,客户端管理和维护着所有的分片逻辑,并决定每次SQL执行所对应的目标数据库和数据表。

客户端分片这一解决方案也有不同的表现形式,其中最为简单的方式就是应用层分片,也就是说在应用程序中直接维护着分片信息,效果如下图所示:


在具体实现上,我们通常会将分片规则的处理逻辑打包成一个公共JAR包,其他业务开发人员只需要在代码工程中引入这个JAR包即可。针对这种方案,因为没有独立的服务器组件,所以也不需要专门维护某一个具体的中间件。然而,这种直接在业务代码中嵌入分片组件的方法也有明显的缺点。一方面,因为分片逻辑侵入到了业务代码中,业务开发人员在理解业务的基础上还需要掌握分片规则的处理方式,增加了开发和维护成本。而且,一旦出现问题,也只能依赖业务开发人员通过分析代码来找到原因,而无法把这部分工作抽离出来让专门的中间件团队进行完成。

基于以上分析,客户端分片在实现上通常会进行进一步的抽象,把分片规则的管理工作从业务代码中剥离出来形成单独演进的一套体系。一种思路是重写JDBC协议,也就是说在JDBC协议层面嵌入分片规则。这样,业务开发人员还是使用与JDBC规范完全兼容的一套API来操作数据库,但这套API的背后却自动完成了分片操作,从而实现对业务代码的零侵入,效果如下:


这种解决方案的优势在于分片操作对于业务而言是完全透明的,从而一定程度上实现业务开发人员与数据库中间件团队在职责上的分离。这样,业务开发人员只需要理解JDBC规范就可以完成分库分表,开发难度以及代码维护成本得到降低。

对于客户端分片,典型的中间件包括阿里巴巴的TDDL以及Apache顶级项目ShardingSphere。因为TDDL并没有开源,所以我们无法判断其使用了哪种客户端分片方案。而对于ShardingSphere而言,它是重写JDBC规范以实现客户端分片的典型实现框架。

代理服务器分片

代理服务器分片的解决方案也比较明确,顾名思义,就是采用了代理机制,也就是说在应用层和数据库层之间添加一个代理层。有了代理层之后,我们就可以把分片规则集中维护在这个代理层中,并对外提供与JDBC兼容的API给到应用层。这样,应用层的业务开发人员就不用关心具体的分片规则,而只需要完成业务逻辑的实现,其效果如下所示:


显然,代理服务器分片的优点在于解放了业务开发人员对分片规则的管理工作,而缺点就是添加了一层代理层,所以天生具有代理所带来的一些问题,比方说因为新增了一层网络传输对性能所产生的影响。

对于代理服务器分片,常见的开源框架有阿里的Cobar以及民间开源社区的Mycat。而在ShardingSphere中,也添加了Sharding-Proxy模块来实现代理服务器分片。

分布式数据库 

在技术发展和演进的过程中,关系型数据库的一大问题在于缺乏分布式特性,也就说缺乏分布式环境下面对大数量、高并发访问的有效数据处理机制。举例来说,我们知道事务是关系型数据库的本质特征之一,但在分布式环境下,如果我们想要基于MySQL等传统关系型数据库来实现事务将面临巨大的挑战。

幸好,以TiDB为代表的分布式数据库的兴起赋予了关系型数据库一定程度的分布式特性。在这些分布式数据库中,数据分片以及分布式事务将是其内置的基础功能,对业务开发人员是透明的。业务开发人员只需要使用TiDB对外提供的JDBC接口,就像在使用MySQL等传统关系型数据库一样。

从这个角度讲,我们也可以认为ShardingSphere是一种分布式数据库中间件。它在提供标准化的数据分片解决方案之外,也实现了分布式事务和数据库治理功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创建Spring Boot项目及配置

目录 一、创建项目所需要的插件 1、安装插件 二、创建项目 三、创建项目所面临的常见问题。 1、IDEA不能识别 2、无效的发行版本 3、确认jar包是否下载成功 一、创建项目所需要的插件 1、安装插件 首先需要在IDEA插件里面搜索Spring,选择Spring Boot Helper…

什么是短信群发上行和下行

短信群发是一种广泛应用于商业和个人通信的技术,通过一次多条的方式,可以快速高效地传递信息。在实际的群发过程中,会涉及到上行和下行的概念。本文将详细介绍什么是短信群发上行和下行,并解释它们的应用。 什么是短信群发上行 群…

Dbeaver连接一段时间不操作后断开的问题

右键数据库连接点击编辑连接点击初始化将连接保持改成60s

BW4HANA混合建模 用ADSO的哪个视图?

写日志的ADSO除了1,2,3表之外。还会有6,7,8view。8view是上了BW4HANA2.0之后激活ADSO就会生成的。如果旧版本没有8,那就RSDG_ADSO_ACTIVATE激活一下。 如果勾了外部HANA视图,那就等于说还有一个HANA view。 首先咱知道ADSO是BW里面用来物理存储&#xf…

做一个属于自己的软件-pyside6快速上手教程

首先环境需要安装python3和pip,软件使用pycharm,安装也都很简单 首先需要安装pyside6,在终端执行: pip install pyside6 然后进入可视化编辑界面 pyside6-designer 进入后创建即可 可以从左侧点击鼠标拉组件进入到中间的工作区&#xff…

BLIP和BLIP2 论文讲解

文章目录 BLIPIntroductionMethod模型架构预训练目标字幕和过滤(Capfilt) BLIP2IntroductionMethod模型结构Q-Former预训练第一阶段Q-Former预训练第二阶段 BLIP 论文: 《BLIP: Bootstrapping Language-Image Pre-training for Unified Visio…

详解BOM编程

华子目录 BOM编程window对象常见的window对象的属性常见的window对象的方法注意 history对象history对象的属性history对象的方法 screen 对象navigator 对象属性方法 location对象属性方法示例 BOM编程 JavaScript本质是在浏览器中运行,所以JavaScript提供了BOM&a…

一文详解FDA邮件认证证书的重要性及其应用

随着全球化和电子商务的飞速发展,跨国贸易和沟通变得越来越频繁。在这个过程中,邮件作为重要的沟通工具,其安全性和可信度成为了各方关注的焦点。FDA(美国食品药品监督管理局)邮件认证证书就是在这一背景下应运而生的一…

1W 3KVDC 隔离 稳压单输出 DC/DC 电源模块——TPV-SAR 系列

TPV-SAR系列产品是专门针对PCB上分布式电源系统中需要与输入电源隔离且输出精度要求较高的电源应用场合而设计。该产品适用于;1)输入电源的电压变化≤5%;2)输入输出之前要求隔离电压≥3000VDC;3)对输出电压…

mac电脑如何安装java

1、检查当前系统的 Java 版本 打开终端,输入以下命令查看当前 Java 版本 /usr/bin/java -version 2、前往 Java 官网下载 Java JDK 打开 Java 官网 (https://www.java.com/zh-CN/download/) 并下载最新版本的 Java JDK。 3、安装 Java JDK 双击下载的 .dmg 文件启动安装程序…

【全开源】Java共享台信息共享系统源码

特色功能 信息整合与共享:该平台提供一站式信息整合服务,将各种类型的信息资源进行汇聚,方便用户快速查找和获取所需资源。多种共享功能:支持信息共享、共享车位、共享会议室、共享电动车等多种共享功能,提高资源利用…

Windows系统本地部署DrawDB数据库设计工具并实现无公网IP远程访问

文章目录 1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 开发中很多时候都会使用到数据库,所以选择一个好用的数据库设计工具会让工作效率翻倍。在当今数字化时代,数据库管理是许多企业和个人项目的核心。设…

vue-fontawesome-elementui-icon-picker选择icon框架

第一步:安装vue-fontawesome-elementui-icon-picker依赖 npm install vue-fontawesome-elementui-icon-picker --save-dev 第二步:main.js配置 (放在element ui引入之后) import iconPicker from vue-fontawesome-elementui-icon-picker; Vue.use(ico…

Python-VBA函数之旅-setattr函数

目录 一、setattr函数的常见应用场景 二、setattr函数使用注意事项 三、如何用好setattr函数? 1、setattr函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页: https://blog.csdn.net/ygb_1024?…

笨方法自学python(六)

上一节中出现了\n,这个作用是换行。\后面带不同字符有不同的作用,我们先简单了解几个, 使用反斜杠 \ (back-slash) 可以将难打印出来的字符放到字符串。针对不同的符号有很多这样的所谓“转义序列(escape sequences)”,我们来练习…

OPC :快速上手

本系列为OPC技术的快速上以及持续研究和技术实战专栏,将不定期更新。 本章节提供OPC系列技术博文的快速导航。 《OPC服务器简介和入门介绍》 《物联网平台如何为OPC服务器创造新生命力》 《OPC服务器开发之WtOPCSvr——开发文档(1)》 《OPC服…

使用flutter开发一个U盘文件管理APP,只解析图片文件

今天教大家用flutter撸一个U盘文件管理APP,需求是这样的: 当我在Android设备上插入U盘后,我能在APP中打开U盘的文件目录,并且能进入对应目录的下一级目录,如果下级目录下有图片文件,我就对这个图片文件进行解析,并展示出来。 需求了解后,先上个效果图: 效果图看完后,…

海外媒体发稿:7个出口贸易媒体发稿推广必备技巧-华媒舍

在如今全球化的经济环境中,出口贸易在各个国家的经济中占据了重要地位。作为出口贸易从业者,我们都明白推广产品和品牌对于成功开拓国际市场至关重要。而在推广方面,媒体发稿则是一种常见而有效的方式。本文将分享7个出口贸易媒体发稿推广的必…

Spark云计算平台Databricks使用,创建workspace和Compute计算集群(Spark集群)

Databricks,是属于 Spark 的商业化公司,由美国加州大学伯克利 AMP 实验室的 Spark 大数据处理系统多位创始人联合创立。Databricks 致力于提供基于 Spark 的云服务,可用于数据集成,数据管道等任务。 1 创建workspace 点击创建wor…

STM32F4xx开发学习_USART串口通讯

USART串口通讯 USART简介 USART(universal synchronous asynchronous receiver transmitter),通用同步异步接收发射机,是一种全双工异步通信串行通讯方式,是STM32内部集成的硬件外设,以帧格式传输数据。搭…