rsync的使用-多服务器文件同步

背景


产品中有多处上传图片的业务,在最初架构的时候我仅是把静态资源分离开存储了,实际上是通过应用直接写文件到指定目录,由于服务器仅有一台,所以没有问题,通过Nginx自然也就实现了动静资源的分离架构,但是现在增加了几台服务器,因此,不同的用户随机请求到不同的主机上,图片也就保存到各自的服务器上了,通过后台系统就无法集中查看该业务的全部图片,鉴于此,我开始处理这个问题,寻找解决方案。

方案选择


1.定时任务+ftp
能实现向文件服务器推送图片文件,但是需要全量或推送完一张然后删除掉本地文件,缺点:操作不方便。

2.定时任务+scp
同方案1一样,如果多服务器之间配置互信免密码,还算可以,写个shell脚本定时可以完成功能。

3.定时任务+rsync
最终我选择的当然是这个方案,rsync的优点是可以增量同步,速度非常快,安全上可以配置只允许内网指定IP同步上传文件,还有个可以配置忽略部分目录同步。

配置环境


1.服务器端负责接收文件端,客户端是负责上传增量的文件
2.rsync在centos上是自带的,也就是系统已经帮你安装好了

1
2
3
4
5
[tomcat@lnbAppsvr01 rsyncd]$ rsync --version
rsync version 3.0.6 protocol version 30
Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
...

3.服务端配置:创建三个文件rsyncd.conf,rsyncd.passwd,rsyncd.motd
配置文件rsyncd.conf如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
uid = root
gid = root
use chroot = no
read only = no
#limit access to private LANs
hosts allow=10.xx.20.xxx 10.xx.36.xxx --内网允许我IP地址,空格分开
hosts deny=*
max connections = 5
pid file = /etc/rsyncd/rsyncd.pid --PID文件
secrets file = /etc/rsyncd/rsyncd.passwd --密钥文件
#lock file = /etc/rsyncd/rsync.lock
motd file = /etc/rsyncd/rsyncd.motd --欢迎界面文件
#This will give you a separate log file
log file = /etc/rsyncd/rsync.log --日志文件
#This will log every file transferred - up to 85,000+ per user, per sync
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
# MODULE OPTIONS
[imghome] --模块名称
path = HEADPATH../staticsvr/filesystem --接收文件的目录 ,调试期间可以改为自己测试的目录
list=yes
ignore errors
#auth users = imgsync
comment = IMG Sync home
exclude = mpseo/ contentMgr/ --忽略接收的目录或文件

密码文件rsyncd.passwd;内容格式简单且为明文方式且不需要为系统内真实存在的用户,如:(用户名:密码)
欢迎界面配置文件rsyncd.motd;随便写,就是客户端通过rsync命令连接上之后显示的欢迎界面,表示客户端成功连接上服务端了

3.客户端配置,我仅创建了一个密码配置文件,内容就是服务端那一个文件

4.启动服务端,可以配置xinted或者独立守护进程方式启动

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

5.客户端连接

1
rsync -avzP --password-file=rsync.password --exclude=mpseo,contentMgr $LOCAL_PATH $SYNCUSER@$SYNCHOST::imghome

这句命令可以封装成一个shell脚本,便于crontab调用,当然直接在crontab里配置也是可以,个人习惯而,我觉得修改脚本更灵活方便。

后期改进计划


使用inotify+rsync实时同步方式

分享到 评论