linux多服务器间文件实时同步问题

发布于 2021-11-22 06:39:36 字数 1097 浏览 741 评论 5

    有这样一个场景,一个应用在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

绝情姑娘 2021-11-27 04:32:14

为了保险你也可以检测到事件后,做一次md5,和上一次的对比下,不一样才同步

霞映澄塘 2021-11-27 04:27:25

如果只是监控是否修改,建议监控in_modify或者in_create事件,我发现修改文件也会产生一次create事件

甜柠檬 2021-11-27 04:07:12

估计是你inotify监控的事件不正确,特别要注意程序open文件和close文件都会发生inotify的事件

醉生梦死 2021-11-26 20:02:00

你的Web应用应该把上传等写操作定向到一台服务器,然后在这台服务器上用inotify+rsync同步文件到另外两台服务器,这样就不会混乱了。

如果你使用Nginx作为HTTP服务器,你可以尝试这样配置,上传操作定向到服务器
192.168.1.10进行处理:

location ^~ /upload.php { 
 include fastcgi_params; 
 fastcgi_pass 192.168.1.10:9000; 
 fastcgi_param SCRIPT_FILENAME /srv/www$fastcgi_script_name;
}

这里假设3台服务器的网站根目录都为 /srv/www,项目都部署在/srv/www下。
除上传外,同步目录下删除、更改、移动等写操作也要定向到192.168.1.10这台服务器进行处理。

高跟鞋的旋律 2021-11-26 13:12:18

建议你固定将一台机器作为主节点,其它两台机器从主节点复制文件,这样能避免不必要的冲突问题。否则真可能产生你提到的循环复制问题。

我的解决方案是利用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(须做好密钥登录机制)。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文