如何解决数据迁移和热点问题?

1. 前言

上一篇文章 什么是数据库分库分表? 介绍了常规的分库分表的方案,各有优缺点:

  • hash取模方案:没有热点问题,但需要数据迁移。

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

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

如何永不迁移数据和避åçƒ­ç‚¹? æ ¹æ®æœåŠ¡å™¨æŒ‡æ ‡åˆ†éæ•°æ®é‡(assets/94acc40518b54b81be877b93b6db167e.jfif)

2. 方案思路

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

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

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

[外链图片转存失败(img-IYg2fsLJ-1565765065322)(assets/640-1565763537250.webp)]

3. 方案设计

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

如何永不迁移数据和避åçƒ­ç‚¹? æ ¹æ®æœåŠ¡å™¨æŒ‡æ ‡åˆ†éæ•°æ®é‡(assets/b03ffc16c8004f60a556ad7bcb8d56b4.jfif)

上图有几个关键点:

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

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

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

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

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

如何永不迁移数据和避åçƒ­ç‚¹? æ ¹æ®æœåŠ¡å™¨æŒ‡æ ‡åˆ†éæ•°æ®é‡(assets/9787c5036dca41119ac3ea642584952d.jfif)

4. 主流程

如何永不迁移数据和避åçƒ­ç‚¹? æ ¹æ®æœåŠ¡å™¨æŒ‡æ ‡åˆ†éæ•°æ®é‡(assets/c0a1222626cc44a8863910f08dd70d49.jfif)

按照上面的流程,我们就可以根据此规则,定位一个id,我们看看有没有避免热点问题。

我们看一下,id在【0,1000万】范围内的,根据上面的流程设计,1000万以内的id都均匀的分配到DB_0,DB_1,DB_2三个数据库中的Table_0表中,为什么可以均匀,因为我们用了hash的方案,对10进行取模

为什么对表的总数10取模,而不是DB的总数3进行取模?我们看一下为什么DB_0是4张表,其他两个DB_1是3张表?

在我们安排服务器时,有些服务器的性能高,存储高,就可以安排多存放些数据,有些性能低的就少放点数据。如果我们取模是按照DB总数3,进行取模,那就代表着【0,4000万】的数据是平均分配到3个DB中的,那就不能够实现按照服务器能力适当分配了。

按照Table总数10就能够达到,看如何达到

如何永不迁移数据和避åçƒ­ç‚¹? æ ¹æ®æœåŠ¡å™¨æŒ‡æ ‡åˆ†éæ•°æ®é‡(assets/078cbc51a5a545f2839a859fb4b14425.jfif)

上图中我们对10进行取模,如果值为**【0,1,2,3】就路由到DB_0,【4,5,6】路由到DB_1,【7,8,9】路由到DB_2**。现在小伙伴们有没有理解,这样的设计就可以把多一点的数据放到DB_0中,其他2个DB数据量就可以少一点。DB_0承担了4/10的数据量,DB_1承担了3/10的数据量,DB_2也承担了3/10的数据量。整个Group01承担了【0,4000万】的数据量。

注意:小伙伴千万不要被DB_1或DB_2中table的范围也是0~4000万疑惑了,这个是范围区间,也就是id在哪些范围内,落地到哪个表而已。

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

如何永不迁移数据和避免热点? 根据服务器指标分配数据量(assets/980fe1ae075d4859a525a52f61c150bf.jfif)

5. 如何扩容

其实上面设计思路理解了,扩容就已经出来了;那就是扩容的时候再设计一个group02组,定义好此group的数据范围就ok了。

如何永不迁移数据和避åçƒ­ç‚¹? æ ¹æ®æœåŠ¡å™¨æŒ‡æ ‡åˆ†éæ•°æ®é‡(assets/28c69dd42393442d8f98aa2bba11cfa9.jfif)

6. 系统设计

如何永不迁移数据和避åçƒ­ç‚¹? æ ¹æ®æœåŠ¡å™¨æŒ‡æ ‡åˆ†éæ•°æ®é‡(assets/94b0426db8ca4098b013d65076bac294.jfif)

思路确定了,设计是比较简单的,就3张表,把group,DB,table之间建立好关联关系就行了。

group和DB的关系

如何永不迁移数据和避免热点? 根据服务器指标分配数据量(assets/e55df04aae914aa19a12b97efe1ebce1.jfif)

table和db的关系

如何永不迁移数据和避免热点? 根据服务器指标分配数据量(assets/78a91b767cdc450bba43927ae31dd88a.jfif)

上面的表关联其实是比较简单的,只要原理思路理顺了,就ok了。小伙伴们在开发的时候不要每次都去查询三张关联表,可以保存到缓存中(本地jvm缓存),这样不会影响性能

如何永不迁移数据和避免热点? 根据服务器指标分配数据量(assets/ed91b2ef19c345ecb8bbc72ac5113ab1.jfif)

一旦需要扩容,小伙伴是不是要增加一下 group02 关联关系,那应用服务需要重新启动吗?

简单点的话,就凌晨配置,重启应用服务就行了。但如果是大型公司,是不允许的,因为凌晨也有订单的。那怎么办呢?本地jvm缓存怎么更新呢?

其实方案也很多,可以使用用zookeeper,也可以使用分布式配置,这里是比较推荐使用分布式配置中心的,可以将这些数据配置到分布式配置中心去。

到此为止,整体的方案介绍结束,希望对小伙伴们有所帮助。谢谢!!!

这边隐含了一个关键点,那就是路由key(如:id)的值是非常关键的,要求一定是有序的,自增的,这个就涉及到分布式唯一id的方案,下一篇文章会介绍如何设计一个分布式主键

整体的方案介绍结束,希望对小伙伴们有所帮助。谢谢!!!**

这边隐含了一个关键点,那就是路由key(如:id)的值是非常关键的,要求一定是有序的,自增的,这个就涉及到分布式唯一id的方案,下一篇文章会介绍如何设计一个分布式主键

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
云计算是目前计算机领域研究与应用的热点之一,其目的是设计出一种全新的信息应用模式,把用计算资源变得像生活中用电、用水一样方便。因特网技术的发展和计算机技术的进步拉开了云计算时代的帷幕。更加廉价、更加强大的处理器和软件即服务的计算架构使得数据中心变成一个可扩展的服务池。不断增大的带宽和稳定的网络使得用户能够从远程数据中心取得更可靠的数据和软件服务。    把数据迁移到云中带来了巨大的方便,因为用户不再直接与复杂的硬件打交道。云计算应用的先驱简单存储服务(S3)和弹性云计算服务(EC2)就是两个著名的例子。这类基于因特网的服务提供了存储空间和可订购的计算服务。随着全球各大公司对云计算研究的展开,云计算的安全问题也开始浮出水面。保护云计算系统的数据机密性和完整性,使云计算系统数据具有更高的可靠性成为目前云计算研究与应用的重点和熟点。云计算安全性的解决关系到云计算的成败,已经成为云计算发展的关键因素。    本文首先从云计算面临的安全威胁出发,指出云计算的数据安全问题是云计算安全的研究重点。通过对目前采用的云计算技术的研究,提出了云计算的数据安全模型-云计算多维数据安全模型C2MDSM。该模型以开源的云计算技术架构HDFS为研究对象,分析了其安全要素,给出了云计算安全模型的形式化描述,并给出了云计算模型的实现描述,同时还对安全模型进行了扩展分析。    其次,在给出云计算数据安全模型后,为了解决云计算分布式存储的数据健壮性和可用性问题,本文结合免疫学基本原理,提出了适合云计算架构的多维免疫算法。该算法以克隆算法为改进对象,结合云计算韵特征,是一种面向云的免疫算法。    最后,本文给出了多维免疫在云计算数据安全中的具体应用,结合C2MDSM模型和多维免疫算法,对云计算的数据安全因素进行定量分析,给出了实现云计算数据安全韵详细设计方法。本文还设计了云计算的数据安全仿真系统DSSim,通过仿真分析表明C2MDSM模型结合多维免疫算法后能够极大的提高云计算系统的数据安全性和可靠性,使得云计算系统具备一定的入侵容忍和容错能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值