`
不平凡的人
  • 浏览: 35426 次
  • 性别: Icon_minigender_1
  • 来自: 嘉峪关
社区版块
存档分类
最新评论

分库分表?如何做到永不迁移数据和避免热点?

 
阅读更多

一、前言

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

 

垂直拆分比较简单,也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库。如下图,独立的拆分出订单库和用户库。


水平拆分的概念,是同一个业务数据量大之后,进行水平拆分。

上图中订单数据达到了4000万,我们也知道mysql单表存储量推荐是百万级,如果不进行处理,mysql单表数据太大,会导致性能变慢。使用方案可以参考数据进行水平拆分。把4000万数据拆分4张表或者更多。当然也可以分库,再分表;把压力从数据库层级分开。

 

二、分库分表方案

分库分表方案中有常用的方案,hash取模和range范围方案;分库分表方案最主要就是路由算法,把路由的key按照指定的算法进行路由存放。下边来介绍一下两个方案的特点。

1、hash取模方案

在我们设计系统之前,可以先预估一下大概这几年的订单量,如: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、range范围方案

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表过热,压力过大,而其他的表没有什么压力。

3、总结:

hash取模方案:没有热点问题,但扩容迁移数据痛苦

range方案:不需要迁移数据,但有热点问题。

那有什么方案可以做到两者的优点结合呢?,即不需要迁移数据,又能解决数据热点的问题呢?

其实还有一个现实需求,能否根据服务器的性能以及存储高低,适当均匀调整存储呢?

 

三、方案思路

hash是可以解决数据均匀的问题,range可以解决数据迁移问题,那我们可以不可以两者相结合呢?利用这两者的特性呢?

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

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

 

四、方案设计

我们先定义一个group组概念,这组里面包含了一些分库以及分表,如下图

上图有几个关键点:

1)id=0~4000万肯定落到group01组中

2)group01组有3个DB,那一个id如何路由到哪个DB?

3)根据hash取模定位DB,那模数为多少?模数要为所有此group组DB中的表数,上图总表数为10。为什么要去表的总数?而不是DB总数3呢?

4)如id=12,id%10=2;那值为2,落到哪个DB库呢?这是设计是前期设定好的,那怎么设定的呢?

5)一旦设计定位哪个DB后,就需要确定落到DB中的哪张表呢?

 

 

分享到:
评论

相关推荐

    分库分表:如何做到永不迁移数据和避免热点?.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...

    48_你们当时是如何把系统不停机迁移到分库分表的?.zip

    标题中的“48_你们当时是如何把系统不停机迁移到分库分表的?”提示了本次讨论的主题,即如何在不...以上就是对系统不停机迁移到分库分表这一主题的详细解析,具体的技术细节和实践操作可以参考提供的文档和图片资料。

    47_来来来!咱们聊一下你们公司是怎么玩儿分库分表的?.zip

    4. **挑战与应对**:分库分表带来的挑战包括跨库事务一致性、分布式主键生成、数据迁移以及查询复杂度增加等。对于分布式事务,可以采用两阶段提交、补偿事务(TCC)或最终一致性模型来解决;分布式主键可利用雪花算法...

    数据分库分表之二叉树分库分表

    分库分表主要有两种形式:水平分库分表和垂直分库分表。本文着重讨论的是水平分库分表,即不改变表结构的情况下,将表中的数据分散到不同的数据库或表中。 ##### 2.2 水平分库分表的关键问题 水平分库分表的核心...

    分库分表,多数据源的切换

    总之,分库分表和多数据源切换是解决大数据量场景下的重要手段。Sharding-JDBC作为优秀的开源框架,为开发者提供了便捷、高效、灵活的解决方案。通过学习和实践SSMDemo,我们可以更好地理解和掌握这一技术,从而优化...

    MySQL 分库分表的实现原理及演示案例

    在进行分库分表时,开发者和数据库管理员需要注意数据一致性、事务管理、以及数据迁移等问题。在数据一致性方面,需要考虑到分布式环境下CAP理论的限制,即在保证数据一致性的同时,可能要牺牲系统的可用性或分区...

    Python+MySQL分表分库实战

    同时,本教程还将指导读者如何进行数据迁移和查询操作,确保在分表分库后依然能够高效地对数据进行管理。 在分表分库的实战过程中,我们将遇到一些挑战,例如单库分表迁移数据的难题,以及多实例INSERT操作的困扰。...

    一种可以避免数据迁移的分库分表scale-out扩容方式1

    本文探讨了一种创新的分库分表扩容方式,旨在避免数据迁移,以实现更加平滑且低风险的scale-out扩容。这种方式特别适用于那些数据随着时间逐渐增长的应用场景。 传统的分库分表策略通常采用mod运算或基于时间的分片...

    49_好啊!那如何设计可以动态扩容缩容的分库分表方案?.zip

    在IT行业中,数据库的设计与管理是一项至关重要的任务,特别是在处理大数据量时,为了保证系统的高可用性、可扩展性和性能,通常需要采用分库分表的策略。标题“49_好啊!那如何设计可以动态扩容缩容的分库分表方案...

    Go 迁移Mysql数据到分库分表-migrate.zip

    在IT行业中,数据库的迁移是一项常见的任务,尤其是在大型系统中,为了提高数据处理能力和系统性能,往往会采用分库分表的策略。Go语言以其高效、简洁的特性,常被用于编写这种复杂的数据迁移工具。本篇文章将深入...

    数据库分库分表思路.docx

    数据库分库分表是应对大数据量和高并发场景下的常用策略,目的是为了减轻单个数据库的负担,提高系统的整体性能和稳定性。随着互联网业务的发展,单个关系型数据库的存储容量、连接数和处理能力往往难以满足需求。当...

    mycat 分库分表

    mycat 在 1.6.5 版本之后对分库分表的支持更加完善,提供了更高效的数据管理和处理能力。 1. **分库分表概念** 分库分表是数据库扩展的一种策略,通过将数据分散到多个数据库或表中,以减轻单一数据库的压力,提高...

    集成sharding-jdbc实现分库分表.zip

    - 数据迁移:在启用分库分表前,可能需要对已有数据进行迁移,确保数据完整性和一致性。 通过以上介绍,我们可以看到Sharding-JDBC在若依项目中的应用能够有效地提升数据库的处理能力,解决单体项目可能面临的性能...

    第五节课交易分库分表详解一1

    - **扩容挑战**:分库扩容的理想状态是无需数据迁移,同时解决数据热点。通过结合散列和范围分片,可以尝试兼顾这两个目标。 4. 热点问题解决方案: - **局部散列**:利用散列解决局部热点,通过特定策略将热点...

    数据分库分表最佳实践.docx

    数据分库分表是互联网行业中解决数据库性能和容量瓶颈的关键技术。随着业务的快速发展,数据库面临的挑战主要包括性能瓶颈和容量限制。这是因为数据库既要保证数据的一致性,又要应对快速增长的数据量,这在单机...

    分库分表数据看板项目实战

    这涉及到数据抽取、转换和加载(ETL)的过程,我们需要从分库分表中抽取数据,进行清洗和聚合,然后加载到数据分析平台,最后通过可视化图表展示出来,以便于业务人员理解和决策。 此外,项目中还会涉及到监控和...

    php mysql分库分表实例

    在分库分表后,通常需要避免跨库查询,因为这会导致性能下降。可以通过设计良好的API和业务逻辑,尽量在单个数据库中完成大部分操作。此外,还需要关注数据迁移和备份策略,确保在维护和升级过程中不会影响服务的...

    SpringCobar分库分表

    综上所述,SpringCobar结合SpringMVC和Mybatis,为大型应用提供了分库分表和读写分离的能力,有效地解决了大数据量下的性能问题。在实际项目中,我们需要根据业务特点选择合适的分片策略,合理配置Cobar,以及利用...

    java mysql 分库分表详解

    在Java和MySQL数据库环境中,分库分表是一种常见的解决大数据量和高并发问题的策略。随着互联网业务的快速发展,单个数据库往往无法满足性能和扩展性的需求,这时就需要采用分库分表技术来优化系统架构。 分库是将...

Global site tag (gtag.js) - Google Analytics