背景
产品中有多处上传图片的业务,在最初架构的时候我仅是把静态资源分离开存储了,实际上是通过应用直接写文件到指定目录,由于服务器仅有一台,所以没有问题,通过Nginx自然也就实现了动静资源的分离架构,但是现在增加了几台服务器,因此,不同的用户随机请求到不同的主机上,图片也就保存到各自的服务器上了,通过后台系统就无法集中查看该业务的全部图片,鉴于此,我开始处理这个问题,寻找解决方案。
方案选择
1.定时任务+ftp
能实现向文件服务器推送图片文件,但是需要全量或推送完一张然后删除掉本地文件,缺点:操作不方便。2.定时任务+scp
同方案1一样,如果多服务器之间配置互信免密码,还算可以,写个shell脚本定时可以完成功能。3.定时任务+rsync
最终我选择的当然是这个方案,rsync的优点是可以增量同步,速度非常快,安全上可以配置只允许内网指定IP同步上传文件,还有个可以配置忽略部分目录同步。
配置环境
1.服务器端负责接收文件端,客户端是负责上传增量的文件
2.rsync在centos上是自带的,也就是系统已经帮你安装好了
12345 [tomcat@lnbAppsvr01 rsyncd]$ rsync --versionrsync version 3.0.6 protocol version 30Copyright (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如下
123456789101112131415161718192021222324252627 uid = rootgid = rootuse chroot = noread only = no#limit access to private LANshosts allow=10.xx.20.xxx 10.xx.36.xxx --内网允许我IP地址,空格分开hosts deny=*max connections = 5pid file = /etc/rsyncd/rsyncd.pid --PID文件secrets file = /etc/rsyncd/rsyncd.passwd --密钥文件#lock file = /etc/rsyncd/rsync.lockmotd file = /etc/rsyncd/rsyncd.motd --欢迎界面文件#This will give you a separate log filelog file = /etc/rsyncd/rsync.log --日志文件#This will log every file transferred - up to 85,000+ per user, per synctransfer logging = yeslog format = %t %a %m %f %bsyslog facility = local3timeout = 300# MODULE OPTIONS[imghome] --模块名称path = HEADPATH../staticsvr/filesystem --接收文件的目录 ,调试期间可以改为自己测试的目录list=yesignore errors#auth users = imgsynccomment = IMG Sync homeexclude = mpseo/ contentMgr/ --忽略接收的目录或文件密码文件rsyncd.passwd;内容格式简单且为明文方式且不需要为系统内真实存在的用户,如:(用户名:密码)
欢迎界面配置文件rsyncd.motd;随便写,就是客户端通过rsync命令连接上之后显示的欢迎界面,表示客户端成功连接上服务端了3.客户端配置,我仅创建了一个密码配置文件,内容就是服务端那一个文件
4.启动服务端,可以配置xinted或者独立守护进程方式启动
1 rsync --daemon --config=/etc/rsyncd/rsyncd.conf5.客户端连接
1 rsync -avzP --password-file=rsync.password --exclude=mpseo,contentMgr $LOCAL_PATH $SYNCUSER@$SYNCHOST::imghome
这句命令可以封装成一个shell脚本,便于crontab调用,当然直接在crontab里配置也是可以,个人习惯而,我觉得修改脚本更灵活方便。
后期改进计划
使用inotify+rsync实时同步方式