网站发展到一定阶段,有时需要将各服务器上传的文件进行集中,这里讨论如果集中的问题,至于如果分散负载均衡、CDN加速、多主机、多域名等blablabla,概不讨论。
集中共享的方案(环境以CentOS 6.5为例)通常的作法是文件同步、共享硬盘空间、硬件堆叠和分布式文件存储四种。
文件同步是用工具定时或自动将分散的文件同步到一个集中的存储区域,如cron配合ftp、ssh、rsync等实现定时同步;
共享空间的做法是用文件存储协议实现挂载和管理,如mount、samba、NFS;
硬件堆叠是采用大磁盘空间实现,如阵列;
最后一种是集群和分布式文件系统,如taobao文件系统 tfs;
第2种不太稳定,第3种成本高,第4种实施复杂,最简单实用的是第1种。
第1种方案传统的做法是用rsync命令,结合ssh证书授权免帐号登录来实现同步,但这种做法有几个负面影响:
需要添加本地帐号
不是实时同步
配置稍显啰嗦
好了,我们要实现的功能的实时监控,实时同步,管理简单,维护方便,这里介绍lsyncd和rsyncd两个命令实现的文件集中同步管理。lsyncd负责监控文件的变化,发起文件推送;rsyncd负责接收同步指令,进行身份认证及写文件到本地。
一般linux服务器均安装有rsync命令,没有的就安装一个。
yum install rsync
配置成daemon运行方式
vi /etc/rsyncd.conf
lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid [img] path = 换成本地写入文件夹绝对路径 comment = special offer image files uid = root gid = root read only = no list = yes auth users = rsyncclient secrets file = /etc/rsyncd.secrets hosts allow = 192.168.100.0/255.255.255.0 192.168.200.234
注意:[img]为虚拟目录名称,在发起端配置中要用到;hosts allow换成发在发端的IP地址;auth users为认证的用户名,密码存在/etc/rsyncd.secrets文件里。uid和gid此处写的是root注意换成你自己的真实用户和组,如,是网站上传的文件夹,需要换成apache或nobody,否则文件上传会失败。
vi /etc/rsyncd.secrets
rsyncclient:password
注意:此密码文件与发在发端的密码文件稍有不同,多了一个用户名。
启动rsyncd(假设当前在root环境):
/usr/bin/rsync --daemon
把这个命令加到 /etc/rc.local作自动启动用。
查看服务Log是否有错误
tail -f /var/log/rsyncd.log
安装
yum install lsyncd
如果提示没有找到lsyncd你需要下载epel.repo (关于阿里云镜像的配置)到/etc/yum.repos.d/目录下再安装即可。
vi /etc/lsyncd.conf
将下述代码粘贴到此文件
settings { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd-status.log", statusInterval = 10 } -------------------------------- -- sync files to product server ------------------------------- sync { default.rsync, source="换成你的要监控并同步的文件夹绝对路径", target="rsync://rsyncclient@[换成接收端IP]:/img", delete = false,-- Doesn't delete files on the remote host eventho they're deleted at the source. This might be beneficial for some not for others delay = 5, -- We want to delay the syncing for 5 seconds so we queue up the events maxProcesses = 4, -- We only want to use a maximum of 4 rsync processes at same time rsync = { password_file = "/etc/rsyncd.secrets_master", compress = true, acls = true, verbose = true, owner = true, group = true, perms = true } }
重要:注意上面的 delete = false 参数,如果不要删除接收端的文件,请设置为 false,否则将自动删除发起端没有,但在接收端有的文件!!请慎重选择,一般设成false。
上面配置中假设同步帐号叫 rsyncclient,密码文件存放在 /etc/rsyncd.secret_master,注意:这里的帐号不是本地帐号,只是rsyncd的虚拟帐号。
接收端虚拟路径叫 img,具体定义参考接收端的配置,它只是一个虚拟目录,实际指向在配置文件中。
vi /etc/rsyncd.secrets_master
password
注意:此文件一行只有一个明文密码。
最后,启动lsyncd服务
service lsyncd start
查看log看是否正常启动
tail -f /var/log/lsyncd/lsyncd.log
如果有这行表明正常启动并配置成功了。
Normal: Finished a list after exitcode: 0
将lsyncd设成自动启动
chkconfig --level 3 lsyncd on
一切顺利的话,发起端已经监控了文件的变化,并在5秒延时后自动推送到接收端,您可以自己测试查看实际效果。再次提醒,请先在测试环境演练多遍,观察至少一周时间后再配置到生产环境!
此方案的优点是实时同步,无须ssh协议支持,不需要添加本地帐号,配置简单,布署灵活。
<作者:朱淦 [email protected]>