1.为什么需要分库分库分表?

1.1 数据库性能瓶颈的出现

​ 最直观的表现就是对数据库的各种操作变慢,在高并发的场景下出现应用无法获取数据库连接,

1.2 数据库优化方案对比

1.2.1 SQL 与索引

​ 在程序中对 SQL 语句进行优化,在数据库中添加索引。

这个是我们这边最常用的手段,也是成本低,效果明显的手段,但是过多的索引也会带来一些问题,不可盲目添加。个人理解是需要建立收益大的索引,建立最优的索引,一个索引可以对多个sql起作用,同时命中后对有效的减小数据集,所以建立索引也是一个值得探讨问题。

1.2.2 引擎和配置层面优化

  • 选用特定的存储引擎,或者对表进行分区,对表结构进行拆分或者冗余处理,

或者对表结构比如字段的定义进行优化。

  • 数据库配置的优化,比如连接数,缓冲区大小等等,优化配置的目的都是为了更高效地利用硬件。

1.2.3 操作系统与硬件

​ 操作系统和硬件的优化,增加cpu,增加内存。

是否需要提升硬件,需要视情况而定,主要看导致数据库慢的原因是什么,盲目的叠加配置是不可取的。

1.2.4 数据库架构优化

  • 读写分离
  • 数据分片

​ 当前面三种的收益不大时候,我们就要开始考虑在架构层面进行优化了,而架构层面最为有效的方法

就是进行分库分表,我的理解是,使用分库分表使用的恰当获得的收益十分显著

2 .分库分表的类型和特点

2.1分库分表的类型

垂直切分:基于表或字段划分,表结构不同。我们有单库的分表,也有多库的分库。

水平切分:基于数据划分,表结构相同,数据不同,也有同库的水平切分和多库的 切分

  • 垂直拆分:

    • 单库垂直分表 : 将一张表中的数据差分的得更加的细粒度,如:将用户信息表,拆分成基本信息表,联系方式表等

    • 多库垂直分表: 多库垂直分表就是把原来存储在一个库的不同的表,拆分到不同的数据库。个人理解微服务划分数据库的思想和这个类似,按照业务分到不同的数据库

垂直拆分还是由于业务量大的业务导致数据库数据量大,没有从根本上解决问题

  • 水平拆分:

    • 单库水平分表 :将一张表按照字段值的来划分到不同的表中

    • 多库水平分表: 将一张表按照字段值的来划分到不同的库中,例如:按照租户分库

2.2分库分表的带来的问题

分完库分完表之后,之前在单库的的不会存在的问题都暴露出来了:

  • 跨库关联查询:

    如何解决跨数据关联查询的问题

    • 字段冗余:将需要跨库查询查询的字段进行冗余处理

    • 数据同步:采用etl方式将需要关联的查询的数据进行同步

    • 广播表:将一些多个数据库都需要用到表在操作的时候进行广播,例如表单表

    • 绑定表:将相同分片值相同的数据

    • 系统层面封装:在不同的数据库节点把符合条件数据的数据查询出来,然后重新组装,返回给客户端。

  • 分布式事务

如果在一个数 据库里面,我们可以用本地事务来控制,但是在不同的数据库里面就不行了。所以分布

式环境里面的事务,我们也需要通过一些方案来解决.

  • 全局事务

  • 基于可靠消息服务的分布式事务

  • 柔性事务 TCC

  • 最大努力通知,通过消息中间件向其他系统发送消息

  • 排序、翻页、函数等计算问题

max、min、sum、count 之类的函数在进行计算的时候,也需要先在每个分片上执

行相应的函数,然后将各个分片的结果集进行汇总和再次计算,最终将结果返回

  • 全局主键避重问题

使用主键自增策略,在不同的数据库会出现主键冲突问题,该如何解决:

  • UUID
  • Snowflake
  • 使用redis来做自增策略

现在的一些开源产品来解决分库分表带来的问题,也大多采用以上一些解决方案

3.分库分表的方案设计与对比

思考一个sql执行的流程: DAO——Mapper(ORM)——JDBC——代理——数据库服务
当前市面的解决方案基本都是从这个流程入手,下面我们将一一为其做探讨:
3.1 DAO层

在这一层主要是做数据源的路由,一般也是多数据路由的选择方案,Spring 中提供了一个抽象类

AbstractRoutingDataSource,可以实现数据源的动态切换.

这种实现方案目前在我们这边也是有应用的,在shc中的patient-document中对多数据源的路由就采取了这种方式

  • 优点: 不需要依赖 ORM 框架,即使替换了 ORM 框架也不

    受影响。实现简单(不需要解析 SQL 和路由规则),可以灵活地定制。

  • 缺点:不能复用,不能跨语言,对于以上出现的问题都需要自己手动来进行处理

3.2 ORM 框架层

如我们用 MyBatis 连接数据库,也可以指定数据源。我们可以基于 MyBatis 插件的拦截机制(拦截 query 和 update 方法),实现数据源的选择.

  • 缺点: 很明显同上
3.3 驱动层

​ 不管是MyBatis 还是Hibernate,还是Spring 的JdbcTemplate,本质上都是对JDBC

的封装,所以第三层就是驱动层。比如 Sharding-JDBC,就是对 JDBC 的对象进行了封装。

JDBC 的核心对象:

  • DataSource:数据源

  • Connection:数据库连接

  • Statement:语句对象

  • ResultSet:结果集

​ 只要对这几个对象进行封装或者拦截或者代理,就可以实现分片的操作.

  • 缺点:

    1.仅支持JAVA

    2.占用较多的数据库连接

    3.数据聚合在业务实例执行

    4.版本升级较为麻烦

  • 优点: 相对灵活,性能高,支持丰富的DB

例如:TDDL、ShardingJDBC

3.4代理层

​ 前面三种都是在客户端实现的,也就是说不同的项目都要做同样的改动,不同的编程语言也有不同的实现,代理层。代理层的数据库中间件,将自己伪装成一个数据库,接受业务端的链接。然后负载业务端的请求,解析或者转发到真正的数据库中,其实是基于协议层面的,可以看后续的对比。

  • 缺点:

    异构支持,DB支持有限

    运维负担大,需要高可用,单独部署,稳定性高,配置后需要重启

  • 优点: 无代码入侵

比如 Mycat ,Sharding-Proxy和一些云厂商的分布式数据库都是属于这一层。

3.5 数据库层面

最后一层就是在数据库服务上实现,也就是服务层,某些特定的数据库或者数据库的特定版本可以实现这个功能。

  • 缺点: 受限于使用数据库的类型

例如很多非关系型数据库, redis,mongodb等

3.6方案对比

目前主流的分库分表方案就是sharding-jdbc和mycat,为此做了一个对比

Sharding-jdbc Mycat
工作层面 JDBC 协议 MySQL 协议/JDBC 协议
运行方式 Jar 包, 客户端 独立服务, 服务端
开发方式 代码/配置改动 连接地址(数据源)
运维方式 管理独立服务, 运维成本高
性能 多线程并发按操作, 性能高 独立服务+网络开销, 存在性能损失风险
功能范围 协议层面 包括分布式事务、 数据迁移等
适用操作 OLTP OLTP+OLAP
支持数据库 基于 JDBC 协议的数据库 MySQL 和其他支持 JDBC 协议的数据库
支持语言 Java 项目中使用 支持 JDBC 协议的语言
动态调整数据源 需自己实现 添加新组合配置并重启mycat

由于我们这边需要采用动态的配置,以及更加个性化的实现,所以选择sharding-jdbc

分库分表中间件常见方案对比分析相关推荐

  1. 数据库分库分表中间件对比(很全)

    数据库(分库分表)中间件对比 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件( ...

  2. 【数据库与事务系列】分库分表中间件

    前面讲了利用mybatis插件进行多数据源切换和分表的方案,但是对业务侵入性较强,当然给予mybatis-plus的对业务侵入性还好,但是支持的策略有限.场景有限. 所以业界诞生了很多分库分表中间件来 ...

  3. 分库分表中间件Sharding-JDBC

    数据库分库分表从互联网时代开启至今,一直是热门话题.在NoSQL横行的今天,关系型数据库凭借其稳定.查询灵活.兼容等特性,仍被大多数公司作为首选数据库.因此,合理采用分库分表技术应对海量数据和高并发对 ...

  4. Mycat - 数据库分库分表中间件,国内最活跃的、性能最好的开源数据库中间件

    转载自 Mycat - 数据库分库分表中间件,国内最活跃的.性能最好的开源数据库中间件 Mycat是什么 Mycat - 数据库分库分表中间件,国内最活跃的.性能最好的开源数据库中间件! 一个彻底开源 ...

  5. Java互联网架构-Mysql分库分表订单生成系统实战分析

    分库分表的必要性 首先我们来了解一下为什么要做分库分表.在我们的业务(web应用)中,关系型数据库本身比较容易成为系统性能瓶颈,单机存储容量.连接数.处理能力等都很有限,数据库本身的"有状态 ...

  6. 玩转MySQL:一站式解决分库分表后患问题方案

    引言 上篇有关分分库分表一文中已经将分库分表的方法论全面阐述清楚了,总体看下来用一个字形容,那就是爽!(手动狗头)尤其是分库分表技术能够让数据存储层真正成为三高架构,但前面爽是爽了,接着一起来看看分库 ...

  7. 关系型数据库分库分表中间件之选型

    写在前面 本文主要介绍关系型数据库分库分表的中间件,主要包含中间件介绍.选项及其对比.虽然市面上很多分库分表中间件,但是大多数都是不友好或者社区活跃度不高的项目,当然还是有很多淘汰的中间件.目前,在实 ...

  8. mysql分库分表中间件6_当当开源sharding-jdbc,轻量级数据库分库分表中间件

    近期,当当开源了数据库分库分表中间件sharding-jdbc. Sharding-JDBC是当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据 ...

  9. 当当网mysql分库分表策略_当当开源sharding-jdbc,轻量级数据库分库分表中间件

    近期,当当开源了数据库分库分表中间件sharding-jdbc. Sharding-JDBC是当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据 ...

  10. 一文快速入门分库分表中间件 Sharding-JDBC (必修课)

    书接上文 <一文快速入门分库分表(必修课)>,这篇拖了好长的时间,本来计划在一周前就该写完的,结果家庭内部突然人事调整,领导层进行权利交接,随之宣布我正式当爹,紧接着家庭地位滑落至第三名, ...

最新文章

  1. Linux 进程必知必会
  2. 画图说明Java String的不变性!可修改字符串不要轻易使用String!
  3. Css框架and公共Css文件
  4. 计算道路超高lisp_5G+AI超高清智能视频监控将迎来增长期
  5. 2015.7.11js-10(无缝滚动)
  6. matlab m序列,m序列(M序列与m序列区别)
  7. PowerDesigner生成数据库刷库脚本
  8. webpack配置_webpack的配置
  9. linux 文本筛选基因,linux – 如何将snps映射到ref基因文件
  10. qq发的html文件打不开,Win10系统下QQ能上网页却无法打开的三种解决方案
  11. while循环CPU占用率高问题深入分析与解决方案
  12. QEMU中通过GPA得到对应HVA的方法
  13. 经典简单的猜数字小游戏
  14. SVM分类器中损失函数梯度求法及理解
  15. java获取日期/时间
  16. POJ3107 Godfather 树形dp+模拟vector
  17. 应届生年薪30万,把员工宠上天?测试员在快手工作究竟是什么样的体验?
  18. 数据处理与服务发布——网络分析
  19. web前端 | 如何选择撸码神器
  20. ETH2.0 要来了,要不要参与质押?

热门文章

  1. 程序员保护眼睛几种方法
  2. spss数据统计分析工具IBM SPSS Statistics 26 for Mac安装教程
  3. 对于moxie的quot;WebWork教程quot;补充 - [文件上传]
  4. 全国大学生飞思卡尔智能车竞赛小记
  5. CGAL license说明
  6. 微信如何自动搜索精准号码添加好友?导入软件完成自动加人
  7. AMD ROCm 硬件支持情况
  8. CardView的基本使用
  9. 【服务器管理之远程桌面】
  10. matconvnet编译