分库分表的概念

2023-11-11

目录

一、分库分表有什么用

二、分库分表的方式

三、分库分表的缺点

四、什么时候需要分库分表

五、常见的分库分表组件

总结


在前面写了一篇关于MySQL主从集群的文章,而主从的作用,在我们开发角度更大的作用是作为读写分离的支持,也是学习ShardingSphere的重点。

分库分表就是业务系统将数据写请求分发到master节点,而读请求分发到slave节点的一种方案,可以大大提高整个数据库集群的性能。但是要注意,分库分表的一整套逻辑全部是由客户端自行实现的。而对于MySQL集群,数据主从同步是实现读写分离的一个必要前提条件。

一、分库分表有什么用

分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成 ,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目 的。

例如:微服务架构中,每个服务都分配一个独立的数据库,这就是分库。而对一些业务日志表,按月拆分成不同的表,这就是分表。

二、分库分表的方式

分库分表包含分库和分表 两个部分,而这两个部分可以统称为数据分片,其目的都是将数据拆分成不同的存储单元。另外,从分拆的角度上,可以分为垂直分片水平分片

垂直分片:

 按照业务来对数据进行分片,又称为纵向分片。他的核心理念就是专库专用。在拆分之前,一个数据库由多个数据表组成,每个表对应不同的业务。而拆分之后,则是按照业务将表进行归类,分布到不同的数据库或表中,从而将压力分散至不同的数据库或表。例如,下图将用户表和订单表垂直分片到不同的数据库。

垂直分片往往需要对架构和设计进行调整。通常来讲,是来不及应对业务需求快速变化的。而且,他也无法真正的解决单点数据库的性能瓶颈。垂直分片可以缓解数据量和访问量带来的问题,但无法根治。如果垂直分片之后,表中的数据量依然超过单节点所能承载的阈值,则需要水平分片来进一步处理。

水平分片:

又称横向分片。相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。例如,像下图根据主键结构分片。

常见的分片策略:

  • 取余\取模 : 优点 均匀存放数据,缺点 扩容非常麻烦。
  • 按照范围分片 : 比较好扩容, 数据分布不够均匀。
  • 按照时间分片 : 比较容易将热点数据区分出来。
  • 按照枚举值分片 : 例如按地区分片。
  • 按照目标字段前缀指定进行分区:自定义业务规则分片。

水平分片从理论上突破了单机数据量处理的瓶颈,并且扩展相对自由,是分库分表的标准解决方案。

一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案,在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库水平分表方案。

三、分库分表的缺点

虽然数据分片解决了性能、可用性以及单点备份恢复等问题,但是分布式的架构在获得收益的同时,也引入了非常多新的问题。

  • 事务一致性问题

原本单机数据库有很好的事务机制能够帮我们保证数据一致性。但是分库分表后,由于数据分布在不同库甚至不同服务器,不可避免会带来分布式事务问题。

  • 跨节点关联查询问题

在没有分库时,我们可以进行很容易的进行跨表的关联查询。但是在分库后,表被分散到了不同的数据库,就无法进行关联查询了。

这时就需要将关联查询拆分成多次查询,然后将获得的结果进行拼装。

  • 跨节点分页、排序函数

跨节点多库进行查询时,limit分页、order by排序等问题,就变得比较复杂了。需要先在不同的分片节点中将数据 进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序。

这时非常容易出现内存崩溃的问题。

  • 主键避重问题

在分库分表环境中,由于表中数据同时存在不同数据库中,主键值平时使用的自增长将无用武之地,某个分区数据 库生成的ID无法保证全局唯一。因此需要单独设计全局主键,以避免跨库主键重复问题。

  • 公共表处理

实际的应用场景中,参数表、数据字典表等都是数据量较小,变动少,而且属于高频联合查询的依赖表。这一类表一般就需要在每个数据库中都保存一份,并且所有对公共表的操作都要分发到所有的分库去执行。

  • 运维工作量

面对散乱的分库分表之后的数据,应用开发工程师和数据库管理员对数据库的操作都变得非常繁重。对于每一次数据读写操作,他们都需要知道要往哪个具体的数据库的分表去操作,这也是其中重要的挑战之一。

四、什么时候需要分库分表

在阿里巴巴公布的开发手册中,建议MySQL单表记录如果达到500W这个级别,或者单表容量达到2GB,一般就建议进行分库分表。而考虑到分库分表需要对数据进行再平衡,所以如果要使用分库分表,就要在系统设计之初就详细考虑好分库分表的方案,这里要分两种情况。

​一般对于用户数据这一类后期增长比较缓慢的数据,一般可以按照三年左右的业务量来预估使用人数,按照标准预设好分库分表的方案。

​而对于业务数据这一类增长快速且稳定的数据,一般则需要按照预估量的两倍左右预设分库分表方案。并且由于分库分表的后期扩容是非常麻烦的,所以在进行分库分表时,尽量根据情况,多分一些表。最好是计算一下数据增量,永远不用增加更多的表。

​另外,在设计分库分表方案时,要尽量兼顾业务场景和数据分布。在支持业务场景的前提下,尽量保证数据能够分得更均匀。

​最后,一旦用到了分库分表,就会表现为对数据查询业务的灵活性有一定的影响,例如如果按userId进行分片,那按age来进行查询,就必然会增加很多麻烦。如果再要进行排序、分页、聚合等操作,很容易就扛不住了。这时候,都要尽量在分库分表的同时,再补充设计一个降级方案,例如将数据转存一份到ES,ES可以实现更灵活的大数据聚合查询。

五、常见的分库分表组件

由于分库分表之后,数据被分散在不同的数据库、服务器。因此,对数据的操作也就无法通过常规方式完成,并且 它还带来了一系列的问题。好在,这些问题不是所有都需要我们在应用层面上解决,市面上有很多中间件可供我们选择。

  • shardingsphere

官网:https://shardingsphere.apache.org/index_zh.html

Sharding-JDBC是当当网研发的开源分布式数据库中间件,他是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和 数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。

  • mycat

官网:http://www.mycat.org.cn/

基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。业界优秀的开源项目和创新思路被广泛融入到MYCAT的基因中,使得MYCAT在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。

MyCAT虽然是从阿里的技术体系中出来的,但是跟阿里其实没什么关系。

  • DBLE

官网:https://opensource.actionsky.com/

该网站包含几个重要产品。其中分布式中间件可以认为是MyCAT的一个增强版,专注于MySQL的集群化管理。另外还有数据传输组件和分布式事务框架组件可供选择。


总结

在本章节主要介绍了分库分表相关的概念,作用,分库分表的方式,常见组件等基础知识,为下一节学习shardingsphere打下一个基础。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分库分表的概念 的相关文章

  • MySQL SELECT 输出同一行中每个 id 的下一个日期

    我查询的表结构如下 ID Date Before value After value 1 2014 04 25 Win Loss 1 2014 04 30 Loss Win 1 2014 08 18 Win Loss 1 2014 08 2
  • SQL统计高于和低于平均分的学生人数

    我在下面有一个示例表 我试图获取高于平均分数的学生人数和低于平均分数的学生人数 name subject classroom classarm session first term score first term grade std1 m
  • 如何使PHP中的激活链接过期?

    我有一个 php 脚本 它通过电子邮件向用户发送激活链接 以便他们可以激活他们的帐户 链接是这样的 mysite com activation phpid id 20 如何创建 24 小时后过期的链接 我还没有尝试过任何东西 因为我找不到任
  • MYSQL中收盘价的简单移动平均线计算和更新表

    我可以使用一些帮助 最好是虚拟指南 来更新下表 CREATE TABLE SYMBOL day date NOT NULL open decimal 8 3 DEFAULT NULL high decimal 8 3 DEFAULT NUL
  • 使用唯一索引删除重复项

    我在两个表字段 A B C D 之间插入 相信我已经在 A B C D 上创建了唯一索引以防止重复 然而我以某种方式简单地对这些做了一个正常的索引 因此插入了重复项 这是2000万条记录的表 如果我将现有索引从普通索引更改为唯一索引 或者只
  • 无法使用 Django 应用程序从容器连接到 MySQL docker 容器

    当我尝试从运行 Django 应用程序的 docker 容器连接到运行 MySQL 的容器时 出现以下错误 django db utils OperationalError 2003 Can t connect to MySQL serve
  • MySQL 服务器未启动

    当我做 mysql u root p并输入my password这就是我得到的 错误 2002 HY000 无法通过套接字 var run mysqld mysqld sock 连接到本地 MySQL 服务器 2 所以我输入 systemc
  • 单行的总和值?

    我有一个 MySQL 查询 它返回由一系列 1 和 0 组成的单行 它用于进度条指示器 我现在在代码中对它进行求和 但我尝试对查询中的值求和 并意识到我无法使用 SUM 因为它们有很多列 但只有一行 有没有办法可以在查询中自动求和 就像这样
  • 在 MacOSX10.6 上运行 python 服务器时 MySQLdb 错误

    运行我的服务器 python manage py runserver 产生以下错误 django core exceptions ImproperlyConfigured 加载 MySQLdb 模块时出错 没有名为 MySQLdb 的模块
  • 显示表 FULLTEXT 索引列

    我希望运行一个查询 该查询将返回表中全文索引的列列表 该表采用 MyISAM 格式 我将使用 php 来构建查询 理想情况下 我会运行查询 它会返回信息 以便我可以构造一个以逗号分隔的列字符串 例如 名 姓 电子邮箱 这在 MySQL 中可
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • Python:如何使用生成器来避免 sql 内存问题

    我有以下方法来访问 mysql 数据库 并且查询在服务器中执行 我无权更改有关增加内存的任何内容 我对生成器很陌生 并开始阅读更多有关它的内容 并认为我可以将其转换为使用生成器 def getUNames self globalUserQu
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • MySQL Connector/C++ 库链接错误问题

    PROBLEM 好吧 我一直在尝试遵循 MySQL Forge Wiki 和其他一些网站上的示例代码 这些网站提供了有关如何获得简单数据库连接的教程 但由于某种原因 我的项目总是因链接错误而失败 我可以我自己不明白为什么或如何解决它 我仍在
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • MySQL 查询计算上个月

    我想计算上个月的订单总额 我收到了从当前日期获取当月数据的查询 SELECT SUM goods total AS Total Amount FROM orders WHERE order placed date gt date sub c

随机推荐

  • std::enable_shared_from_this的原理及意义

    原文 https www cnblogs com lehoho p 9372195 html 和 https www jianshu com p 4444923d79bd enable shared from this是一个模板类 定义于头
  • 【实战练习】汽油辛烷值优化建模(二)(问题一的详细讲解)

    1 问题回顾 问题1为数据处理 需参考近4年的工业数据 见附件一 325个数据样本数据 xlsx 的预处理结果 依 样本确定方法 附件二 对285号和313号数据样本进行预处理 原始数据见附件三 285号和313号样本原始数据 xlsx 并
  • Python3学习笔记(一) 基本数据类型(1)

    首先 Python3的变量不需要声明 曾经说的C语言的变量需要提前声明的好处现在也不是什么好处了 但是变量必须被赋值 赋值之后变量才会被创建 变量没有类型 直接写出来她的名字 里面装的什么内容 就好了 自然而然她就会有一个数据类型 由这里面
  • Java创建多线程的五种写法

    目录 一 lambda表达式 强烈推荐 最简单 基础格式 举例 运行结果 二 继承 Thread 重写 run 基础格式 举例 运行结果 三 实现 Runnable 重写 run 基础格式 举例 运行结果 四 使用匿名内部类 继承 Thre
  • 【华为OD机试python】不开心的小朋友【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 游乐场里增加了一批摇摇车 非常受小朋友欢迎 但是每辆摇摇车同时只能有一个小朋友使用 如果没有空余的摇摇车 需要排队等候 或者直接离开 最后没有玩上的小朋友会非常不开心
  • C++实验03(03)组合类:Triangle类与Point类

    题目描述 定义一个平面坐标系下的点类Point 有整型数据成员x y坐标值 成员函数包括 1 带默认值的构造函数 默认值均为0 2 拷贝构造函数 3 置x y坐标值 4 取x y的坐标值 参数为两个整型量的引用 分别用于获取x y坐标值 5
  • 深入剖析Kubernetes之容器网络(一)

    文章目录 单机容器网络 容器跨主机网络 Kubernetes网络模型与CNI网络插件 单机容器网络 一个 Network Namespace 的网络栈包括 网卡 Network Interface 回环设备 Loopback Device
  • flink集群与资源@k8s源码分析-资源III 声明式资源管理

    1 资源 资源分析分3部分 资源请求 资源提供 声明式资源管理 本文是第三部分声明式资源管理 2 检查资源需求 检查资源声明 检查资源需求 检查资源声明是flink声明式资源管理的核心方法 上面的资源场景分为两类 提出资源需求和提供资源 检
  • LeetCode题目(Python实现):判断子序列

    文章目录 题目 想法一 遍历 t 算法实现 执行结果 复杂度分析 想法二 遍历 s 算法实现 执行结果 迭代器和生成器 算法实现 执行结果 利用 find 算法实现 执行结果 小结 题目 给定字符串 s 和 t 判断 s 是否为 t 的子序
  • VSCode学习【6】:vscode 文件目录缩进太小,目录树不明显

    1 打开Visual Studio Code 2 定位 英文版 File gt Preformences gt Settings 中文版 文件 gt 首选项 gt 设置 3 搜索 workbench gt tree
  • Vue实例选项之【data】

    data 通过 Vue 实例的 data 选项 可以声明应用内需要双向绑定的数据 建议所有会用到的数据都预先在 data 内声明 这样不至于将数据散落在业务逻辑中 难以维护 div div
  • 祝贺姜宁连任 2023 Apache 软件基金会董事暨 ASF 全球成员大会之我见我闻

    开源社引言 3 月 10 日凌晨 4 点钟 牙签撑开血丝眼球 我连续第 5 年爆肝参加了 ASF 年度全球成员大会 IRC 在线 全文字无语音或视频 当凌晨 4 30 唱名 2023 年 ASF 董事当选名单时 我兴奋地截屏下来 如下 因为
  • 总结 : 毕设采访原文呈现

    优秀毕业生采访问答记录 1 学姐 学长 能否讲讲你大学的生活状态 趣事与感受 2 关于考研有什么感受 3 能否谈谈对本专业的看法 4 学习方法 成功秘诀 5 学姐 学长 是否参加过竞赛 如果有能否和我们分享一下当时参加的想法 目的 收获等等
  • 开源的JAVA(SWT)仿visual studio GUI设计器

    JAVA SWT 仿visual studio GUI设计器 背景介绍 作者从事 JAVA SWT桌面应用开发多年 深感JAVA 开发的 GUI代码的繁锁与重复 于是想改进JAVA图行界面设计器 windowbuilder pro 在上面加
  • yaml 数组_YAML配置文件简介及使用

    简介 YAML 是 YAML Ain t a Markup Language YAML 不是一种标记语言 的缩写 相比JSON格式的方便 语法 内容是大小写敏感 使用缩进表示层级关系 有点像Python缩进 缩进只允许空格 不能使用tab代
  • 类中包含几种成员,分别是什么?

    类中有两种成员 成员变量以及成员函数 其中成员变量分为静态的成员变量以及非静态的成员变量 成员函数分为静态的成员函数以及非静态的成员函数
  • 在Java中使用redisTemplate操作缓存

    在最近的项目中 有一个需求是对一个很大的数据库进行查询 数据量大概在几千万条 但同时对查询速度的要求也比较高 这个数据库之前在没有使用Presto的情况下 使用的是Hive 使用Hive进行一个简单的查询 速度可能在几分钟 当然几分钟也并不
  • linux下定位内存泄漏 /proc/pid/status 解释

    内存泄漏一直是程序定位的盲点 很多时候感觉用着用着内存会越来越少 导致程序崩溃 而一般top等linux命令又不够详细 通过cat proc pid status 命令 可详细查看进程的内存占用情况 其中pid是进程id 进程号去查状态 c
  • Java:线程的三种中断方式

    文章目录 前言 一 线程的Stop 操作 二 线程的Interrupt 方法进行中断操作 1 stop 方法的缺点 2 Interrupt 方法 三 使用run标志位进行判断 总结 前言 在 Java 中 并发机制非常重要 但并不是所有程序
  • 分库分表的概念

    目录 一 分库分表有什么用 二 分库分表的方式 三 分库分表的缺点 四 什么时候需要分库分表 五 常见的分库分表组件 总结 在前面写了一篇关于MySQL主从集群的文章 而主从的作用 在我们开发角度更大的作用是作为读写分离的支持 也是学习Sh