linux主机之间快速高效的拷贝大数据文件

Posted on 2018-06-06(星期三) 11:46 in Data

以前我们跨主机拷贝大数据的时候,基本思路就是:

  • 在源端打包压缩为tar.gz文件
  • 采用scp或rsync等方式拷贝到目标主机|或者在目标机wget下载
  • 在目标主机解压文件

这三个过程是同步阻塞,即不能同时异步执行,导致效率低下。 现在我们将过程优化为以数据流的方式,同时执行(非阻塞模式),则效率一般可以提高到原来的3倍以上,具体实现如下:

磁盘读取---->打包---->压缩------>传输---->解压缩-->拆包---->落盘
       |->tar  |->gzip   |->ssh   |->gzip |->tar

比如我要将本地的test目录拷贝到“目标IP”的的data目录,则命令如下:

tar -c test/ |pigz |ssh -c root 目标IP "gzip -d|tar -xC /data"

当然,这里的解压过程仍然用了效率比较低下的gzip,如果将解压工具换成lz4(但需要单独编译安装),则效率可以再提高不少。 如果不需要解压,则命令变为:

tar -c test/ |pigz |ssh -c root 目标IP "cat >/data/test.tar.gz"

注:因为采用了流式压缩,解压过程必须加上-i参数,及 tar –ixf /data/test.tar.gz

说明: pigz是一个高效的压缩工具,可以将多核CPU的每一分剩余性能都用来做压缩计算。而传统的gzip则只能用单核CPU。比如一台2个8 core cpu服务器采用pigz和gzip压缩相同的数据,一般性能差距至少在7-8倍以上(一般不会达到理论的16倍,因为受限于磁盘的读写速度和内存等资源)。

另外:如果同步的是大量的小文件,可通过多进程的方式

  • 1、使用 parallel

    ls /ssd_1/face/datasets/test | parallel -v -j10 rsync -raz --progress {} 192.168.1.190:/ssd_1/face/datasets/test/{}
    
  • 2、使用 xargs

    ls -1 /main/files | xargs -I {} -P 5 -n 1 rsync -avh /main/files/{} /main/filesTest/