为什么需要分库分表,如何实现?

本文我们主要讲解“为什么需要分库分表,如何实现”。

在前文中讲到了读写分离,读写分离优化了互联网读多写少场景下的性能问题,考虑一个业务场景,如果读库的数据规模非常大,除了增加多个从库之外,还有其他的手段吗?

方法总比问题多,实现数据库高可用,还有另外一个撒手锏,就是分库分表,分库分表也是面试的常客,今天一起来看一下相关的知识。

分库分表的背景

互联网业务的一个特点就是用户量巨大,BAT等头部公司都是亿级用户,产生的数据规模也飞速增长,传统的单库单表架构不足以支撑业务发展,存在下面的性能瓶颈:

读写的数据量限制

数据库的数据量增大会直接影响读写的性能,比如一次查询操作,扫描 5 万条数据和 500 万条数据,查询速度肯定是不同的。

关于 MySQL 单库和单表的数据量限制,和不同的服务器配置,以及不同结构的数据存储有关,并没有一个确切的数字。这里参考阿里巴巴的《Java 开发手册》中数据库部分的建表规约:

单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。

基于阿里巴巴的海量业务数据和多年实践,这一条数据库规约,可以认为是数据库应用中的一个最佳实践。也就是在新业务建表规划时,或者当前数据库单表已经超过对应的限制,可以进行分库分表,同时也要避免过度设计。因为分库分表虽然可以提高性能,但是盲目地进行分库分表只会增加系统的复杂度。

数据库连接限制

数据库的连接是有限制的,不能无限制创建,比如 MySQL 中可以使用 max_connections 查看默认的最大连接数,当访问连接数过多时,就会导致连接失败。以电商为例,假设存储没有进行分库,用户、商品、订单和交易,所有的业务请求都访问同一个数据库,产生的连接数是非常可观的,可能导致数据库无法支持业务请求。

使用数据库连接池,可以优化连接数问题,但是更好的方式是通过分库等手段,避免数据库连接成为业务瓶颈。

除了这些,如果不进行数据库拆分,大量数据访问都集中在单台机器上,对磁盘 IO、CPU 负载等都会产生很大的压力,并且直接影响业务操作的性能。

分库分表原理

分库分表,顾名思义,就是将原本存储于单个数据库上的数据拆分到多个数据库,把原来存储在单张数据表的数据拆分到多张数据表中,实现数据切分,从而提升数据库操作性能。分库分表的实现可以分为两种方式:垂直切分和水平切分。

垂直切分

垂直拆分一般是按照业务和功能的维度进行拆分,把数据分别放到不同的数据库中。

image

垂直分库针对的是一个系统中对不同的业务进行拆分,根据业务维度进行数据的分离,剥离为多个数据库。比如电商网站早期,商品数据、会员数据、订单数据都是集中在一个数据库中,随着业务的发展,单库处理能力已成为瓶颈,这个时候就需要进行相关的优化,进行业务维度的拆分,分离出会员数据库、商品数据库和订单数据库等。

垂直分表是针对业务上的字段比较多的大表进行的,一般是把业务宽表中比较独立的字段,或者不常用的字段拆分到单独的数据表中。比如早期的商品表中,可能包含了商品信息、价格、库存等,可以拆分出来价格扩展表、库存扩展表等。

水平切分

水平拆分是把相同的表结构分散到不同的数据库和不同的数据表中,避免访问集中的单个数据库或者单张数据表,具体的分库和分表规则,一般是通过业务主键,进行哈希取模操作。

例如,电商业务中的订单信息访问频繁,可以将订单表分散到多个数据库中,实现分库;在每个数据库中,继续进行拆分到多个数据表中,实现分表。路由策略可以使用订单 ID 或者用户 ID,进行取模运算,路由到不同的数据库和数据表中。

image

分库分表后引入的问题

下面看一下,引入分库分表后额外增加了哪些系统设计的问题。

  • 分布式事务问题

对业务进行分库之后,同一个操作会分散到多个数据库中,涉及跨库执行 SQL 语句,也就出现了分布式事务问题。

比如数据库拆分后,订单和库存在两个库中,一个下单减库存的操作,就涉及跨库事务。关于分布式事务的处理,我们在专栏“分布式事务”的模块中也介绍过,可以使用分布式事务中间件,实现 TCC 等事务模型;也可以使用基于本地消息表的分布式事务实现。如果对这部分印象不深,你可以回顾下前面讲过的内容。

  • 跨库关联查询问题

分库分表后,跨库和跨表的查询操作实现起来会比较复杂,性能也无法保证。在实际开发中,针对这种需要跨库访问的业务场景,一般会使用额外的存储,比如维护一份文件索引。另一个方案是通过合理的数据库字段冗余,避免出现跨库查询。

  • 跨库跨表的合并和排序问题

分库分表以后,数据分散存储到不同的数据库和表中,如果查询指定数据列表,或者需要对数据列表进行排序时,就变得异常复杂,则需要在内存中进行处理,整体性能会比较差,一般来说,会限制这类型的操作。具体的实现,可以依赖开源的分库分表中间件来处理,下面就来介绍一下。

分库分表中间件实现

业务中实现分库分表,需要自己去实现路由规则,实现跨库合并排序等操作,具有一定的开发成本,可以考虑使用开源的分库分表中间件。这里比较推荐 Apache ShardingSphere,另外也可以参考淘宝的 TDDL 等。

其中,ShardingSphere 的前身是当当开源的 Sharding-JDBC,目前更名为 ShardingSphere,并且已经加入 Apache 基金会。ShardingSphere 在 Sharding-JDBC 的基础上,额外提供了 Sharding-Proxy,以及正在规划中的 Sharding-Sidecar。其中 Sharding-JDBC 用来实现分库分表,另外也添加了对分布式事务等的支持。关于 ShardingSphere 的具体应用,感兴趣的同学可以去浏览 《ShardingSphere 用户手册》。

另一款 TDDL(Taobao Distributed Data Layer)是淘宝团队开发的数据库中间件,用于解决分库分表场景下的访问路由,TDDL 在淘宝大规模应用,遗憾的是开源部分还不太完善,社区已经很长时间都没有更新,可以在 TDDL 项目仓库了解更多的信息。

总结

本文分享了分库分表相关的知识点,包括分库分表的业务背景,水平切分和垂直切分的不同方式,分库分表以后增加的系统复杂性问题,以及可以使用哪些开源的分库分表中间件解决对应问题。

你可以考察下目前项目里是否有应用分库分表,以及是如何实现分库分表,比如自研或者使用开源组件,并且留言分享。

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

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

相关文章

爬虫 scrapy ——scrapy shell调试及下载当当网数据(十一)

目录 一、scrapy shell 1.什么是scrapy shell? 2.安装 ipython 3.使用scrapy shell 二、当当网案例 1.在items.py中定义数据结构 2.在dang.py中解析数据 3.使用pipeline保存 4.多条管道的使用 5.多页下载 参考 一、scrapy shell 1.什么是scrapy shell&am…

行业锦囊|住建厅CA证书使用指南

数字化、高效率、低成本已成为企业发展转型的重要考量因素,建筑工程企业也不例外。而工程资料签署和管理又是每个建筑工程企业发展转型绕不开的课题:在建工程项目异地盖章周期性长、庞大的签署量及海量的文件管理如何优化;企业如何缩短对公业…

AXURE地图获取方法

AXURE地图截取地址 https://axhub.im/maps/ 1、点击上方地图或筛选所需地区的地图,点击复制到 Axure 按钮,到 Axure 粘贴就可以了 2、复制到 Axure 后,转化为 svg 图形,就可以随意更改尺寸/颜色/边框,具体操作如下&am…

【AI美图】第01期效果图,AI人工智能无绘画,美图欣赏

人工智能被各大平台传递,我也来凑一下热闹,放一组基础图片展示 介绍一下模型来源Stability AI: Stability AI直接将模型开源,且方式之粗暴,几乎完全不对生成内容做任何审核或者过滤。目前发布的稳定版本仅包含部分关…

ProcessOn基本介绍和完成案列和自定义元件

ProcessOn基本介绍和完成案列和自定义元件 1.什么是ProcessOn2.初步使用ProcessOn3.使用ProcessOn完成医疗项目门诊模块的流程图4.使用ProcessOn完成医疗项住院模块的流程图5.使用ProcessOn完成医疗项目药房模块的流程图5.使用ProcessOn完成会议oa模块的流程图6.自定义原件库1.…

设计表单表格组件

前言 什么是表单表格呢?简单来说就是在一个表格里面进行表单操作,执行增删改查。这在一些后台管理系统中是尤为常见的。 今天我们根据vue2 element-ui来设计一个表单表格组件。(不涉及完整代码,想要使用完整功能可以看底部连接…

超级计算机行业分析:中国市场概念及发展现状研究

近年来,在技术研发和产业应用的共同推动下,中国超级计算机(简称“超算”)快速发展——技术创新方面,采用自主研发芯片的多个国内超算曾在世界超算榜单上排名第一;整体规模方面,在最新发布的全球超算榜单中,中国占比超过…

<博图> 浮点数(real)相加时结果不精确的解决方法

问题截图: 每按下一次按钮,浮点数1 加0.1,结果放在浮点数1中;在加到第8次时会多出小数点位数。 解决方法: 对要进行相加的浮点数进行转换,如下 : (注:如果图片模糊保存…

流程图、泳道图的介绍和示例分享,以及自定义元件库的介绍

目录 一. 流程图介绍 二. Processon使用 新建一个流程图 图形的使用 三. 流程图示例 登录界面 门诊业务流程图 住院业务流程图 药房业务流程图 会议OA流程图 四. 泳道图介绍 五. 自定义元件库 5.1 新建一个元件库 5.2 创建元件 5.3 使用自定义元件库 一. 流程图介…

四六级高频词组9

目录 词组 其他链接 词组 351. be guilty of 犯有…罪或过失 352. be in the habit of 习惯于 353. break off (a habit) 改掉(某种习惯) 354. break sb. of (a habit)使某人改掉(某习惯&a…

UI自动化Selenium 测试报告BeautifulReport使用及修改

一、BeautifulReport安装 pip安装 pip install BeautifulReport Pycharm中安装 二、原生报告样式 原生报告,因为我使用ddtunittest数据驱动模式,所以Excel中所有参数都会被拼接出来,导致测试方法里面有太多不需要展示的内容; …

关于impdp导入时候索引是否使用了并行了?

关于impdp导入时候索引是否使用了并行的问题,不是看sqlfile,而是看实际worker 参看:Impdp Parallel Index Creation Always Creates Indexes with Degree 1 (Doc ID 1289032.1) Oracle Database - Enterprise Edition - Version …

JavaScript如果实现一段文字的高亮显示

JavaScript实现将一段文字检索高亮显示,效果如下: 实现方法:调用highlight函数 highlight("JavaScript如果实现一段文字的高亮显示", "高亮")实战代码实现: function highlight(value, search)

android studio 创建按钮项目

1&#xff09;、新建一个empty activity项目&#xff0c;切换到project视图&#xff1a; 2&#xff09;、修改app\src\main\res\layout\activity_main.xml文件&#xff0c;修改后如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <andr…

人机融合与意图理解

人机融合本质上是人类智能与机器自动化之间的协同。 人机融合的目标是利用人类智能和机器自动化的优势&#xff0c;使二者相互补充、相互支持&#xff0c;共同实现更高效、更智能的工作和生活方式。 人类智能和机器自动化具有不同的特点和优势。人类智能具有创造性、灵活性、推…

B站武sir-django教程(2)

day16 Django开发 主题&#xff1a;员工管理系统 1.新建项目 2.创建app python manage.py startapp app01注册app&#xff1a; 3.设计表结构&#xff08;django&#xff09; from django.db import modelsclass Department(models.Model):""" 部门表 "&…

38.如何让自动注入找到多个依赖Bean时不报错

1、引言 当我们从 Spring 容器中“拉”取一个 Bean 回来的时候&#xff0c;可以按照名字去拉取&#xff0c;也可以按照类型去拉取&#xff0c;按照 BeanName 拉取的话&#xff0c;一般来说只要 BeanName 书写没有问题&#xff0c;都是没问题的。但是如果是按照类型去拉取&…

四六级高频词组8

目录 词组 其他链接 词组 301. in fashion&#xff08;stylish&#xff0c; most modern&#xff09;时兴&#xff0c;流行 302. after the fashion &#xff08;of&#xff09; 依照… 303. find fault with&#xff08;complain about&#xff1b;criticize&#xff09;找…

Spring Bean基础

写在最前面: 本文运行的示例在我github项目中的spring-bean模块&#xff0c;源码位置: spring-bean 前言 为什么要先掌握 Spring Bean 的基础知识&#xff1f; 我们知道 Spring 框架提供的一个最重要也是最核心的能力就是管理 Bean 实例。以下是其原因&#xff1a; 核心组件…

Nginx(四层+七层代理)+Tomcat实现负载均衡、动静分离

一、Tomcat多实例部署 具体步骤请看我之前的博客 写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/134956765?spm1001.2014.3001.9457 1.1 访问测试多实例的部署 1.2 分别在三个tomcat服务上部署jsp的动态页面 mkdir /usr/local/tomcat/webapps/test vim …
最新文章