有幸我遇到这样一个数据迁移场景: 有很多小文件散落到在不同的文件夹,我需要将这些小文件按照一定的规则找出来,然后将他转移到另外的一个文件系统。如果看到这个可能还会说这个场景不算奇葩,但是事情往往就是万万想不到,这个场景之下有一个比较恶心的网络策略限制,本来数据要从a机器传到b机器,但是a机器只能联通b机器的80端口。
开始我想通过ssh隧道技术将本地的ssh端口转接到80端口,可是这样一搞,ssh直接拒绝连接,我猜测ssh做了特别严格的限制,这也就意味着scp的方式是没办法了。
然后又想ftp能不能做到,可是ftp和nfs很类似,有专用的控制端口和数据传输端口,也就是说ftp至少需要两个端口才能完成数据传输。
网上有两个办法比较可行: nc -l 80 > file nc ip 80 < file 这种方式有一个缺陷,每次有且只能有一个客户端传输数据,否则数据就会混淆 不过这样的方式比较临时和轻便,是一个非常临时的高级办法。
开始我对rsync有一个错误的认识,我总以为rsync是一个同步对比文件夹的软件,把他的重点放在了文件的同步对比上了,rsync可以使用指定的单一端口完成大批量文件的同步传输,算是比较好的利器。如果rsync有比较强悍的php扩展就更加牛逼了,可以做非常好的文件同步服务。对业务的种种咳咳要求会比较ok
另外本次中我发现众多小文件打包也是一个难点,小文件太多,如果tar的时候再压缩,耗费的资源就会很多,进而大大影响效率,建议仅仅在数据传输的时候进行压缩,这样节省带宽和流量。 如果有需要可以采用虚拟磁盘镜像的技术采用多进程的方式对文件进行copy,这样能很快将大量小文件打包。