案例:使用rsync在windows电脑上实现文件同步

浏览: 143 发布日期: 2016-10-24 分类: windows

一个具体的案例

某技术公司A的业务,会在服务器上生产pdf电子书、相册等文件,但是公司A本身不具备打印技术,需要转交给传统打印公司B来完成线下生产。那么问题来了,公司A怎么将每天生产出来几十个G的文件,以最小的成本传输给B呢?B公司是传统小企业,并不懂电脑技术,而且连接打印机的电脑是windows系统的.

一个自然而然想到的方案,就是借助第三方云盘服务C,公司A将文件上传C,然后公司B再从C上下载。这个方案可行,但是多了一个传输节点C,增加了A上传C的这段时间成本。

一个简单的实施方案,就是A搭建rsync服务,然后告知B来同步。好在rsync提供的windows的版本,让这个方案可行。当然,该方案也适用于Mac/Linux,而且更简单。

服务端的操作

以centos为例,安装rsync:

yum -y install rsync

直接启动rsync:

rsync --daemon --config=/etc/rsyncd.conf

执行 ps -ef | grep rsync 可以看到服务已经成功启动.

安装rsync时默认生成了配置文件 /etc/rsyncd.conf , 下面讲解一下配置文件. 完整的配置如下:

uid = root
gid = root
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
exclude = lost+found/
transfer logging = yes
timeout = 900
ignore nonreadable = yes
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

[test01]
path = /root/tmp/test01/
read only = yes

[test02]
path = /root/tmp/test02/
read only = yes

[test01]一行以上的内容,与默认的配置无异,我们采用默认的配置即可.

然后在文件的最后加上以下配置。表示我们要启动两个提供同步的目录,分别命名为test01和test02,路径分别为/root/tmp/test01/ 和 /root/tmp/test02/.

这里的test01 和 test02 在文档中叫做 module name,我们可以理解为"别名"、"alias"的意思即可.

read only = yes 表示客户端只能下载服务端的文件而不能上传(单向同步).
这应该是大部分业务的需求,如果有上传需要,设置read only = no 即可.

有一点需要提醒, /etc/rsyncd.conf配置修改后,并不需要重启服务即可生效.

如果想要关闭rsync服务,执行ps -ef | pgrep rsync | xargs kill 即可.

为了方便测试,我们还需要创建/root/tmp/test01/ 和 /root/tmp/test02/ 两个目录,然后在目录里面创建一些文件和目录,以便能看到同步下载的效果.

如果想要了解更多的配置和启动项,可以执行以下命令查看,这里不再赘言:

  • man rsyncd.conf 查看更多文档

  • 或者rsync --daemon --help 查看rsync的启动参数

rsync的默认端口是873, 如果服务器的防火墙开启(以CentOS 7.2为例,防火墙就是默认开启的),需要将 873 端口加入到允许中,执行:

iptables -I INPUT -p tcp --dport 873 -j ACCEPT

客户端命令[mac/linux]

测试一下命令:

rsync -r --list-only  192.168.1.100::test01

该命令中,

-r 参数表示要递归同步目录下的目录.
--list-only 参数表示只输出,不执行真正的文件传输.
192.168.1.100 是服务器的IP,你可以替换成域名。比如该服务器的域名是: rsync.bala.com, 也可以写成 rsync -r --list-only rsync.bala.com::test01
test01 就是我们配置中指定的module name, 请记住,test01前面是两个冒号哦。

如果能够列出服务器上test01对应的目录内容,则表示同步已经成功.

如果发生错误 rsync: failed to connect to [你的服务器]: Operation timed out,在检查网络正常的情况下,可能就是我们上面提到的防火墙问题.只需要将端口873加入到允许中即可.

执行同步命令:

rsync -avP --delete --chmod=a=rwx 192.168.1.100::test01  ./tmpfolder

解释一下参数:

--delete 表示删除本地tmpfolder目录中跟服务器test01下不一致的所有文件和目录
--chmod=a=rwx 表示同步下来的文件具有a=rwx的权限(所有人可读写执行)
./tmpfolder 表示同步到本地的该目录下
-P 表示显示进度条
-v 表示采用增量的方式同步文件
-a 是 archive mode; same as -rlptgoD; 相当于简写了很多参数

另外还有一些常见的参数说明:

-u, --update                skip files that are newer on the receiver
-r, --recursive             recurse into directories
-z, --compress              compress file data during the transfer

在这里,我不使用-z参数是因为我要传输的文件主要是pdf和图片,所以该参数作用不大.如果以文本为主,那加上-z会好很多,它将在传输过程中进行压缩减少数据量.

windows下的解决方案

windows下有软件cwRsync提供了rsync的功能. cwRsync的下载地址

安装步骤如下:

  • 下载 cwRsync

  • 将解压得到的目录,加入到环境变量Path中,如D:cwRsync_5.4.1_x86_Free。 windows添加环境变量的方法可参考其他教程,比如这篇文章。需要注意, 在Path 的变量值末尾添加分号;+ 路径, 即;D:cwRsync_5.4.1_x86_Free

  • 建立文件夹存放同步的文件,比如D:pdf_and_album\

  • 在D:cwRsync_5.4.1_x86_Free 中,编写批处理脚本pdf_rsync.bat, 脚本内容就是我们上面提到的命令,比如rsync -avP --delete --chmod=a=rwx rsync.bala.com::test01 /cygdrive/d/pdf_and_album/

  • 设置windows的定时任务,执行pdf_rsync.bat。 windows设置定时任务的方法见Win XP, Win 7

返回顶部