linux多服务器间文件实时同步问题
有这样一个场景,一个应用在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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
为了保险你也可以检测到事件后,做一次md5,和上一次的对比下,不一样才同步
如果只是监控是否修改,建议监控in_modify或者in_create事件,我发现修改文件也会产生一次create事件
估计是你inotify监控的事件不正确,特别要注意程序open文件和close文件都会发生inotify的事件
你的Web应用应该把上传等写操作定向到一台服务器,然后在这台服务器上用inotify+rsync同步文件到另外两台服务器,这样就不会混乱了。
如果你使用Nginx作为HTTP服务器,你可以尝试这样配置,上传操作定向到服务器
192.168.1.10进行处理:
这里假设3台服务器的网站根目录都为 /srv/www,项目都部署在/srv/www下。
除上传外,同步目录下删除、更改、移动等写操作也要定向到192.168.1.10这台服务器进行处理。
建议你固定将一台机器作为主节点,其它两台机器从主节点复制文件,这样能避免不必要的冲突问题。否则真可能产生你提到的循环复制问题。
我的解决方案是利用SVN hook+ ssh remote command推送到三台web服务器上。
使用nfs虽然可以简化文件共享问题,但还是有问题的,之所以舍弃掉nfs,当时是基于以下几点考虑:
1. 可靠性及单点故障问题,一旦nfs server崩溃(网络原因,磁盘损坏等),所有的web server都不可用。安全隐患极大。
2. 性能,通过ab压力测试工具的反复验证,nfs性能仅本机磁盘的四分之一不到,毕竟多了一层网络传输开销,性能降低也是必然的。
svn hook + ssh command即可很好地解决这个问题。
在svn server上建立svn post-commit脚本,当提交完成后,在每台web server上远程执行svn update命令更新即可,这可通过ssh username@host command(须做好密钥登录机制)。