记一次10TB级别的对象存储数据迁移

2022-03-14 11:57:33 浏览数 (2)

背景

抛开业务背景保密不谈,技术背景为提升网络可靠性,需要将存储在对象存储平台A的文件迁移到对象存储平台B上。两个平台的技术差异很小,可以忽略。

数据量

有大约10个Bucket,总计约10TB数据量,文件数量约5万千。

迁移方案

迁移数据流设计

由于带宽和服务器等限制,计划使用一台中转服务器,负责从平台A下载文件到中转服务器,然后再上传到平台B。之所以这么设计,是考虑到了传输失败的可能性,如果设计为从A下载后不保存为文件,直接上传到B,一旦失败,则需要重新从A下载,因数据量太大,就考虑分步执行,可以分步重试,降低带宽压力,同时中转服务器上的文件也可以作为备份使用。

迁移量安排

由于数据量太大,带宽却不够,完成数据迁移需要大约半个月时间,安排停服半个月迁移是完全不可能的,因此考虑全量 增量的迁移方式。迁移前期,全量遍历所有bucket内的文件进行迁移,而在此期间,文件可能发生新增、删除和变更,这就需要在迁移切换之前和之后做增量迁移。

全量迁移

因数据量大,文件多,采用多线程的方案对文件进行迁移,必须记录和校验每个文件的迁移结果,以防遗漏

增量迁移

全量迁移完成后,这段时间发生变化的文件,需要在迁移切换之前和迁移切换之后,进行再次迁移。可以对迁移的文件结果进行记录,如在中转服务器和B上是否已存在该文件,如存在则不处理,不存在则执行迁移。迁移切换前做一次,可以保证迁移切换之后再做一次的耗时最短。迁移切换之后做一次,可以保证所有A的文件都能迁移到B。

优先文件迁移清单

如果业务可以承受短时间少数文件的缺失,并要提前开启服务,可以考虑优先文件同步清单方案。该方案旨在将业务常用,或近期要使用的文件清单找出来,并在迁移切换后优先迁移,这样就可以在全量扫描增量同步的长耗时中,把这部分文件优先迁移过来,快速恢复服务。

文件权限校验和设置

对象存储上的文件,有可能全是公开的也有可能全是私密的,这是两种比较好处理的情况,在迁移的时候直接设置即可。但是一旦研发不能保证权限是否公开或私密时,需要运维对其进行校验,并保证迁移后的权限一致性。

迁移状态记录和校验

可以使用redis对每个文件的迁移状态进行记录,包括迁移是否完成,迁移文件的md5值等校验值。每次迁移之后,需要对redis的所有记录进行比对,确保迁移的数量和内容的一致性。

账号迁移

需要考虑到账号迁移的环节,避免到时候紧急开通检查时间不足,导致权限问题的发生。

账号禁用

迁移完成后需禁用业务使用的账号,保证其不会再从A访问资源,避免迁移遗漏。

回退方案

一旦迁移不顺,或者有其他突发情况导致必须回退,除业务考虑外,对象存储本身无需太多操作,启用账号即可。如果业务已经在B产生了文件变更,需要查出来这部分变更清单,并将这部分文件反向同步到A上去。

研发配合

在研发角度,对象存储迁移,可能需要考虑几个问题:

1,对象存储的地址,是怎么存储到数据库中的?理想情况,endpoint、bucket name作为服务配置存储,修改一处全部生效,path则为每个文件单独存储。那么,实际的endpoint、bucket name、path这些是不是分别存储的?如果endpoint、bucket name存储到每个文件路径中了,迁移后如何处理?是否需要修数?还是修改程序对文件路径的组装方式?需要按实际情况进行评估。

2,是否需要兼容迁移前后的地址,优先从迁移后的地址进行读写,找不到文件则从迁移前的地址读取。这么做可以防止迁移出现完整一致性问题时,影响业务,但是会消耗更多时间人力来完成迁移。

总结

数据量大的数据迁移,除了基本的完整一致性考虑之外,还要更多地考虑时效性,以满足业务需求。抛开技术,执行数据迁移需要和业务方做好沟通,各种风险和安排都通知到位,才能把事情做得漂亮。

题外话

这里吐槽几个对象存储的不好的使用案例,引以为戒。

1,对象存储的配置元信息和业务信息没有分开。比如说,将Endpoint, Bucketname, AccessKeyID, AccessKeySecret直接和Path混合,并存储到数据库中。一旦前四项配置任何一个发生变更,都需要对数据库内的数据进行修正,才能保持数据正确。理想的做法是:前四项配置作为服务配置存储到一个位置,服务读写的时候,将其组装起来使用,一旦发生变更,只需修改一处即可。

2,账户安全防范措施较差,比如将AccessKeyID, AccessKeySecret分享给用户直接使用。应该使用AccessKeyID, AccessKeySecret生成临时的带指纹的文件链接,过期失效,不会泄漏认证信息。或者本来应该私密的文件,被暴露到公网环境中,且没有定期巡检。

3,大文件的上传下载,使用服务后端中转。抛开一些需要中转处理的情况,在做好安全管控的前提下,可以将对象存储的上传下载等文件传输操作,直接交给前端--对象存储服务来交互,减少中间环节,提升传输效率,特别是文件较大的情况。

4,对象存储上创建目录,对象存储的本质是键值对存储,键的常规用法有点像文件路径,值就是文件。一个目录实际上就是一个键是目录字符串,值是目录类型的文件,用处不大,要目录直接上传带该目录路径的文件即可。

0 人点赞