首页 > 其他分享 >分库分表方案

分库分表方案

时间:2024-06-05 15:32:00浏览次数:19  
标签:方案 分库 hash 取模 分表 数据 id

文章目录

分库分表设计思路

首先分库分表有两种方式,一种是垂直拆分,一种是水平拆分。
垂直拆分
垂直拆分比较简单,也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库,就是一微服务下边一个库
水平拆分
当然如果用到了水平拆分前提一定是做了垂直拆分,然后如果某个业务表比如说订单表4000W数据了,那就把这订单表4000W数据拆分成四张表或者更多表,比如说1000W数据就拆分为一张表,这就是水平拆分。
分库分表所带来的问题
传统的分库分表方案,假设现在已经是把订单表拆分成4张表了,接下来新的数据假设是id为2W的时候落入哪一张表?超过4千万要做数据扩容了,扩容的方案是什么?怎么知道要分四张表?
业内两种解决方案

hash取模和范围方案

1、hash取模
在这里插入图片描述

hash的方案就是对指定的路由key(如:id)对分表总数进行取模。
在上图中,id=12的订单,对4进行取模,也就是会得到0,那此订单会放到0表中;
id=13的订单,取模得到为1,就会放到1表中。
为什么对4取模,是因为分表总数是4。
优点:
没有热点,订单的数据可以均匀的放入到4张表当中,均衡不会有热点问题
缺点:
难扩容难迁移,订单量很大超出了4000万的量,那就需要增加分表数,取模基数就会被改变,然后以前存的数据有可能因为取模基数变化而查询不到了,然后把之前的4000万数据,重新做一个hash方案,放到新的规划分表中。也就是要做数据迁移。这个是一件很痛苦的事情。
2、范围查找
在这里插入图片描述

意思就是把一定范围内的订单,存放到一个表中;
比如说0到1千万的数据放到0号表,1千万到2千万放到1号表。设计这个方案时就是前期把表的范围设计好。
通过id进行路由存放。
优点:
容易扩容,未来不需要做什么数据迁移
缺点:
就是很可能有热点,因为id的值会一直递增变大,那这段时间的订单是不是会一直在某一张表中,
如id=2000万 ~ id=3000万之间,这段时间产生的订单是不是都会集中到此张表中,这个就导致某表过热,压力过大,而其他的表没有什么压力,空闲着。。。

最终方案采用hash取模和rang范围两者相结合

0、思路
考虑一下数据的扩容代表着路由key(如id)的值变大了,这个是一定的,那我们先保证数据变大的时候,首先用range方案让数据落地到一个范围里面。这样以后id再变大,那以前的数据是不需要迁移的。
但又要考虑到数据均匀,那是不是可以在一定的范围内数据均匀的呢?
因为我们每次的扩容肯定会事先设计好这次扩容的范围大小,会做好约定,我们只要保证这次的范围内的数据均匀是不是就ok?
1、设计+方案
在这里插入图片描述
在这里插入图片描述

根据上两图id=15000在【0,1000万】范围内的,根据上面的流程设计,1000万以内的id都均匀的分配到DB_0,DB_1,DB_2三个数据库中的Table_0表中。
也就是组库表,意思就是先分组,再分库,再分表,比如说1到4000W都在分组1里边存着,分组1里边可以分为多个库,而每个库,比如说第一个库的表1就是1到1000w,第二个表就是1000W到2000W,第三个表存的是2000w到3000w,第四个表存是3000w到4000W,因为有可能库1的服务器配置性能配置比较好,所以可以这么存,而库2和其他几个库都可能服务器性能配置不太高,所以库2的表1就可以是存0到1000w,表2存1000w到2500w,表3存2500w到4000w这种,性能好的服务器配置就可以设计多一张表来存,这样大范围的定下来,然后在组库表里边进行取模定位数据。
2、定位数据如何进行定位?
定位查询id为15000的数据,首先根据范围定位是哪个分组,比如查询id为15000的数据是在分组1里边的,然后利用hash取模取表数最终结果来定位到哪个库,假设结果是到0号库,然后再根据0号库的范围来定位是最终的表。
3、为什么要根据hash取模取表数来定位哪个库呢?
因为要兼顾服务器的性能高低不同,安排服务器时,有些公司有些服务器的性能高,存储高,就可以安排多存放些数据,多劳多得;有些服务器的性能低,就少放点数据。
这样就解决了热点问题以及可以按照服务器指标,设计数据量的分配
因为如果利用取模是按照DB总数3,进行取模,那就代表着【0,4000万】的数据是平均分配到3个DB中的,那就不能够实现按照服务器能力适当分配了。
4、扩容方案:
在这里插入图片描述

如上图所示新增的一个group02组,完全是新增的group组,谈不上什么数据迁移,
而且这个group组照样就防止了热点,也就是【4000万,5500万】的数据,都均匀分配到三个DB的table_0表中,
【5500万~7000万】数据均匀分配到table_1表中。
设计新的分组,然后也是根据服务器性能配置,如果是配置一样,就分表均匀一些,如果配置不一样,就让服务器性能高的承担更多一些
5、如果定位不是以id进行,比如 where条件并不是id,而是其他字段,这个怎么定位呢?
分库分表如果不按id查询的话,以上设定的方案都是根据id来查询的,当然这个业务可能不一样,总的一套系统肯定要按照id查询,先确定哪一张表,那么那一张表是做一个映射的,尤其是做分布式的,那么id是最准确的,如果你确定要查询其他字段,那么就要做一些kv映射,只能是这样。

标签:方案,分库,hash,取模,分表,数据,id
From: https://blog.csdn.net/Fireworkit/article/details/139435117

相关文章

  • Ansys输配电设备整体解决方案(下)
    结构场和多场耦合应用结构场仿真目的-校核强度和刚度-校核寿命-校核热应力-电磁-结构耦合应用-其他变压器箱体结构强度分析变压器模态计算•计算固有频率•确定共振点装配中的强度设计大型电气设备运输工况分析•精确模拟结构运输实际状态-公路-......
  • Spring家族中的消息通信解决方案
    相信大家对消息通信架构以及各种消息中间件应该都不陌生。在分布式系统的设计和开发过程中,消息通信是用于实现系统解耦、提高扩展性的一大技术体系。而业界关于如何实现消息通信系统也有很多解决方案和对应的开发框架。不知道你有没有发现,在我们每天都在使用到Spring框架中,实际......
  • 商淘云助力连锁门店同城引流、会员营销及连锁品牌节税整体解决方案
    随着市场竞争的日益激烈,连锁门店如何在同城范围内迅速提升品牌知名度、吸引并维护忠诚顾客群体,同时确保税务合规以降低经营成本,成为了摆在连锁品牌面前的重要课题。商淘云,作为一家专注于智慧零售解决方案的科技企业,凭借其深厚的行业经验和先进的技术实力,为连锁门店提供了一套同......
  • nginx /Java 解决跨域问题方案
    location/{#if($request_method='OPTIONS'){#add_header'Access-Control-Allow-Origin''*';#add_header'Access-Control-Allow-Methods''GET,POST,OPTIONS';......
  • 宏集ASPION高性能加速度记录仪,为您的货物运输定制专属监测方案
    一. 运输货物的荷载根据圣加仑大学的一项研究,在全球货物运输中,三分之一的货物因运输损坏而被收件人投诉。无论是由于振动还是天气的影响,物流业每天都会发生损坏,尽管原因往往还不清楚。电子数据记录器允许可靠地记录运输过程中的事件,为此,运输过程中发生的负载信息至关重要。......
  • 【git commit错误】error: bad signature 0x00000000 fatal: index file corrupt原因
    解决Git错误:error:badsignature0x00000000fatal:indexfilecorrupt原因分析及解决方案在使用Git进行版本控制时,可能会遇到各种错误。其中之一是关于索引文件(通常为.git/index)损坏的错误,这会导致无法正常提交更改。基础知识Git索引:Git使用一个索引文件来跟踪工作目......
  • 反向海淘代购系统|pandabuy系统方案|系统流程讲解:引领全球购物新潮流
    随着全球化的深入发展和互联网技术的不断进步,人们的购物方式也在发生着翻天覆地的变化。反向海淘代购系统作为这一变革的杰出代表,正逐渐走进大众视野,为消费者带来前所未有的全球购物体验。一、反向海淘代购系统的定义传统的海淘模式主要是中国消费者通过跨境电商平台购买国......
  • 大型零售企业总部到分公司数据发放,有没有更优化的方案?
    大型零售企业在市场经济中扮演重要角色,是保证基础商品生产、流通和供给的重要一环。随着企业发展,很多大型零售企业都会在全国、乃至全球各地开设分公司,用以降低生产和运营成本,更好地提供本地化服务。为了保证总部与分公司间信息通畅,同时,总部和分公司间的业务数据、客户数据等重......
  • 如何设计兜底方案(高可用)
    场景:很多时候,在同步数据时,都会有一个重新推送的按钮,不管是重新推送还是重新拉去。这些动作都是失败后,再次操作,直到成功。这种设计的原因是,程序的运行,不知道什么原因会失败。网络、数据库、服务器,B服务BUG都会导致这段代码执行失败,从而无法保证该功能准确执行。在设计的设计中......
  • 游戏开发:基础模块之任务系统设计方案
    写一写游戏项目的基础模块的实现思路,之任务系统:起引导、活跃、成就等作用的任务系统,是游戏常见的业务需求;实现上可以分为几个部分:任务类设计;任务对象管理;事件管理;hook机制;一.事件管理模块一个以事件类型(eventtype)为单位,进行注册和回调触发的管理模块。模块需要实现......