Linux下nc、tar、pigz主机间传输文件
以前在linux下传输文件,特别一些大文件以及很多小文件,tar+nc的传输方式。
实际上很简单:
在A机器上执行:
tar -cvzf - /data/orcl/users01.dbf | nc -l 55555
在B机器上执行:
nc A_IP 55555 | tar xvzf - -C /tmp
--注意:-czf 后面有一个-,我曾经忘记写,导致1个文件破坏(切记!!!)。这样解压在B机器的/tmp目录。
--也可以使用j参数替换z,这样解压缩采用bzip2.
--另外注意端口不要冲突(也就是没有别的应用软件不使用该端口)。
在A机器上执行:
tar -cvjf - /data/orcl.0000/users01.dbf | nc -l 55555
在B机器上执行:
nc A_IP 55555 | tar xvjf - -C /tmp
-- tar也可以指定别的压缩程序(有一些新版本还支持lzop压缩,我的测试centos 6.2)
-- -I, --use-compress-program=PROG
-- 使用lzop可以直接使用参数--lzop(好像一些版本没有这个参数)
-- 另外注意一点gzip等压缩工具,都是单线程的。如果压缩并行,可以提高效率,找到pigz可以实现。
-- 我下载的rpm包。 http://pkgs.repoforge.org/pigz/
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | pigz |nc -l 55555
解压:
nc A_IP 55555 | tar xvf - -C /tmp -I pigz
--为了获得良好的显示效果以及测试相关数据,必须安装pv软件包。执行如下:
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | gzip |nc -l 55555
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | bzip2 |nc -l 55555
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | lzop |nc -l 55555
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | pigz |nc -l 55555
--我的测试结果:[不是太精确,我仅仅做2次每种压缩方式]
gzip 1.43GB 0:00:44 [32.6MB/s]
bzip2 1.43GB 0:02:52 [8.47MB/s]
lzop 1.43GB 0:00:25 [57.1MB/s]
pigz 1.43GB 0:00:10 [ 142MB/s]
-- 很明显bzip2很慢,而pigz最好[注意:也许服务器其他应用会受很大影响],我自己一直以为lzop感觉不明显,实际上效果也不错。
--这样传输文件还有一个缺点,要在两个机器上执行相关命令,参考:
http://intermediatesql.com/wp-content/uploads/2012/05/ncp.txt
http://intermediatesql.com/linux/scrap-the-scp-how-to-copy-data-fast-using-pigz-and-nc/
#! /bin/bash
FILE_FULL=$1
REMOTE_HOST=$2
FILE_DIR=$(dirname $FILE_FULL)
FILE_NAME=$(basename $FILE_FULL)
LOCALHOST=$(hostname)
ZIP_TOOL=pigz
NC_PORT=8888
tar -cf - -C $FILE_DIR $FILE_NAME | pv -s `du -sb $FILE_FULL | awk '{s += $1} END {printf "%d", s}'` | $ZIP_TOOL | nc -l $NC_PORT &
ssh $REMOTE_HOST "nc $LOCALHOST $NC_PORT | $ZIP_TOOL -d | tar xf - -C $FILE_DIR"
--写这样一个shell脚本,命名ncp! ,执行如下:
ncp! /tmp/data/orcl_20121108.bak/users01.dbf remote_host
-- 注意一点:脚本使用覆盖方式,远端的文件[相同路径的文件将会覆盖,并且这个目录要存在,不然会报错]将会覆盖!使用要注意这点。
-- 而且我做了一些修改.而且主机名必须存在/etc/hosts文件中,总之写的不是太严谨,谨慎使用!
-- 如果有错,可能要杀一些后台进程。
我做一点小修改:
#! /bin/bash
FILE_FULL=$1
REMOTE_HOST=$2
FILE_DIR=$(dirname $FILE_FULL)
FILE_NAME=$(basename $FILE_FULL)
LOCALHOST=$(hostname)
ZIP_TOOL=pigz
NC_PORT=55555
tar -cf - -C $FILE_DIR $FILE_NAME | pv -s `du -sb $FILE_FULL | awk '{s += $1} END {printf "%d", s}'` | $ZIP_TOOL | nc -l $NC_PORT &
ssh $REMOTE_HOST "mkdir -p $FILE_DIR; [-e $FILE_FULL ] || nc $LOCALHOST $NC_PORT | $ZIP_TOOL -d | tar xvf - -C $FILE_DIR"