当前位置: 首页>>技术教程>>正文


有没有办法在Ubuntu上镜像两个服务器?

,

问题描述

我想知道是否可以镜像两个服务器,例如可以将文件上传到一个服务器,然后它们将推送到另一台服务器,等等。我对文件镜像更好奇,它不必镜像包管理和设置(但这也很酷!)

最佳方案

这在很大程度上取决于手头的工作。

为什么需要文件镜像。您是否要更新网站或内容存储库之类的内容,通常可以定期更新?还是需要实时数据同步?

对于文件的定期异步镜像,通常有一个暂存区即可将所有数据上传到其中。并从那里将其分发到服务器。对于您的情况-使用两台服务器-您可以在srv1上创建一些暂存文件共享,以将数据传输到该位置(通过FTP,NFS,DAV,SFTP等),然后通过cronjob r将文件同步到srv1的”live”目录,并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服务器是否允许您定义在某些事件(例如文件上传)之后调用的挂钩。这样,您可以告诉服务器在上载新数据时触发同步脚本。

如果您需要实时的数据同步镜像,则可能需要一个群集文件系统。 DRDB已被命名。它非常适合在块级别进行复制,通常用于高可用的MySQL设置。您可能还想看看GFS2,OCFS2,Lustre和GlusterFS。虽然Luster和GlusterFS并不真正适合于两台服务器的安装。

次佳方案

基本上,您有3种可能性:

  1. 让您的应用程序将文件推送到两个服务器。

  2. 异步复制,e。 G。与cron作业每15分钟(或更少)进行rsync

  3. 在文件系统(例如GlusterFS)或块设备级别(例如DRBD)上进行同步复制。如果要在块设备级别使用复制,则要同时从两个服务器读/写文件,则需要一个支持分布式锁定的文件系统(例如OCFS2GFS2)。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/10844.html,未经允许,请勿转载。