有这样一个场景,一个应用在3台web服务器A、B、C上部署,各自有一个目录下的文件需要相互同步,保持3台服务器上一致。
现有的一个解决方案是 inotify + rsync,A B C既作服务端又作客户端,A←→B←→C,inotify监控到B发生变化则通过脚本同步到A C。但有明显的问题:由于文件涉及到的文件列表和需要同步的文件比较多,也不知道为什么两段串行同步的脚本一直停留在同步第一个,像是有同步不完的内容,第二条同步的命令始终没有执行;后来我尝试加入&让它们并行执行,完了B服务器爆了——不断的循环同步其他文件导致rsync进程占满内存。不知道谁有更好的思路来实现?最简单粗暴的方法是写两个脚本各自同步,网上有说unison可以双向同步,有没有人实现过这种三台服务器的,还有说A←→B ←NFS→ C,可行性和性能又有多大。
/usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w%f' \
-e modify,delete,create,move ${source_path} | while read file
do
/usr/bin/rsync -auvvvvrtzopgP --exclude-from=/etc/rsync_exclude.lst --progress --bwlimit=100 --password-file=${rsync_pwd} ${source_path} ${rsync_user}@${rsync_server}::${rsync_module}
/usr/bin/rsync -auvvvvrtzopgP --exclude-from=/etc/rsync_exclude.lst --progress --bwlimit=100 --password-file=${rsync_pwd} ${source_path} ${rsync_user}@${rsync_server_bak}::${rsync_module}
done
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
建议你固定将一台机器作为主节点,其它两台机器从主节点复制文件,这样能避免不必要的冲突问题。否则真可能产生你提到的循环复制问题。
我的解决方案是利用SVN hook+ ssh remote command推送到三台web服务器上。
使用nfs虽然可以简化文件共享问题,但还是有问题的,之所以舍弃掉nfs,当时是基于以下几点考虑:
1. 可靠性及单点故障问题,一旦nfs server崩溃(网络原因,磁盘损坏等),所有的web server都不可用。安全隐患极大。
svn hook + ssh command即可很好地解决这个问题。
在svn server上建立svn post-commit脚本,当提交完成后,在每台web server上远程执行svn update命令更新即可,这可通过ssh username@host command(须做好密钥登录机制)。