使用wget进行两个服务器间单向文件同步

之前曾经使用过FTPSync进行非实时网站同步的实现,结果发现wget已有类似功能,而且更加简单

例如:
wget -m --no-remove-listing -nH -P /home/xxx/bak/ ftp://username:password@www.xxx.com/*
务必注意最后ftp路径后面有个*,否则wget只会下载生成一个目录列表文件index.html,而不会同步文件

参数含义:
-m 开启单向镜像
--no-remove-listing 不生成目录列表文件index.html
-nH 不创建以主机名命名的目录
-P 下载保存路径

wget很强大,可以做很多参数配置,例如:
-w 下载间隔时间
-X 排除某些目录
......


-----------以下2009-11-05 23:00添加-----------
wget只能实现下载,远程如果删除了文件,本地不会同步删除,比较适合一次性将文件全部抓取回来或者不需要删除的情况;FTPSync则可以同步删除。

非实时网站同步的实现

现状:
现有两个站点,分别称为SiteR和SiteF,两者都可以通过FTP管理,且SiteR有Shell权限并支持perl

目的:
将SiteF作为主站,定时将SiteF上的WEB内容和数据库数据同步到SiteR,同步是非实时且单向的

实现方法:
1、在SiteR上使用FTPSync.pl脚本实现通过FTP方式的SiteF到SiteR的文件同步(下载地址http://ossw.ibcl.at/FTPSync/

2、在SiteF上编写一个php页面,作用是定时将数据库数据导出成文本格式并压缩,核心代码如下,原理是使用system方法执行MySQL的备份命令mysqldump,同时使用find命令删除过期备份文件
[quote]$command = "mysqldump -h数据库地址 -u用户名 -p密码 --default-character-set=utf8 数据库名|gzip>生成的文本备份文件路径及名称";
system($command, $retval);

$command = "find 备份路径/*.gz -mtime +10 -exec rm {} \\;";
system($command, $retval);[/quote]

3、在SiteR上编写Shell脚本,核心代码如下
[quote]//远程调用SiteF备份页面,生成数据库备份
wget http://xxx.xxx/xxx/xxx.php

//同步远程文件到本地
ftpsync.pl ftpuser=FTP帐号 ftppasswd=FTP密码 本地目的路径 ftp://远程FTP源地址//[/quote]
如果源FTP地址是从根目录开始,最后要写两个/,这个貌似是FTPSync的一个BUG,我使用的是1.3.01

4、在cron中定时调用第3步的Shell脚本
[quote]#每天凌晨0点
0 0 * * * /xxx/xxx[/quote]

此方法的必备条件:
1、各个站点可通过FTP获取源文件
2、其中一个站点有Shell权限,且支持perl,且可以使用cron