关于数据库分库分表的一点想法

京东云开发者
• 阅读 216

作者:京东物流 何小坡

1 开篇

面对数据的激增,相信大家也都有分库分表的一些方案,这次的这个分享,算是自己的一个想法,可以当做一个参考方案,也欢迎相互讨论。
话不多说,直接进入主题。
日常开发中,实现数据库的分库分表,在经常使用工具方面,常用的有像 sharding-sphere、TDDL、Mycat等,然后,根据主键key做数据分布,有两种常用的方案,Hash取模方案和Range范围两种方案,两种路由算法,通过指定的key值进行运算后进行数据路由。两种方案也各有各的优缺点,下面做个梳理。

2 Hash取模

这个方案比较好理解,例如,我们假设未来几年内,数据能够增长到3000万,那,我们可以设计3张表,设表名分别为:table_0, table_1, table_2, 每张表存1000万数据,我们利用id作为路由key,进行算法处理,将hash运算后的结果与3进行取模,然后根据所得的值,可以将数据存放到对应的表中。这种方式的优点是,数据可以均匀分散的存储到对应的表中,不会造成数据全部存储到一个表中的情况,造成热点库表;但是缺点的话也很明显,就是如果以后再需要扩容的话,再新增表后,例如又新增了 table_3, table_4, table_5, 新的取模就从3变成了6,那这时候,之前的表中的数据,就需要做全量的数据迁移,因为取模的值发生了变化,按照新值取模,可能就找不到数据了。那面对大量的已有数据,数据迁移就比较麻烦了。

关于数据库分库分表的一点想法

3 Range范围方法

这个方案,也比较好理解,还假设业务后期数据能增长到3000万,也是可以设计3张表,设为:table_0, table_1, table_2,我看可以按照范围,将id在0—1000万的数据,存放在table_0中,id在1000万—2000万,存放在table_1中,id在2000万—3000万,存放在table_2中。这种方案的话,优点很明显,就是即使以后扩容,也很方便,直接增加新的表即可;但是缺点的话,也很明显,数据不能做分散存储,在某一段儿时间内,数据都会集中存储在特定的表中,造成单个表压力过大。

关于数据库分库分表的一点想法

基于以上两种方式的优势和劣势,可以设计一种能够兼顾两者优势的方案,即能使数据能够分散存储,也能方便以后的扩容。以下算是一个方案。主要就是利用hash算法来实现数据的分散存储,利用range方式能够比较好的扩容,将两种方案的优势结合使用。

4 具体方案

我们假设有一个分组的概念,假设项目初期,预期几年内的数据,数据可以达到6000万,可以做如下设计:

关于数据库分库分表的一点想法

如果后面涉及到扩容,那只需要再直接增加一个分组即可,在分组内,实现数据的分散存储,扩容也比较方便。

关于数据库分库分表的一点想法

即每次扩容,只需要整体增加一个分组即可,一个分组下,可以存储将近几年的数据,所以也不用经常扩容。然后,也可以根据业务情况,将旧数据做归档处理,像现在优惠券系统的数据,旧数据就可以做整体归档处理,不影响正常业务情况,也减轻生产库的压力。

5 总结

分库分表作为大型应用项目的架构实现方案,确实有一定的复杂性,可以根据当前项目的实际情况,使用适合的工具,做具体开发,最主要的还是需要结合自己的项目的实际业务情况来定,根据数据的分布以及数据的增长速度,来做结合项目场景的设计。也欢迎大伙一起讨论,如果有别的更精妙的“秘籍”,也希望不吝赐教,谢谢。

点赞
收藏
评论区
推荐文章
Peter20 Peter20
3年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
2年前
mysql数据库分库分表shardingjdbc
分库分表理解   分库分表应用于互联网的两个场景;大量数据和高并发,通常策略有两种:垂直分库,水平拆分  垂直拆分:是根据业务将一个库拆分为多个库,将一个表拆分为多个表,例如:将不常用的字段和经常访问的字段分开存放,在实际开发由于跟业务关系紧密,所以一般采用水平拆分。  水平拆分:则是根据分片算法讲一个库拆分为多个库,来进行维护,
Stella981 Stella981
2年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Stella981 Stella981
2年前
Asp.NetCore 3.1 EFCore处理Mysql的分库分表
一、什么情况下需要分库分表?Mysql单表数据量超过500万条。二、Asp.netCore技术栈,分库分表的解决方案有哪些?1、阿里云的DRDS2、Mycat 数据库分库分表中间件;3、TiDB;三、以上3种解决方案各自的特点:1、阿里云DRDS是收费的商业版,价格稍贵,但是比S
Stella981 Stella981
2年前
Consistent hashing一致性算法原理
最近在整理redis分布式集群,首先就整理一下分布式算法原理。常见的分区规则有哈希分区和顺序分区两种,Redis采用的是哈希分区规则。节点取余分区使用特定的数据,如Redis的键或用户ID为key,节点数量为N,则:hash(key)%N,计算出哈希值,然后决定映射到哪个节点上,如节点数为4时,哈希值的结果可能为0、1、2,3.现假
Wesley13 Wesley13
2年前
Mysql 表分区分类
针对Mysql数据库,表分区类型简析。【1】表分区类型(1)Range分区:按范围分区。按列值的范围区间进行分区存储;比如:id小于10存储在一个分区;id大于10小于20存储在另外一个分区;(2)List分区:按离散值集合分区。与range分区类似,不过它是按离散值进行分区。(3)Hash分区:按hash算法结果分区。对用户定义的表达式所返
Wesley13 Wesley13
2年前
MySQL 分库分表方案
数据库分库分表前言今天有朋友问到了数据库分库分表,他们都说数据库达到了瓶颈,需要重构,但是毫无头绪,现在做个概念总结(期待后期的实操吗?)会从以下几个方面说起:第一部分:实际网站发展过程中面临的问题。第二部分:有哪几种切分方式,垂直和水平的区别和适用面。第三部分:目前市面有的一些开源产品,技术,它们的优缺点是
原生分布式数据库与子数据库子表中间件的区别
无论是分库分表中间件还是原生分布式数据库,目的都是为了解决数据容量问题,但实际上两种方式有本质区别。那么,具体来说,原生分布式数据库(https://www.oceanbase.com/product/oceanbase)有什么区别,它们的优缺点是
京东云开发者 京东云开发者
7个月前
Vitess全局唯一ID生成的实现方案 | 京东云技术团队
为了标识一段数据,通常我们会为其指定一个唯一id,比如利用MySQL数据库中的自增主键。但是当数据量非常大时,仅靠数据库的自增主键是远远不够的,并且对于分布式数据库只依赖MySQL的自增id无法满足全局唯一的需求。因此,产生了多种解决方案,如UUID,Sn