目前采用的冷热区之间数据的迁移是通过fuse访问集群数据,复制文件夹,复制完成后为保证数据完整性,再做MD5校验。
复制文件需要将文件读取一次,再写入一次,然而MD5校验也需要将文件读取一次,需要校验MD5则需要获得源文件和目的文件的MD5值,需要再读取一次源文件和目的文件,对于大数据文件时非常耗时间的。
同时,对于整个数据文件夹,一旦一个文件校验失败,整个文件夹则不可用,需要删除,所以,拷贝完成再次校验还有一个问题是,一旦出现拷贝失败的情况不能及时察觉。
对于文件的复制和校验,可以并行进行。在复制文件读取的过程中,同时计算MD5值,与源文件Md5值进行比较,校验。一个文件复制完成就开始校验,避免复制整个文件夹后校验失败的时间消耗。测试与之前方案的性能改进。
对于文件的读取,java可以设置缓存,然而对于不同的文件类型,不同的文件读取方式,缓存的选择等,都对文件的读取效率有一定的影响,可以通过实验,对比不同方式的影响,选择对应数据最佳的文件读取方式。
目前的方案都是基于fuse读取文件,相当于在glusterfs 外边再次包装一层,使用fuse会降低glusterfs 文件读取效率,所以从glusterfs 3.4就开始提供了libapi的数据访问方式,可以不经过fuse,提高文件访问效率。
但是,libapi目前只有c语言的和最新版本提供了python的调用,没有java调用接口,实际应用可能需要用java 去调用c的libapi接口,然后对比。