分库分表技术及技术方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分库分表技术及技术方案相关的知识,希望对你有一定的参考价值。

参考技术A

一、分库分表的必要性

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

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

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

二、分库分表的思路

1、垂直区分

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

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

2、水平区分

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

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

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

三、分库分表的原理分析

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

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

1、Hash取模方案

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

2、Range范围方案

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模式

(2)Client模式

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

(3)中间件的比较

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

五、分库分表的实践

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

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

1、引入maven依赖

2、spring boot规则配置

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

3、创建DataSource

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

给小白演示 分库分表案例

参考技术A 受群里小伙伴之邀,搞一个分库分表案例,这样让很多没用过分库分表的心里也有个底,不然永远看到的都是网上的各种概念和解决方案性的文章。

由于用户表过于庞大,采取相关SQL优化,还是不能满足,所以现对其进行做分库分表。

数据库: my-sharding

数据库表: t_user

建表语句如下:

关于数据库分库分表通常有两种方案:

下面我们来演示水平拆分,大致思路:

加入有2000万条数据,那么为了方便演示,我们就暂定分为五个库,每个数据库对应五个表。

五个数据库:

每个数据库有五张表:

建表语句如下:

使用技术栈: JDK8 + MySQL + Spring Boot + Mybatis + Shardingsphere + Druid

maven 相关依赖:

配置文件相关配置如下:

分库分表的两个分片类:

下面是业务部分代码,先看 UserMapper.xml 内容:

UserMapper 接口:

为了更好地演示,我这里加入了 controller 层和 service 层,这也是大家平常开发套路。

service 层代码如下:

controller层代码如下:

最后是项目的启动类:

启动项目,启动成功:

下面我们来演示一下新增数据和查询。

先来添加数据到数据库中,这里使用的是IDEA中restful工具:

后台日志:

再查看数据库表中:

到此,我们的数据依旧落库,下面我们来演示一下数据查询。

浏览器里输入:

返回数据:

后台日志:

从日志和返回结果可以看出,已经为我们正确的选择到对应的数据库和表了,这样,一个分库分表的查询就成功了。

本文没有太多的概念,直接使用案例演示。相关概念性的文章,还有分库分表解决方案的文章,网上一堆堆的,感兴趣可以自行查阅。

以上是关于分库分表技术及技术方案的主要内容,如果未能解决你的问题,请参考以下文章

从原则方案策略及难点阐述分库分表

分库分表技术方案

给小白演示 分库分表案例

分库分表-- 基本概念

基于.Net + SqlServer的分库分表设计方案

为产品提高性能,考虑到产品特性做出的分库分表的一个技术提案