分库分表 是将数据拆分成不同的存储单元。

从分拆的角度上,可以分为垂直分片和水平分片。

垂直分片:按照业务来对数据进行分片,又称为纵向分片。

垂直分片往往需要对架构和设计进行调整。通常来讲,是来不及应对业务需求快速变化的。而且,他也无法真正的解决单点数据库的性能瓶颈。

垂直分片可以缓解数据量和访问量带来的问题,但无法根治。

如果垂直分片之后,表中的数据量依然超过单节点所能承载的阈值,则需要水平分片来进一步处理。

水平分片:又称横向分片。

相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,
每个分片仅包含数据的一部分。

常用的分片策略有:

策略 优点 缺点 demo
取余\取模 均匀存放数据 扩容非常麻烦 id % 2
按照范围分片 比较好扩容 数据分布不够均匀
按照枚举值分片 比较好扩容 数据分布不够均匀 按地区分片
按照目标字段前缀指定进行分区 自定义业务规则分片 数据分布不够均匀

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

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

扩展问题:如何设计一个不需要数据迁移的取模分片扩容方案?

复合策略:

  1. 首先按照月份分片策略
  2. redis 记录1月份1号下的节点有1、2、3, 二月份2号下节点有1、2、3、4、5 需要提前预估
  3. 节点按照取模分片策略
  4. 确定月份需要 取模加权(1月数据少权重第点 2月数据多权重大点)

分库分表要解决哪些问题

虽然数据分片解决了性能、可用性以及单点备份恢复等问题,还是需要考虑:

  • 事务一致性问题

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

  • 跨节点关联查询问题

    在没有分库时,我们可以进行很容易的进行跨表的关联查询。但是在分库后,表被分散到了不同的数据库,就无法进行关联查询了。这时就需要将关联查询拆分成多次查询,然后将获得的结果进行拼装。

  • 跨节点分页、排序函数

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

  • 主键避重问题

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

  • 公共表处理

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

  • 运维工作量

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

什么时候需要分库分表?

在阿里巴巴公布的开发手册中,建议MySQL单表记录如果达到500W这个级别,或者单表容量达到2GB,一般就建议进行分库分表。

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

最后,一旦用到了分库分表,就会表现为对数据查询业务的灵活性有一定的影响,例如如果按userId进行分片,那按age来进行查询,就必然会增加很多麻烦。

如果再要进行排序、分页、聚合等操作,很容易就扛不住了。

这时候,都要尽量在分库分表的同时,再补充设计一个降级方案,例如将数据转存一份到ES,ES可以实现更灵活的大数据聚合查询。

常见的分库分表组件

  1. shardingsphere 官网地址: https://shardingsphere.apache.org/document/current/cn/overview/

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

  2. mycat 官网地址: http://www.mycat.org.cn/

    基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,

  3. DBLE 官网地址:https://opensource.actionsky.com/

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

业务层改造

基于代理层方式:Mycat、Sharding-Proxy、MySQL Proxy

基于应用层方式:Sharding-jdbc

MySQL(十):分库分表方案相关推荐

  1. 最全的MySQL 常用分库分表方案,都在这里!

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达关注公众号后台回复pay或mall获取实战项目资料视频 点击此链接:一套的SpringCloud版聚合支付项目,资料文档 ...

  2. 互联网公司MySQL常用分库分表方案总结

    更多内容关注微信公众号:fullstack888 一.数据库瓶颈 1.IO瓶颈 2.CPU瓶颈 二.分库分表 1.水平分库 2.水平分表 3.垂直分库 4.垂直分表 三.分库分表工具 四.分库分表步骤 ...

  3. MySQL主从(MySQL proxy Lua读写分离设置,一主多从同步配置,分库分表方案)

    Mysql Proxy Lua读写分离设置 一.读写分离说明 读写分离(Read/Write Splitting),基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELE ...

  4. mybatis+mysql分库分表_一种简单易懂的 MyBatis 分库分表方案

    数据库分库分表除了使用中间件来代理请求分发之外,另外一种常见的方法就是在客户端层面来分库分表 -- 通过适当地包装客户端代码使得分库分表的数据库访问操作代码编写起来也很方便.本文的分库分表方案基于 M ...

  5. MySQL第六讲 MySQL分库分表方案

    分库分表概念        分库分表就是业务系统将数据写请求分发到master节点,而读请求分发到slave 节点的一种方案,可以大大提高整个数据库集群的性能.但是要注意,分库分表的 一整套逻辑全部是 ...

  6. MySQL关于分库分表及其平滑扩容方案

    众所周知,数据库很容易成为应用系统的瓶颈.单机数据库的资源和处理能力有限,在高并发的分布式系统中,可采用分库分表突破单机局限.本文总结了分库分表的相关概念.全局ID的生成策略.分片策略.平滑扩容方案. ...

  7. 最全的MySQL分库分表方案总结

    " 面试中我们经常会碰到的关于分库分表的问题!今天就给大家介绍互联网公司常用 MySQL 分库分表方案!希望对大家的面试有所帮助! 数据库瓶颈 不管是 IO 瓶颈,还是 CPU 瓶颈,最终都 ...

  8. Java教程之mysql分库分表方案

    1 前言 各位小伙伴,在目前企业级开发中采用Mysql做为数据库是一个主流选择,而当数据量比较大的情况下,为了支撑项目的正常快速的运行,我们不得不选择对数据库分库分表操作,本章节就对数据库的分表做一些 ...

  9. 【mysql】MySQL 分库分表方案,总结的非常好!

    文章目录 1. 数据库架构演变 2. 分库分表前的问题 3. 分库分表的方式方法 3.1 垂直分库 3.2 水平拆分 水平分表 水平分库分表 水平分库分表切分规则 4. 分库分表后面临的问题 4.1 ...

最新文章

  1. 考研结束了,使用SpringBoot开发一个考研管理系统
  2. 044_CSS33D转换
  3. chrome浏览器解决ajax跨域问题
  4. C#网络编程(基本概念和操作) - Part.1[转自JimmyZhang博客]
  5. springMVC异常处理器:自定义异常处理器捕获系统异常,控制异常页面跳转
  6. HikariCP 的Java数据库连接池介绍及配置
  7. Spring-装配Bean的3种方式-实现工厂方法方式装配Bean
  8. linux环境下VSCode的C++环境搭建
  9. fclose用法matlab,fclose和close之间的区别
  10. 一文带你了解身份证实名认证类api接口
  11. 基于TensorFlow Encrypted (TFE)的隐私计算benchmark
  12. 2019.4.8-pandas 读写csv;dorp删除行、列
  13. js根据日期计算星期几
  14. 手机里android文件里哪些文件可删除,手机文件夹哪些可以删除?这4个删除它妥妥的...
  15. 同样嗑B站6个月,被室友吊打 35K Offer!
  16. 校园网及入网计算机管理制度,校园网用户入网管理规定
  17. 数学_矩阵求逆/伪逆计算
  18. ACM-ICPC 2018 沈阳赛区网络预赛(E F G J K)
  19. ios客户端学习-被苹果开发者中心拒绝附件上传不上
  20. 知物由学 | 虚假色情泛滥,人工智能可以做些啥?

热门文章

  1. mxnet中的copyto和as_in_context辨析
  2. 为了云计算,“思华”不再沉默
  3. vim 复制/剪切/粘贴/撤销操作
  4. Linux防火墙配置白名单操作(包括Ubuntu、ContOS、Redhat)
  5. linux 防火墙配置规则
  6. IO多路复用机制详解
  7. idea使用GitHub踩过的坑——Invalid authentication data.404 Not Found-Not Found
  8. amber教程A17学习----概念篇
  9. 八种基础类型和包装类型
  10. BP神经网络(完整的理论和经验公式)