一、分库分表的必要性

分库分表技术的使用,主要是数据库产生了瓶颈,如单库的并发访问或单表的查询都超出了阈值。对系统使用造成一定的影响,不得已而产生的技术。

通过分库分表技术来解决此类问题,但正因为使用此技术,会产生ACID一系列的问题,各类中间件解决此类问题各有各的优势。

提示:如场景无必要,千万不要使用分库分表。

二、分库分表的思路

1、垂直区分

垂直分库:从业务角度,一个库分成多个库,如把订单和用户信息分成两个库来存储。这样的好处就是可以微服务了。每块的业务单独部署,互不影响,通过接口去调用。

图1 单库到多库

垂直分表:把大表分成多个小表,如热点数据和非热点数据分开,提高查询速度。

2、水平区分

水平分表:同一业务如数据量大了以后,根据一定的规则分为不同的表进行存储。

图2 单表到多表

水平分库:如订单分成多个库存储,分解服务器压力。

以上一般来说,垂直分库和水平分表用的会多些。

三、分库分表的原理分析

分库分表常用的方案:Hash取模方案和range范围方案;

路由算法为最主要的算法,指得是把路由的Key按照指定的算法进行存放;

1、Hash取模方案

根据取余分配到不同的表里。要根据实际情况确认模的大小。此方案由于平均分配,不存在热点问题,但数据迁移很复杂。

图3 hash方案

2、Range范围方案

range根据范围进行划分,如日期,大小。此方案不存在数据迁移,但存在热点问题。

图4 range方案

四、分库分表的技术选型

1、技术选型

解决方案主要分为4种:MySQL的分区技术、NoSql、NewSQL、MySQL的分库分表。

(1)mysql分区技术:把一张表存放在不同存储文件。由于无法负载,使用较少。

(2)NoSQL(如MongoDB):如是订单等比较重要数据,强关联关系,需约束一致性,不太适应。

(3)NewSql(具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID和SQL等特性):如TiDB可满足需求。

(4)MySQL的分库分表:如使用mysql,此种方案为主流方式。

2、中间件

解决此类问题的中间件主要为:Proxy模式、Client模式。

(1)Proxy模式

把SQL组合、数据库路由、执行结果合并等功能全部存放在一个代理服务中,而与分库分表相关的处理逻辑全部存放在另外的服务中,这种设计模式的优点是对业务代码无侵入,业务只需要关注自身的业务逻辑即可。

图5 proxy模式

(2)Client模式

把分库分表相关逻辑存放在客户端,一版客户端的应用会引用一个jar,然后再jar中处理SQL组合、数据库路由、执行结果合并等相关功能。

图6 client模式

(3)中间件的比较

图7 中间件

由于Client模式少了一层,运维方便,相对来说容易些。

五、分库分表的实践

根据容量(当前容量和增长量)评估分库或分表个数 -> 选key(均匀)-> 分表规则(hash或range等)-> 执行(一般双写)-> 扩容问题(尽量减少数据的移动)。

在这里我们选用中间件share-jdbc。

1、引入maven依赖

<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-jdbc-core</artifactId><version>${latest.release.version}</version>
</dependency>

2、spring boot规则配置

行表达式标识符可以使用${...}或$->{...},但前者与Spring本身的属性文件占位符冲突,因此在Spring环境中使用行表达式标识符建议使用$->{...}。

sharding.jdbc.datasource.names=ds0,ds1sharding.jdbc.datasource.ds0.type=org.apache.commons.dbcp.BasicDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds0.url=jdbc:mysql://localhost:3306/ds0
sharding.jdbc.datasource.ds0.username=root
sharding.jdbc.datasource.ds0.password=sharding.jdbc.datasource.ds1.type=org.apache.commons.dbcp.BasicDataSource
sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds1.url=jdbc:mysql://localhost:3306/ds1
sharding.jdbc.datasource.ds1.username=root
sharding.jdbc.datasource.ds1.password=sharding.jdbc.config.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order$->{0..1}
sharding.jdbc.config.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
sharding.jdbc.config.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order$->{order_id % 2}
sharding.jdbc.config.sharding.tables.t_order.key-generator-column-name=order_id
sharding.jdbc.config.sharding.tables.t_order_item.actual-data-nodes=ds$->{0..1}.t_order_item$->{0..1}
sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item$->{order_id % 2}
sharding.jdbc.config.sharding.tables.t_order_item.key-generator-column-name=order_item_id
sharding.jdbc.config.sharding.binding-tables=t_order,t_order_item
sharding.jdbc.config.sharding.broadcast-tables=t_configsharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=user_id
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2}

3、创建DataSource

通过ShardingDataSourceFactory工厂和规则配置对象获取ShardingDataSource,ShardingDataSource实现自JDBC的标准接口DataSource。然后即可通过DataSource选择使用原生JDBC开发,或者使用JPA, MyBatis等ORM工具。

setDataSource(targetDataSources, DataSourceType.SHARDING.name(), "shardingDataSource");

分库分表技术及技术方案相关推荐

  1. 架构组件:基于Shard-Jdbc分库分表,数据库扩容方案

    架构组件:基于Shard-Jdbc分库分表,数据库扩容方案 一.数据库扩容 1.业务场景 互联网项目中有很多"数据量大,业务复杂度高,需要分库分表"的业务场景. 这样分层的架构 ( ...

  2. MySQL 分库分表及其平滑扩容方案

    作者:王克锋 出处:https://kefeng.wang/2018/07/22/mysql-sharding/ 众所周知,数据库很容易成为应用系统的瓶颈.单机数据库的资源和处理能力有限,在高并发的分 ...

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

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

  4. postgresql分库分表中间件开源实现方案

    PostgreSQL 分库分表的中间件开源实现方案有很多, 你可以根据自己的需要选择适合自己的方案. 下面是几种常见的方案: pgpool-II: 一个 PostgreSQL 透明数据库代理, 具有负 ...

  5. 阿里二面:为什么要分库分表?

    前言 在高并发系统当中,分库分表是必不可少的技术手段之一,同时也是BAT等大厂面试时,经常考的热门考题. 你知道我们为什么要做分库分表吗? 这个问题要从两条线说起:垂直方向 和 水平方向. 1 垂直方 ...

  6. 关于分库分表,这有一套大而全的轻量级架构设计思路

    来自:DBAplus社群 作者介绍 杨彪,蚂蚁金服技术专家,<分布式服务架构:原理.设计与实战>和<可伸缩服务架构:框架与中间件>作者.近10年互联网和游戏行业工作经验,曾在酷 ...

  7. “分库分表 ?选型和流程要慎重,否则会失控

    原文地址:https://segmentfault.com/a/1190000017272697 恭喜你,贵公司终于成长到一定规模,需要考虑高可用,甚至分库分表了.但你是否知道分库分表需要哪些要素?拆 ...

  8. 分库分表学习总结(6)——分库分表?选型和流程要慎重,否则流程会失控!

    数据库中间件之分库分表 恭喜你,贵公司终于成长到一定规模,需要考虑高可用,甚至分库分表了.但你是否知道分库分表需要哪些要素?拆分过程是复杂的,提前计划,不要等真正开工,各种意外的工作接踵而至,以至失控 ...

  9. MySQL数据库怎么进行分库分表?

    ▲ 点击上方"分布式实验室"关注公众号 回复"1"抽取纸质技术书 提起分库分表,对于大部分服务器开发来说,其实并不是一个新鲜的名词.随着业务的发展,我们表中的数 ...

  10. 一文读懂数据库分库分表

    阅读此文你将了解: 什么是分库分表以及为什么分库分表 如何分库分表 分库分表常见几种方式以及优缺点 如何选择分库分表的方式 数据库常见优化方案 对于后端程序员来说,绕不开数据库的使用与方案选型,那么随 ...

最新文章

  1. R语言使用ggpubr包可视化分组条形图(grouped bar plot)、并添加误差条(error bar、误差条显示平均值+/-sd)、添加分组填充色、添加jitter、自定义分组抖动数据点形状
  2. android onLayout死循环
  3. c语言重定义不同的基类型_简述usb连接器输出类型定义和不同环境下的用法
  4. poj-1062-昂贵的聘礼
  5. 502 Bad Gateway Registered endpoint failed to handle the request
  6. LeapFTP 注册码
  7. python selenium 处理弹窗_python-selenium -- 弹出框处理
  8. Eclipse窗口显示:独立、嵌入式
  9. linux中ssh启动init,Linux系统上SSH无法启动
  10. 只需1分钟,这个网站用AI分离歌曲的人声、伴奏和乐器声
  11. SVN可视化管理工具
  12. ACM 6174问题C++解决
  13. Java常用开源框架
  14. 批处理检测局域网电脑是否开机(转载)
  15. java AES文件流加密
  16. 数控加工零件工艺性分析
  17. Git命令及集成IDEA、Gitee/GitHub/GitLab
  18. NSIS ERROR解决方法
  19. 开篇:解决IE9字体模糊的问题(又称无法关闭ClearType)
  20. “技术总监面试,凭啥不问你技术细节?”

热门文章

  1. 视觉SLAM之鱼眼相机模型
  2. html文件最后一行文字,HTML里的最后一行文字显示不全怎么处理
  3. jsp select初始化赋值_分别在javascript和JSP中动态设置下拉列表默认值
  4. 行列式及其运算和性质
  5. wav格式怎么转换?介绍三个转换wav格式的方法
  6. Web性能优化之preload、prefetch
  7. C语言高级编程:字符串赋值的几种方式
  8. 从教育扶智到产业振兴,中国平安“35周年司庆感恩回馈“系列活动走进安徽阜南
  9. Vue的几个生命周期函数
  10. 编写高效的jQuery代码