取模是什么意思_什么是数据库分库分表?
1.前⾔
中⼤型项⽬中,⼀旦遇到数据量⽐较⼤,⼩伙伴应该都知道就应该对数据进⾏拆分了。有垂直和⽔平两种。
垂直拆分⽐较简单,也就是本来⼀个数据库,数据量⼤之后,从业务⾓度进⾏拆分多个库。如下图,独⽴的拆分出订单库和⽤户库。
⽔平拆分的概念,是同⼀个业务数据量⼤之后,进⾏⽔平拆分。
上图中订单数据达到了4000万,我们也知道mysql单表存储量推荐是百万级,如果不进⾏处理,mysql单表数据太⼤,会导致性能变
慢。使⽤⽅案可以参考数据进⾏⽔平拆分。把4000万数据拆分4张表或者更多。当然也可以分库,再分表;把压⼒从数据库层级分开。
1.1垂直拆分和⽔平拆分区别
1.1.1垂直拆分
数据库的垂直拆分:对业务表进⾏分类,不同的业务表划分到不同的数据库⾥。这种形式的拆分往往是便随着服务化改造,按功能模块将
原来强耦合的系统拆分为多个弱耦合的服务,此时往往就会进⾏数据库的垂直拆分。
数据表的垂直拆分:是针对于数据表列的拆分,把⼀张列⽐较多的表拆分为多张表。
垂直拆分的优点:
数据库的拆分简单明了,拆分规则明确。
应⽤程序模块清晰明确,整合容易。
数据维护⽅便易⾏,容易定位。
垂直拆分的缺点:
部分表关联⽆法在数据库级别完成,需要在程序中完成。
单表⼤数据量仍然存在性能瓶颈。
事务处理相对更为复杂。
拆分达到⼀定程度之后,扩展性会遇到限制。
1.1.2⽔平拆分
把⼀个表的数据按照某种规则化分到不同表或数据库⾥(⽔平拆分是按照⾏数据拆分)。
⽔平拆分的优点:
解决单表单库⼤数据量和⾼热点访问性能遇到瓶颈的问题;
应⽤程序端整体架构改动相对较少。
事务处理相对简单。
只要切分规则能够定义好,基本上较难遇到扩展性限制。
⽔平拆分缺点:
拆分规则相对更复杂,很难抽象出⼀个能够满⾜整个数据库的切分规则。
后期数据的维护难度有所增加,⼈为⼿⼯定位数据更困难。
产品逻辑将变复杂。⽐如按年来进⾏历史数据归档拆分,这个时候在页⾯设计上就需要约束⽤户必须要先选择年,然后才能进⾏查询。
总⽽⾔之
1.数据表垂直拆分:单表复杂度。
2.数据库垂直拆分:功能拆分。
3.⽔平拆分:分表:解决单表⼤数据量问题。分库:为了解决单库性能问题。
2.分库分表⽅案
分库分表⽅案中有常⽤的⽅案,hash取模和range范围⽅案;分库分表⽅案最主要就是路由算法,把路由的key按照指定的算法进⾏路由存
放。接下来介绍⼀下两个⽅案的特点。
2.1hash取模⽅案
在我们设计系统之前,可以先预估⼀下⼤概这⼏年的订单量,如:4000万。每张表我们可以容纳1000万,也我们可以设计4张表进⾏存
储。
那具体如何路由存储的呢?hash的⽅案就是对指定的路由key(如:id)对分表总数进⾏取模,上图中,id=12的订单,对4进⾏取模,
也就是会得到0,那此订单会放到0表中。id=13的订单,取模得到为1,就会放到1表中。为什么对4取模,是因为分表总数是4。
优点
订单数据可以均匀的放到那4张表中,这样此订单进⾏操作时,就不会有热点问题。
热点的含义:热点的意思就是对订单进⾏操作集中到1个表中,其他表的操作很少。订单有个特点就是时间属性,⼀般⽤户操作订单数
据,都会集中到这段时间产⽣的订单。如果这段时间产⽣的订单都在同⼀张订单表中,那就会形成热点,那张表的压⼒会⽐较⼤。
缺点
将来的数据迁移和扩容,会很难。
如:业务发展很好,订单量很⼤,超出了4000万的量,那我们就需要增加分表数。如果我们增加4个表
⼀旦我们增加了分表的总数,取模的基数就会变成8,以前id=12的订单按照此⽅案就会到4表中查询,但之前的此订单时在0表的,这样就
导致了数据查不到。就是因为取模的基数产⽣了变化。
遇到这个情况,我们⼩伙伴想到的⽅案就是做数据迁移,把之前的4000万数据,重新做⼀个hash⽅案,放到新的规划分表中。也就是我们
要做数据迁移。这个是很痛苦的事情。有些⼩公司可以接受晚上停机迁移,但⼤公司是不允许停机做数据迁移的。
当然做数据迁移可以结合⾃⼰的公司的业务,做⼀个⼯具进⾏,不过也带来了很多⼯作量,每次扩容都要做数据迁移
那有没有不需要做数据迁移的⽅案呢,我们看下⾯的⽅案
2.2range范围⽅案
range⽅案也就是以范围进⾏拆分数据。
range⽅案⽐较简单,就是把⼀定范围内的订单,存放到⼀个表中;如上图id=12放到0表中,id=1300万的放到1表中。设计这个⽅案时
就是前期把表的范围设计好。通过id进⾏路由存放。
优点
我们⼩伙伴们想⼀下,此⽅案是不是有利于将来的扩容,不需要做数据迁移。即时再增加4张表,之前的4张表的范围不需要改变,id=12
的还是在0表,id=1300万的还是在1表,新增的4张表他们的范围肯定是⼤于4000万之后的范围划分的。
缺点
有热点问题,我们想⼀下,因为id的值会⼀直递增变⼤,那这段时间的订单是不是会⼀直在某⼀张表中,如id=1000万~id=2000万之
间,这段时间产⽣的订单是不是都会集中到此张表中,这个就导致1表过热,压⼒过⼤,⽽其他的表没有什么压⼒。
总结
hash取模⽅案:没有热点问题,但扩容迁移数据痛苦
range⽅案:不需要迁移数据,但有热点问题。
那有没有⼀个⽅案,即不需要迁移数据,⼜能解决数据热点的问题呢?
本文发布于:2022-11-25 14:33:15,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/19046.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |