高效同步数据的方法及效率测试--边打包边压缩边传输边解压20150105

https://blog.csdn.net/xuyaqun/article/details/42422791

个人分类: 技术文档

有些时候在备份或者同步有很多文件的大目录时(比如几个GB或者几十个GB的数据库目录、log目录),直接scp的话花费的时间较长,虽然可以采用先压缩再传输再解压的方法,传输的数据量确实减少了,但压缩和解压也会耗费很多的时间,总体效果也不令人满意,昨天晚上突发奇想,由于之前做过流媒体视频点播的项目的经验,如果能像看高清视频一样只需要下载完视频文件的metadata头就可以实现边下载边播放,即渐进式下载(http://baike.baidu.com/link?url=fTWQYBTqQr1BisysCAkoqIytbwotfBYvFEMxEAlspRbNmE6b5lwVLNzA-qgw6yGlFgBepYBzqvUEb2tqQaehBK) ,那就完美了,今天在网上一搜linux还真行,兴奋之余做一下对比测试:

先上结论:

(1)总体来说,对于文本文件,压缩要比不压缩传输效率更高些,但效果不明显(因为瓶颈不在网络传输这块,而在于压缩,参见下文测试1与2,3与4的对比);

(2)采用边打包边压缩边传输边解压的流式传输方式的话,传输效率能比直接scp/rsync的方式提高35%;

(3)具体到流式传输的ssh和nc的方式上,因为nc不需要用户验证、不需要加密传输的数据,效率稍微高一点,对比效果不明显(因为瓶颈不在网络传输这块,而在于压缩);

(4)在实际使用中更倾向于采用ssh的方式,因为:可以采用push或者pull的方式,且一条命令搞定,同一个源可以有多个并发,而nc需要先在接受端监听端口,然后在发送端开始传输,需要分别执行2条命令。担心:如果在传输的同时有第三者同时向接收端的监听端口发送数据,容易造成数据的不完整性,但实际测试发现nc的接受端只能和一个发送端建立连接进行数据传输,如果正在传输数据,那么第三者发往改监听端口的数据将不会传输,只有新监听端口或者等传输完成后,再重新启用改端口进行传输,总之还是倾向于与ssh的方式。

测试环境:centos5.5  千兆局域网络

测试目录/var/log大小8.9GB

[root@cap131 ~]# du -h /var/log/
28K /var/log/prelink
8.0K /var/log/conman.old
8.0K /var/log/vbox
24K /var/log/cups
50M /var/log/redis
76K /var/log/nginx
6.1M /var/log/sa
8.0K /var/log/conman
8.0K /var/log/ppp
18M /var/log/audit
152K /var/log/php-fpm
8.8G /var/log/rabbitmq
12K /var/log/pm
16K /var/log/mail
8.9G /var/log/
[root@cap131 ~]#

1、直接纯scp拷贝的时间(5‘20’‘):

[root@cap131 ~]# time scp -r /var/log/ 192.168.1.130:/root/test-dir/

real 5m20.834s
user 3m29.049s
sys 0m41.038s

2、先打包压缩再传输再解压的时间(3’33‘’+14‘’+1‘19’‘=5’6‘’):
纯压缩的时间:

[root@cap131 ~]# time tar czf  varlog.tar.gz /var/log
tar: Removing leading `/' from member names
real 3m33.740s
user 3m28.068s
sys 0m19.081s

纯压缩后的大小:

[root@cap130 test-dir]# du  -h ../varlog.tar.gz
399M ../varlog.tar.gz

纯传输压缩包的时间:

[root@cap131 ~]# time scp varlog.tar.gz 192.168.1.130:~
root@192.168.1.130's password:
varlog.tar.gz                                                                                                       100%  399MB  30.7MB/s   00:13

real 0m14.024s
user 0m9.510s
sys 0m1.283s

纯解压的时间

[root@cap131 ~]# time tar xzf varlog.tar.gz
real 1m19.916s
user 0m49.498s
sys 0m35.588s

3、直接rysnc不启用压缩功能的传输时间(5‘12’‘):

[root@cap131 ~]# rsync -r /var/log/  192.168.1.130:/root/test-dir
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(260) [sender=2.6.8]
[root@cap131 ~]# time rsync -r /var/log/  192.168.1.130:/root/test-dir
root@192.168.1.130's password:
real 5m12.625s
user 3m55.503s
sys 0m34.568s

4、直接rsync启用压缩功能的传输时间(4’36‘’):

[root@cap131 ~]# time rsync -zr /var/log/  192.168.1.130:/root/test-dir
real 4m35.991s
user 4m40.208s
sys 0m5.306s

5、边打包边压缩边传输边解压的时间(采用ssh远程执行命令的push方式):

[root@cap131 ~]# time tar czf - /var/log  |ssh  192.168.1.130  tar xzf -  -C /root/test-dir/
tar: Removing leading `/' from member names
real 3m33.711s
user 3m37.066s
sys 0m22.210s

边打包边压缩边传输边解压的时间(采用ssh远程执行命令的pull方式):

[root@cap130 test-dir]# time ssh  192.168.1.131  tar czf  -  /var/log |tar xzf - -C /root/test-dir/
tar: Removing leading `/' from member names
real 3m33.772s
user 1m13.207s
sys 0m55.302s

6、边打包边压缩边传输边解压的时间(采用nc push的方式):

接受端监听端口10086:

[root@cap130 test-dir]# nc -l 10086 |tar xzf - -C /root/test-dir/

发送端开始传输:

[root@cap131 ~]# time tar czf - /var/log |nc 192.168.1.130 10086
tar: Removing leading `/' from member names
real 3m31.218s
user 3m27.908s
sys 0m15.839s

边打包边压缩边传输边解压的时间(采用nc pull的方式):

这种方式好像行不通!

EOF

linux(边压缩边传输边解压)

https://blog.csdn.net/menghuanhongye1987/article/details/11905439

个人分类: linux

比如我要转移旧VPS /home/wwwroot 下的web目录到新VPS(123.123.123.123)的/home/wwwroot 目录下

1.进入目录

cd /home/wwwroot 

2.压缩,传输,解压同步进行(注:此传输默认新VPS的SSH端口为22)

tar czf - web | ssh root@123.123.123.123 tar xzf - -C /home/wwwroot

黑阔横行,如果新的VPS端口已修改。(修改SSH端口方法)假设修改端口为8888.则命令应为

tar czf - web | ssh -p 8888 root@123.123.123.123 tar xzf - -C /home/wwwroot

复制代码回车之后(存在询问,输入yes)输入新VPS的密码

等就可以了,如果有流量监控软件,可以在新vps上看到呼啦呼啦的跑~

数据库导入导出,也可以类似完成.当然最好两方版本相同 。

按照LNMP 默认安装的mysql目录,需要转移的文件夹位于 /usr/local/mysql/var ,文件名为表名。

例如 现在需要转移旧VPS的数据库名为 test,转移到新VPS,可以按照如下操作

1.进入目录

cd /usr/local/mysql/var

2.压缩,传输,解压同步进行(注:此传输默认新VPS的SSH端口为22,其他端口参照上面写法)

tar czf - test| ssh root@123.123.123.123 tar xzf - -C /usr/local/mysql/var

实现一边打包一边删除文件

https://blog.csdn.net/bestlanzi/article/details/47324423

个人分类: linux编程

项目中遇到了一个棘手的问题,就是需要网络备份一个目录。该目录里有60万个文件,主机的存储的利用率达到了89%;需要将该目录中的文件传到远程windows主机上;如果使用ftp等方式传输文件,会遇到字符集乱码的问题。想到了一个方法,就是一边打包文件,一边将文件删除。利用了awk;这里记录下;

先看下目录结构

[root@bogon test]# ll
total 4
-rw-r--r--. 1 root root 0 Aug 6 07:50 a
-rw-r--r--. 1 root root 0 Aug 6 07:50 b
-rw-r--r--. 1 root root 0 Aug 6 07:50 c
-rw-r--r--. 1 root root 0 Aug 6 07:50 d
-rw-r--r--. 1 root root 0 Aug 6 07:50 e
-rw-r--r--. 1 root root 0 Aug 6 07:50 f
-rw-r--r--. 1 root root 0 Aug 6 07:50 g
-rw-r--r--. 1 root root 0 Aug 6 07:50 h
-rw-r--r--. 1 root root 0 Aug 6 07:50 i
-rw-r--r--. 1 root root 0 Aug 6 07:50 j
-rw-r--r--. 1 root root 0 Aug 6 07:50 k
drwxr-xr-x. 2 root root 4096 Aug 6 07:33 test

使用下面的方法快速进行

1、linux中,linux中tar有-remove-files参数可以这样

[root@bogon test]# find . -type f -exec tar -uvf test.tar {} --remove-files \;
./e
tar: ./test.tar: file is the archive; not dumped
./f
./a
./test/dd
./test/cc
./test/aa
./test/bb
./b
./k
./h
./j
./d
./i
./g
./c
[root@bogon test]# ll
total 16
drwxr-xr-x. 2 root root  4096 Aug  6 08:00 test
-rw-r--r--. 1 root root 10240 Aug  6 08:00 test.tar

以下方法可以把目录也打包入文件

[root@bogon test]# find . -exec tar -uvf test.tar {} --remove-files \;
./
./e
tar: ./test.tar: file is the archive; not dumped
./f
./a
./test/
./test/dd
./test/cc
./test/aa
./test/bb
./b
./k
./h
./j
./d
./i
./g
./c
tar: /root/test/.: Cannot rmdir: Invalid argument
tar: Exiting with failure status due to previous errors
tar: ./test.tar: file is the archive; not dumped
[root@bogon test]#

还可以这样:

[root@bogon test]# ls -l | awk 'NR==2 {system("tar -cvf test.tar " $9); system("rm -f " $9)} \
>  NR>2 {system("tar -uvf test.tar " $9); system("rm -f " $9)} \
> END {}'

a
b
c
d
e
f
g
h
i
j
k
test/
test/dd
test/cc
test/aa
test/bb
rm: cannot remove `test': Is a directory
[root@bogon test]# ^C
[root@bogon test]# ^C
[root@bogon test]# ll
total 16
drwxr-xr-x. 2 root root  4096 Aug  6 08:01 test
-rw-r--r--. 1 root root 10240 Aug  6 08:04 test.tar

还可以这样:这种方法能把目录也打包进去h

[root@bogon test]# ls -l | awk '\
NR==2 {system("tar -cvf test.tar " $9 " --remove-files")}
NR>2  {system("tar -uvf test.tar " $9 " --remove-files")}
'

a
b
c
d
e
f
g
h
i
j
k
test/
test/dd
test/cc
test/aa
test/bb
tar: test.tar: file is the archive; not dumped

注意:在awk中可以用system()来执行shell中语句,但是要注意括号中的双引号和空格,这里一不小心就会错。

另外,在最后肯定是打包的文件,这里要注意别把这个文件也rm -f了。所以执行一次end,为空语句,防止最后没有文件了。

边打包边压缩边传输边解压相关推荐

  1. Unity 工具类 之 WWW/UnityWebRequest 下载压缩文件(zip),解压到本地且加载使用解压数据的简单案例(内也含压缩文件例子)

    Unity 工具类 之 WWW/UnityWebRequest 网络下载压缩文件(zip),解压到本地,且加载使用解压数据的简单案例(内也含压缩文件例子) 目录 Unity 工具类 之 WWW/Uni ...

  2. 怎么使用7zip进行分批压缩_Win7系统如何让文件进行分卷压缩?分卷压缩包解压的方法...

    我们网络环境中必然需要各类数据传输,如果数据过多,在接收的时候就比较困难,然而一个叫压缩软件的应用解决了这个问题.但随之而来的另一个问题,如果压缩文件过大,传输速度就很慢,可以分卷进行传输吗?当然是可 ...

  3. 必须有下列压缩分卷才能继续解压

    必须有下列压缩分卷才能继续解压 出现这个是说明你下载的不全而提示的,看下还有哪个分卷文件没有下载,你可以看下序列号,差哪个就去下哪个 提示 分卷压缩包是一个大的文件压缩分成了多个打包的压缩文件,要放一 ...

  4. C# 关于压缩、加密、解压问题

    本文探讨的是关于C#TXT文件的压缩.加密以及解压问题,采用的是密钥方式,可以先进行加密再进行压缩包导入到桌面. 界面如下: 源文件:想要压缩的TXT文件,里边必须有东西,不然代码会报错 压缩文件:要 ...

  5. JPEG2000压缩DICOM文件的解压(一)

    JPEG2000压缩DICOM文件的解压(一) 这几天写了一个JPEG2000压缩DICOM解压的下程序 DICOM文件中如果标签如下: 0002,0010里的值为    1.2.840.10008. ...

  6. JPEG2000压缩DICOM文件的解压(三)

    DICOM文件JPEG2000压缩与解压(三) QQ:2556741313 关键词:DCMTK.DICOM.JPEG2000 前面两篇关于DICOM文件JPEG2000解压的内容很简单,主要是没有那么 ...

  7. zip(压缩) 和 *zipped(解压)_CodingPark编程公园

    压缩 a = [1, 2, 3] b = [4, 5, 6] c = [4, 5, 6, 7, 8] zipped = zip(a, b) # 压缩 print(list(zipped)) 解压 a ...

  8. 将一段压缩后的字符串解压,并且顺序输出

    将一段压缩后的字符串解压,并且顺序输出. 算法描述: 解压规则: 每个字符串后面跟着一个数字,表示这个字符重复的次数. 例如:'a5'解压后为'aaaaa', 'abc3'解压后为'abcabcbac ...

  9. spf打包解包_2020最新CentOS(linux下)安装7-Zip(7za压缩软件)以及解压命令,只打包不压缩,加密的方法...

    wget –no-check-certificate https://downloads.sourceforge.net/project/p7zip/p7zip/16.02/p7zip_16.02_s ...

最新文章

  1. toolbar.netcraft.com查询域名等信息
  2. 51单片机c语言应用开发三位一体实战精讲 pdf 119网盘,51单片机C语言应用开发三位一体实战精讲.pdf...
  3. Asp.Net Core中Session使用
  4. boost::callable_traits的return_type_t的测试程序
  5. MFC文件打开格式,MFC默认打开文档后缀(支持打开多图像格式)
  6. 前端学习(2586):如何设计高扩展路由
  7. 单片机与普通微型计算机的不同之处是什么,单片机与普通微型计算机的不同之处...
  8. Oracle iops升高查看,一则简单的磁盘的iops测试
  9. python机器学习库sklearn——神经网络
  10. URAL 1022 Genealogical Tree
  11. TensorFlow变量:创建、初始化、保存和加载
  12. 第十二章 WebService框架CXF
  13. 华为DHCP故障常用排查命令
  14. froala editor导出html,angular2 富文本编辑器 -- froala editor 吐血推荐
  15. 如何解决高分辨率下文本、图像和字体和布局?
  16. java多种货币的相互转换_使用java将不同的国家货币转换为双倍
  17. 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part5-完结):信息检索与结果组装
  18. 无源无线测温 无线测温装置
  19. 刚开始接触YOLO,记录一下Windows系统下载yolov5与初步进行训练的过程
  20. 预计一季度国内手机市场下滑逾30%;美国或取诺基亚爱立信控

热门文章

  1. 开源数字基础设施 项目 -- Speckle
  2. linux摄像头拍照程序,Android开发:Camera初探——控制摄像头拍照
  3. 算法实验总结2019
  4. GORM报错sql: Scan called without calling Next
  5. 京东最新Java面试真题解析!mysql两个时间比较
  6. 南加州大学计算机科学案例,南加州大学计算机科学硕士录取
  7. Kafka Producer 实现源码分析
  8. weak 属性需要在dealloc中置为nil吗
  9. scheduler_tick函数详解
  10. ERA5-Land hourly data数据直接计算出来数据量偏大,monthly单位等