做一个750gib ftp的镜像,下载速度700kbps。关于下载策略和时间戳的问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
TickDancer
帖子: 6
注册时间: 2007-11-01 14:39
来自: 北京

做一个750gib ftp的镜像,下载速度700kbps。关于下载策略和时间戳的问题

#1

帖子 TickDancer » 2009-01-03 16:20

最近在尝试在本地做一个远程ftp服务器的镜像。上面给了一周时间,要求是能在36小时之内把镜像下载一遍,而且之后的维护和更新比较简单。

远程服务器有20个子目录,大小不同,最大163gib,最小188kib。每一两周,这些目录对应的数据都会被重新产生,就需要整个的重新下载。

手头的资源
(1)4个远程ftp服务器供选择。单线程ftp下载速度从200kb到1mb不等,下载速度那个好不能一次确定。
(2)3个本地机器,晚上8点到早上8点之间可用于下载。其中一台有2 x 500gib的sata盘来存储镜像,另外两个也可以通过nfs对这些盘进行写入。机器上的系统都是Ubuntu 8.04 Server Edition。
(3)本地100mb的网络。

约束和问题
(1)每个文件的时间戳要与服务器上的完全一致
开始用"wget -m (-r -I inf -N)",发现文件的时间戳与服务器端一致,文件夹的时间戳却是在本地创建的时间。
尝试了rsync,文件夹的时间戳也留下来了。但是远程服务器管理员不是很喜欢别人用rsync连,理由是rsync跟基于ftp协议下载的程序相比,会占用更多的服务器资源,而且也不快。
(2)必须在36小时内可以完成一次完整下载
a 使用单线程wget下载,每天12个小时可以下载28.1gib,3台机器下完全部需要9天。
b 使用多个wget -m,如果每一个一级目录都使用一个wget -m下载,那么整体的下载时间将大于等于最大那个一级目录的下载时间,最大的一级目录163gib,单线程下载需要6天。
尝试过同时以一个本地目录为目的目录wget -m同一个远程目录,从wget输出看,两个进程各下各的,没有协作。试着玩儿而已,wget也没说支持这个。
(3)怎么从几个服务器中选择一个下载速度最快的一个?

现在想使用的方法(还没做完)
(1)关于时间戳和下载速度的考虑
想用bash做,步骤如下
a 让三个下载用的机器下载用的目录都相同,假设说是/srv/ftpserv。一台机器拥有这份数据,另两台只是通过nfs写。
让它们用于下载守护的目录也相同,这样方便存储各类状态信息,这个目录的数据也是在存放数据的机器上,两外两台通过nfs写。
守护目录下一定要有一个服务器端的来的ls-lR文件作为下载依据

b 通过脚本实现如下内容
改变工作目录到下载目录,同时开始按行读入守护目录下的ls-lR

读入第一行

如果读入行是某目录详细的最开始一行
./databank:
total 166271392
......dira
......fileb
,把“.”替代为下载目录路径,删除最后的“:”,然后更改工作目录到这个所得路径。
在当前工作目录下创建.maintain文件,以保存所有在ls-lR中有匹配的目录和文件的名字。
跳过total那行,然后读入下一行

如果当前行是目录行
drwxr-xr-x 113 mirror archive 3842 Dec 7 21:48 databank
,检查在当前目录下有没有同名的子目录。如果有,什么都不做,如果没有,创建一个此名字的目录。
保存从行中得到的时间戳信息到目录下文件,假设名字是.dir-timestamp。
把目录名字加入到当前目录的.maintain文件
读入下一行

如果读入行是普通文件行
-r--r--r-- 1 mirror archive 1093786235 Dec 5 03:46 env_nt.01.tar.gz
,检查在当前目录下有没有名字、时间戳和大小都相同的文件,如果有,什么都不做。如果没有,删除同名的本地文件,使用“wget -N”下载文件。
把文件名字加入到当前目录的.maintain文件
读入下一行

如果读入行是符号链接行,如果链接不存在则创建一个。不做其他处理。
把符号链接名字加入到当前目录的.maintain文件
读入下一行

在改变工作目录之前,做些收尾工作:
扫描当前目录中的所有目录、普通文件和符号链接,如果名字在.maintain中没有,删除它。
删除.maintain文件
根据.dir-timestamp文件内容设定目录时间戳

关于时间戳:下载文件使用“wget -N”,文件夹的时间戳则在对文件夹修改完成,离开时设定。
关于多线程下载:上面的方法,理论上可以为一个目录的每一个文件开一个wget下载,但是考虑到网速,还有不想被封ip,就考虑在一台机器上限制10个wget,速度应该可以到3mbps左右。如果顺利,25个小时可以下完一遍。

(2)关于找到一台较快服务器的考虑。
服务器在一级目录肯定有ls-lR.Z和ls-lR.old.Z两个文件。考虑在下载前先下载这两个文件,根据 10mib/下载时间 做个速度估计。

刚开始用Ubuntu不久,工具什么的都还不熟。感觉应该有更好的方法来做这个事情。

希望大家能多给些指点。
感受局限,感受真实
头像
poweroff
帖子: 395
注册时间: 2008-12-13 15:03

Re: 做一个750gib ftp的镜像,下载速度700kbps。关于下载策略和时间戳的问题

#2

帖子 poweroff » 2009-01-03 18:33

不懂,帮顶,召唤牛人
一条狗的马甲!
对不起,我承认我是一只穿着马甲的狗!
头像
Jarson
帖子: 2371
注册时间: 2008-07-21 9:44
来自: 深圳
联系:

Re: 做一个750gib ftp的镜像,下载速度700kbps。关于下载策略和时间戳的问题

#3

帖子 Jarson » 2009-01-03 18:57

poweroff 写了:不懂,帮顶,召唤牛人
mark
头像
hellojinjie
帖子: 1150
注册时间: 2007-09-14 21:03
来自: 浙江

Re: 做一个750gib ftp的镜像,下载速度700kbps。关于下载策略和时间戳的问题

#4

帖子 hellojinjie » 2009-01-04 20:26

单线程不行就多线程了。。axel
Say hello to everyday!
TickDancer
帖子: 6
注册时间: 2007-11-01 14:39
来自: 北京

Re: 做一个750gib ftp的镜像,下载速度700kbps。关于下载策略和时间戳的问题

#5

帖子 TickDancer » 2009-01-04 23:57

hellojinjie 写了:单线程不行就多线程了。。axel
我刚开始用,不知道有什么多线程而且支持ftp的下载工具可以用。axel我去看看,谢谢

同时感谢前面几位回帖的
感受局限,感受真实
回复