为什么需要文件镜像.您是否希望更新类似网站或内容存储库的内容,通常可以定期更新.或者您需要实时同步数据?
对于文件的定期异步镜像,通常就有一个可以将所有数据上传到的临时区域.从您将其分发到服务器的位置.
在您的情况下 – 使用两台服务器 – 您可以在srv1上创建一些暂存文件共享到您传输数据的位置(通过FTP,NFS,DAV,SFTP等),然后让cronjob将文件rsync到“实时”目录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)并编写自己的小同步守护进程.最后但并非最不重要的,如果所有文件都通过例如上传到一个服务器. SFTP您可以检查SFTP服务器是否允许您定义在某些事件(如文件上载)之后调用的挂钩.这样,您可以告诉服务器在上传新数据时触发同步脚本.
如果您需要实时同步镜像数据,则群集文件系统可能是有序的. DRDB已经命名.它非常适合在块级别进行复制,并且通常用于高可用性MysqL设置.您可能还想看看GFS2,OCFS2,Lustre和GlusterFS.虽然Lustre和GlusterFS并不适合两个服务器设置.