海量文件快速导入
随着时间增长,企业中存储的文件数据会越来越多并且只会增多,早期由于很多企业一般都是使用FTP,SMB等工具进行文件共享,因此文件都是直接存储在系统中的,而当企业选择使用现代网盘类软件进行文件管理时,面临的主要问题是如何快速将现有文件导入网盘系统中,但如果现有文件量很大,比如100TB规模以上(在中大型企业中比较常见),那么以目前机械硬盘的写入速度50MB/S(企业处于成本考虑,大规模存储通常都是使用机械硬盘),理想情况下,导入这些文件耗时约25天,由于在导入过程中需要进行大量的计算工作,实际耗时可能比这长得多。在这种情况下,企业可能需要长达1个月以上的准备时间才能启用新的网盘系统来管理文件,这是不可接受的,因为在这一段长时间的"真空期"中,企业对现有共享文件的任何修改都可能导致和后续导入的文件数据不一致,这很难处理。
针对上面的问题,我们提出一种快速文件导入方法:先导入目录和文件信息等结构化信息,之后可以立即启用网盘系统并进行正常文件管理,后续延迟载入文件数据。这样可以大大缩减文件导入时间,导入耗时将和存储容量无关,仅和文件数量有关,由于数据库通常存储在固态硬盘中,且处理速度极快,这样千万级别的文件数量可能仅需要1~2天的时间就可以完成导入,完全可以覆盖大多数企业现存文件数量上限。文件数据将在后续延迟载入,但 这并不影响载入前对文件的正常访问,我们会为网盘中的文件信息和文件原数据之间建立一种映射关系,以支持对未载入数据的访问。
由于企业之前可能使用FTP、SMB(windows文件共享)、WebDAV等方式进行文件共享,因此我们将支持多源方式,可以很好地支持不同数据源的文件快速导入,文件快速导入后,只要数据源保持在线,则不会影响网盘中以导入文件的正常使用。多源文件导入任务的实现主要包括导入文件信息、下载兼容、延迟载入三个主要模块。任务的执行状态可能包括:导入文件信息、导入文件数据两个主要状态,每个状态耗时都比较长,需分别计算进度,在导入文件信息阶段完成后,在网盘系统中文件下载可用,在导入文件数据阶段完成后,可以移除导入源数据。
导入文件信息
导入文件信息的过程比较容易,基本思路是为导入创建一个任务,在任务中配置数据源信息和目标网盘路径信息,导入启动任务后从数据源中遍历文件信息,将目录、文件信息、块信息等结构化数据导入到悦库网盘的数据库中,为了提高效率,读取文件信息和写数据库是并行处理的。在网盘中,由于快速导入文件和正常的文件有访问差异(主要是下载),因此需要对快速导入的文件进行类型标识,用于区分。
如果文件的源支持range读取,则可以正常将文件分为多个块,如果不支持range读取则需要将整个文件数据作为一个块,为了提高导入效率,文件块并不会立即计算校验值,因为这是一个相当耗时的操作,我们将为每个块生成一个临时GUID作为块名称,并将块名称、大 小、数据源、range、对应的导入任务ID等信息写入数据库中,为后续下载文件时提供兼容性。
为了便于初次使用时需要将不同的文件夹导入到不同的悦库的文件空间中,支持批量创建导入文件任务功能,可以自动创建文件空间,并将多个源路径自动导入的对应的文件空间中,这样管理员只需要一次配置文件导入,后续等待导入任务完成即可。
下载兼容
当前目录和文件信息快速导入网盘后,用户使用客户端登录后就已经可以正常查看到这些文件,但这时我们知道文件的数据并没有真正存在于网盘的S3存储服务器中,依然在导入文件的源位置,为了兼容下载方式,让客户端用户感受不到下载差异,我们需要做一些下载兼容的工作。
当客户端下载文件时,先获取文件的块信息,这时由于SMB、WebDAV等协议不支持range读取,因此文件会作为一个整体的块信息返回,因此客户端可能实际上拿到的是一个超出自身标准的块大小,但由于客户端是通过标准S3的SDK接口下载的,这似乎没有问题,具体还需要测试下载大文件时的内存消耗情况。在获取到块信息后,客户端会向S3服务器请求下载块,这时S3代理服务会首先接收到请求,它会判断块的下载源是否S3服务器还是其他诸如FTP等第三方源,对应的从源中读取数据返回给客户端。而客户端则可以顺利获取到文件中包含的文件块数据,以完成下载操作。
延迟载入
当快速导 入完成后,文件已经可以在网盘系统中可见并可以下载,这时文件对应的数据并没有真正导入到S3存储服务器,实际还是在文件的源位置,但最终我们当然还是要将数据完全导入存储系统。
延迟载入模块在后台运行,它将找到所有还没有导入到存储服务器的块信息,读取对应的源数据,源数据可能是一个大于标准块的"巨块",这时需要和文件上传逻辑一样,将块分块校验,并上传到存储服务器中,上传完成后将重新计算的块名称(等于块MD5)和块簇更新到数据库中,这样后续客户端下载文件时,该文件将完全符合正常下载处理流程。
另外,延迟载入时,进度应该在快速导入任务中体现,这样当快速导入任务完全执行完成后,可以关闭S3代理服务器,对客户端启用S3存储服务器。
最后
通过导入文件信息、下载兼容和延迟载入三个主要模块的实现,我们可以从根本上解决海量数据导入速度慢问题,让中大型企业用户以更快的速度投入网盘系统的生产使用。