共计 759 个字符,预计需要花费 2 分钟才能阅读完成。
以前我们跨主机拷贝大数据的时候,比如要拷贝超过 100GB 的 mysql 原始数据,我们通常的做法如下:
- 在源端打包压缩为 tar.gz 文件
- 采用 scp 或者 rsync 等方式拷贝到目标主机
- 在目标主机解压文件
这三个过程是同步阻塞,即不能同时异步执行,导致效率低下。
现在我们将过程优化为以数据流的方式,同时执行(非阻塞模式),则效率一般可以提高到原来的 3 倍以上,具体实现如下:
磁盘读取 —-> 打包 —-> 压缩 ——> 传输 —-> 解压缩 –> 拆包 —-> 落盘
|->tar |->gzip |->ssh |->gzip |->tar
比如我要将本地的 test 目录拷贝到“目标 IP”的的 data 目录,则命令如下:
tar -c test/ |pigz |ssh -c arcfour128 目标 IP “gzip -d|tar -xC /data”
当然,这里的解压过程仍然用了效率比较低下的 gzip,如果将解压工具换成 lz4(但需要单独编译安装),则效率可以再提高不少。
如果不需要解压,则命令变为:
tar -c test/ |pigz |ssh -c arcfour128 目标 IP “cat >/data/test.tar.gz”
注:因为采用了流式压缩,解压过程必须加上 - i 参数,及 tar –ixf /data/test.tar.gz。
说明: pigz 是一个高效的压缩工具,可以将多核 CPU 的每一分剩余性能都用来做压缩计算。而传统的 gzip 则只能用单核 CPU。比如一台 2 个 8core cpu 服务器采用 pigz 和 gzip 压缩相同的数据,一般性能差距至少在 7 - 8 倍以上(一般不会达到理论的 16 倍,因为受限于磁盘的读写速度和内存等资源)。
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-02/141168.htm