分库分表零基础

news/2024/11/15 9:53:28/文章来源:https://www.cnblogs.com/gaoyanbing/p/18409681

一、前言

中大型项目中,一旦遇到数据量比较大,就应该对数据进行拆分。有垂直和水平两种 。

垂直拆分也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库。
在这里插入图片描述

水平拆分,是同一个业务数据量大之后,进行水平拆分。
在这里插入图片描述
mysql单表存储量推荐是百万级,如果不进行处理,mysql单表数据太大,会导致性能变慢。
把4000万数据拆分4张表或者更多,当然也可以分库,再分表;把压力从数据库层级分开(这里不讨论)

二、分库分表方案
常用方案:hash取模和range范围方案。分表方案最主要就是路由算法,把路由的key按照指定的算法进行路由存放。

1、hash取模方案
在这里插入图片描述
hash的方案就是对指定的路由key(如:id)对分表总数进行取模
在我们设计系统之前,可以先预估一下大概这几年的订单量,如:4000万。每张表我们可以容纳1000万,也我们可以设计4张表进行存储。

优点:
订单数据可以均匀的放到那4张表中,这样此订单进行操作时,就不会有热点问题。
热点的含义:热点的意思就是对订单进行操作集中到1个表中,其他表的操作很少。
订单有个特点就是时间属性,一般用户操作订单数据,都会集中到这段时间产生的订单。如果这段时间产生的订单 都在同一张订单表中,那就会形成热点,那张表的压力会比较大。

缺点:
将来的数据迁移和扩容,会很难。
数据迁移带来了很多工作量,每次扩容都要做数据迁移

假设业务发展很好,订单量很大,超出了4000万的量,那我们就需要增加分表数。如果我们增加4个表
在这里插入图片描述
一旦我们增加了分表的总数,取模的基数就会变成8,以前id=12的订单按照此方案就会到4表中查询,但之前的此订单时在0表的,这样就导致了数据查不到。就是因为取模的基数产生了变化。

遇到这个情况,我们小伙伴想到的方案就是做数据迁移,把之前的4000万数据,重新做一个hash方案,放到新的规划分表中。也就是我们要做数据迁移。

这个是很痛苦的事情。有些小公司可以接受晚上停机迁移,但大公司是不允许停机做数据迁移的。

2、range范围方案
就是以范围进行拆分数据
在这里插入图片描述
把一定范围内的订单,存放到一个表中。
设计这个方案时就是前期把表的范围设计好。通过id进行路由存放

优点
有利于将来的扩容,不需要做数据迁移。即时再增加4张表,之前的4张表的范围不需要改变,id=12的还是在0表,id=1300万的还是在1表,新增的4张表他们的范围肯定是 大于 4000万之后的范围划分的。

缺点
有热点问题,id的值会一直递增变大,那这段时间的订单是不是会一直在某一张表中,如id=1000万 ~ id=2000万之间,这段时间产生的订单是不是都会集中到此张表中,这个就导致1表过热,压力过大,而其他的表没有什么压力。

3、总结:
hash取模方案 :没有热点问题,但扩容迁移数据痛苦 range方案 :不需要迁移数据,但有热点问题。

即不需要迁移数据,又能解决数据热点的问题呢?
还有一个现实需求,能否根据服务器的性能以及存储高低,适当均匀调整存储呢?

三、方案思路:
我们考虑一下数据的扩容代表着,路由key(如id)的值变大了,这个是一定的,那我们先保证数据变大的时候,首先用range方案让数据落地到一个范围里面 。这样以后id再变大,那以前的数据是不需要迁移的 。

但又要考虑到数据均匀 ,那是不是可以在一定的范围内数据均匀 的呢?因为我们每次的扩容肯定会事先设计好这次扩容的范围大小 ,我们只要保证这次的范围内的数据均匀 是不是就ok了。

四、方案设计

定义一个group组概念,这组里面包含了一些分库(DB_0)以及分表(Table_0)
在这里插入图片描述
几个关键点
1)id=0~4000万肯定落到group01组中
2)group01组有3个DB,id如何路由到哪个DB?
3)根据hash取模定位DB,模数为所有此group组DB中总表数为10。
4)如id=12,id%10=2;那值为2。
5)一旦设计定位哪个DB后,就需要确定落到DB中的哪张表

核心流程
在这里插入图片描述
id在【0,1000万】范围内的,1000万以内的id都均匀的分配到DB_0,DB_1,DB_2三个数据库中的Table_0表中

安排服务器时,有些服务器的性能高,存储高,就可以安排多存放些数据,有些性能低的就少放点数据。
在这里插入图片描述
对10进行取模,如果hash值为【0,1,2,3】就路由到DB_0,【4,5,6】路由到DB_1,【7,8,9】路由到DB_2。
千万不要被DB_1或DB_2中table的范围也是0~4000万疑惑了,这个是范围区间,也就是id在哪些范围内,落地到哪个表而已。

上面就解决了热点的问题,以及可以按照服务器指标,设计数据量的分配。

五、扩容
扩容的时候再设计一个group02组,定义好此group的数据范围就ok了。
在这里插入图片描述
因为是新增的一个group02组,所以就没有什么数据迁移概念,完全是新增的组,而且这个group组照样就防止了热点,也就是【4000万,5500万】的数据,都均匀分配到三个DB的table_0表中,【5500万~7000万】数据均匀分配到table_1表中。

六、系统设计
思路确定了,3张表,把group,DB,table之间建立好关联关系。
在这里插入图片描述
在这里插入图片描述

查询三张关联表,可以保存到缓存中(本地jvm缓存),这样不会影响性能。

一旦需要扩容,小伙伴是不是要增加一下group02关联关系,那应用服务需要重新启动吗?
其实方案也很多,可以使用用zookeeper,也可以使用分布式配置,这里是比较推荐使用分布式配置中心的,可以将这些数据配置到分布式配置中心去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/795895.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PbootCms内页打不开的常见情况汇总

当遇到PBootCMS内页无法正常访问的情况时,特别是当点击任何链接都跳转到首页或内页访问报错时,通常与伪静态配置有关。以下是最简单粗暴的方案——关闭伪静态,使用兼容模式的操作步骤: 1. 关闭伪静态 步骤 1: 修改全局设置登录PBootCMS后台。 导航到“全局设置”。 找到“U…

nohup后台运行,关闭Xshell后,进程会被关闭

1.在使用nohup后台运行进程时,直接关闭远程Xshell终端窗口,发现进程就被停掉了,可以看到nohup.out日志显示停掉了2.解决方法,执行了nohup指令后,退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端 3.然后再关闭Xshell进程就不会受影响了

pbootcms模板如何实现产品置顶

要在PBootCMS中实现产品的置顶功能,你可以按照以下步骤操作:定位到模板文件:打开你的网站后台。 导航到模板管理部分,找到templates default目录下的index.html文件。修改产品列表查询参数:在index.html文件中找到展示产品列表的部分。 修改产品列表的查询参数,将order=s…

算法与数据结构——二分查找

二分查找 二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。Qustion: 给定一个长度为n的数组nums,元素按从小到大的顺序排列且不重复。请查找并返回元素target在该数组中的索引。…

栈Stack——递归替身?

对于Stack这个集合类,由类继承关系可知是Vector的子类,根据push入栈方法跟踪代码,可知Vector是一个线程安全的类(如果你用来储存大量数据,那可能不是一个好的选择)看到这里,显然可以得知Stack入栈出栈的大致原理,就是Vector的elementData对象数组,用来储存数据,入栈时…

煤矿反光衣穿戴识别系统

煤矿反光衣穿戴识别系统对视频监控画面开展实时识别分析,可以及时预警施工工地工作员是不是按照规定穿反光衣。当煤矿反光衣穿戴识别系统发现视频监控界面中有工作人员不穿反光衣时,系统会积极主动开启警报提示。工程师依据煤矿情景开展有目的的算法优化。本优化计算方法具有…

如何彻底关闭Win11自动更新?

如何彻底关闭Win11自动更新?https://www.disktool.cn/content-center/stop-windows-11-update-666.html1、“Win+R”调出运行,输入“services.msc”,回车打开服务。  2、找到“Windows update”,打开。  3、设置为“禁用”,然后点击“停止”。方案一:使用Windows设置…

释放静电行为监测识别系统

释放静电行为监测识别系统对烟花爆竹厂进入车间的入口处进行实时监测分析,当释放静电行为监测识别系统监测一部分员工进到车间之前并没有触摸静电释放仪,系统就会自动开启警报同时语音提醒工人触碰静电释放器释放静电,并把警报截屏和视频保存到下来生成表格,推送给有关人员…

监控视频行为分析系统

监控视频行为分析系统是可以通过利用现场监控摄像头传回的现场画面视频利用AI神经网络模型的人工优化算法分析识别人们运动轨迹,监控视频行为分析系统去识别监控摄像机拍摄到的各种人的异常行为,甚至很多行为识别规则大多数场景下都可以做到零误报。这大大降低了系统对硬件的…

洛谷题单指南-分治与倍增-P1966 [NOIP2013 提高组] 火柴排队

原题链接:https://www.luogu.com.cn/problem/P1966 题意解读:计算两个序列∑(ai​−bi​)^2的最小值,对10^8-3取模。 解题思路: 1、贪心思路 要使得两个序列对应位置元素之差的平方和最小,必须满足两个序列相对排序是一致的,什么意思? 设a序列有两个元素:a1,a2,b序列…

两款插件让浏览器起飞!

今天给大家分享两款最近在用的实用小插件~1.猫抓 一个用来帮我们嗅探下载网络上各种媒体资源的小插件 当我们浏览的网站有媒体文件时,插件就会自动嗅探视频资源。这时我们只需要点开插件页面,直接下载就好了。不单单是普通的媒体文件,遇见M3U8这种分段式格式,插件还会自动…