Answers:
这在很大程度上取决于手头的工作。
为什么需要文件镜像。您是否要更新网站或内容存储库之类的内容,通常可以定期更新?还是需要实时数据同步?
对于文件的定期异步镜像,通常有一个暂存区即可将所有数据上传到其中。并从那里将其分发到服务器。对于您的情况-使用两台服务器-您可以在srv1上创建一些暂存文件共享,以将数据传输到其中(通过FTP,NFS,DAV,SFTP等),然后通过cronjob r将文件同步到以下目录的“活动”目录中srv1和srv2。在这种情况下,使用rsync的最简单方法是生成一个ssh密钥对,该密钥对将用于数据传输,并且已在集群中的所有服务器上得到授权。
例:
srv1:/data/staging/ <= is where you upload your data
srv1:/data/production/ <= is where your servers get their production data from
srv2:/data/production/
srv1$ cat /etc/cron.d/syncdata.cron
=====
*/5 * * * * syncuser rsync -a --delete /data/staging/ /data/production/
*/5 * * * * syncuser rsync -az --delete -e ssh /data/staging/ srv2:/data/production/
=====
这应该给您一个基本的想法。当然,您可能希望将rsync调用包装在某些脚本中并实施适当的锁定,以防在同步花费5分钟以上时它不会运行两次,等等。而且,不用说,暂存区域不是必需的。您最好直接将srv1:production同步到srv2:production。只是srv2可能显示的数据比srv1早5分钟。这可能是个问题,具体取决于您如何在两者之间取得平衡。
异步分发文件的另一种方法是将它们打包为rpm或您的deb文件。将它们放在中央存储库中,并通过cfengine,monkey或基于diy消息总线的解决方案进行安装/更新。这具有对已部署数据进行版本控制的良好副作用,但仅适用于您自己生成和部署的少量数据(例如您自己软件的版本)。您不会希望以此来分发TB的数据,而且它也不适合镜像频繁变化的内容,例如每隔一分钟左右。
如果您需要近乎实时地复制数据,而不必同步而不是每次都调用cron,则可以使用一些基于inotify的方法,例如已经提到的incron来调用同步脚本。另一个可能性是使用Gamin(如果内核中也存在inotify,它也使用inotify)并编写自己的小同步守护程序。最后但并非最不重要的一点是,如果所有文件都通过SFTP等方式上传到一台服务器,则可以检查SFTP Server是否允许您定义在某些事件(例如文件上传)后调用的钩子。这样,您可以告诉服务器在上载新数据时触发同步脚本。
如果您需要实时的数据同步镜像,则可能需要一个群集文件系统。DRDB已被命名。它非常适合在块级进行复制,通常用于高可用的MySQL设置。您可能还想看看GFS2,OCFS2,Lustre和GlusterFS。虽然Luster和GlusterFS并不真正适合于两台服务器的安装。
根据您的特定用例-您可以使用与DRBD类似的东西http://www.drbd.org/
如果您尝试在此处构建备份解决方案(我亲自在几乎相同的设置中完成了此操作),请小心。您需要备份许多不同的内容,其中之一(可以说是最大的)是意外删除-任何实时复制系统都只会复制删除内容,并且没有安全性。对于此日常复制工作,但答案很差。尝试使用RSnapshot。
Unison可能会为您工作,但是我没有个人经验。
使用aproprate标志在两个方向上运行Rsync都可以工作,但是它存在一个棘手的问题,即如何处理已删除的文件,而无需特殊处理,它只是还原文件,如果您从未删除过像我这样的东西,那很好,但是有点否则差。如果移动文件,它也会做奇怪的事情。
无论您做什么,都可能出现在两端可以同时编辑文件的情况,那么您就遇到了问题。我所知道的唯一一致的解决方案可以使这个解决方案令人满意。