批量数据迁移方案

  • 内容
  • 评论
  • 相关

目前有一个分布式文件系统Lustre,组建Lustre分布式系统的磁盘已经满负荷运行超过5年,磁盘故障频发,基本上每个星期都会有磁盘损坏,为了不影响基于该Lustre的分布式HPC系统的正常使用以及用户数据的安全,磁盘替换与RAID重建工作很可能赶不上磁盘坏掉的速度,而且RAID重建过程中,如果另一个磁盘损坏,将会导致RAID阵列崩溃,如果不能及时正确处理,数据将会不可逆丢失。

有两种方案来保证数据安全和上层系统的使用。第一,批量更换快损坏的磁盘,该方法成本小,但是耗时,风险大,另外,之前也没有统计磁盘的损耗信息,因此操作困难。还有一种方式是,把所有磁盘都更换,逐一更换每个RAID的每块磁盘,但是速度慢,而且风险特别大。除非上层系统停机,文件系统负载不大,这种方式才可行,而这种方式将会导致系统停机或不可用,或者是系统服务降级。第二种方案是,重建一套新的文件系统,基于新的设备,然后将所有用户逐渐切换到新的文件系统上来。该方法需要的时间长,需要比较高的成本,但是不会导致现有系统停机。

目前我们采用的是第二种方案,正好集群无人值班,停机了。于是我实施第三种方案,直接将老文件系统的文件全部迁移到新的系统上来,系统开机之后,直接使用新的文件系统。老文件系统中目前有33T用户数据,数据量还不算大,但是如果直接拷贝,将会存在问题,第一,网络带宽不够,第二,小文件不少,因此无法发挥系统和网络的性能。第三,时间短,需要尽快将数据迁移完。

我们采用了rsync命令来进行数据拷贝,并且采用了Infiniband网络,该网络理论的最高速度是56GB/s,但是在单机上执行该命令,实际的文件传输速率非常低,只有20-80MB/s,最高带宽之后在文件是大文件的情况下才可以达到。按照最高速率80MB/s的速度来计算,将所有文件迁移完需要的时间是5天,而实际用户小文件多,导致迁移时间在5-10天左右。

于是开始思考,如何才能提高文件的迁移速度呢?既然新购买的文件系统是分布式文件系统,我的第一个想法就是,采用多个进程来进行数据迁移工作。于是马上开始做起来,但是如何为每个进程分配任务呢,我采用了静态的方式,就是,将需要拷贝的目录平均分为6份,每个进程同步其中一份目录列表,于是文件迁移的速度明显提高了,注意,文件迁移时,所有的进程并不是在同一个机器上,而是分布在不同的机器上,这样可以降低多个进程抢占主机物理带宽的问题。开启6个进程后,迁移的速度提高了不少,平均下来是150MB-200MB/s的速度了,速度提高了近一倍啦。但是,很快发现,有的进程已经完成了任务,但是其他进程还在忙碌,经过分析发现,不同的目录的大小不一样,所以可能存在着任务分布不均匀的情况。于是我进行了再次处理,我首先扫描,找出空间占用比较大的几个目录,然后单独将这几个目录用单独的进程进行文件迁移,文件迁移的效率得到进一步提高,目前的文件迁移速度平均在350MB/s-450MB/s,速度在优化的基础上又提高了一倍。

这种采用多个进程进行文件迁移的想法确实很不错,提高了迁移速度,但是有一个问题需要解决,如果进行任务分配,是需要我们进一步考虑的,每个进程分配多少个任务,每个主机分配多少进程,都需要我们研究一个算法去进行动态分配和调度,这样才能真正做到高速进行数据迁移。期待下一次能够将该功能实现。