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


8

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


文件镜像:Gluster或DRDB;网站镜像:Varnish或HAProxy;数据库镜像:MySQL循环复制或Postgres复制。-大多数服务器软件包都具有集群操作模式,或者有反向代理允许您执行此操作。
汤姆·奥康纳

Answers:


6

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

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

对于文件的定期异步镜像,通常有一个暂存区即可将所有数据上传到其中。并从那里将其分发到服务器。对于您的情况-使用两台服务器-您可以在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看起来不错。在一台服务器处于活动状态时使用它是否不好?像它将如何影响实时服务器?
凯尔(Kyle)2010年

取决于-实时服务器在做什么?它是Web服务器,数据库服务器,文件服务器等吗?DRBD会执行同步复制,并附带它的所有含义。取决于您打算采用单主数据库还是双主数据库,某些I / O缓存(和文件系统)限制将适用,进而会影响您的应用程序。有关详细信息,我建议阅读DRBD用户指南drbd.org/users-guide-emb,该指南写得很好,并详细解释了所有含义。
卢卡斯·洛舍

5

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

  1. 让您的应用程序将文件推送到两个服务器。
  2. 异步复制,例如与cron作业每15分钟(或更少)进行rsync
  3. 在文件系统(例如GlusterFS)或块设备级别(例如DRBD)上进行同步复制。如果要在块设备级别使用复制,则要同时从两个服务器对文件进行读写访问,则需要一个支持分布式锁定的文件系统(例如OCFS2GFS2)。



1

如果您尝试在此处构建备份解决方案(我亲自在几乎相同的设置中完成了此操作),请小心。您需要备份许多不同的内容,其中之一(可以说是最大的)是意外删除-任何实时复制系统都只会复制删除内容,并且没有安全性。对于此日常复制工作,但答案很差。尝试使用RSnapshot。

Unison可能会为您工作,但是我没有个人经验。

使用aproprate标志在两个方向上运行Rsync都可以工作,但是它存在一个棘手的问题,即如何处理已删除的文件,而无需特殊处理,它只是还原文件,如果您从未删除过像我这样的东西,那很好,但是有点否则差。如果移动文件,它也会做奇怪的事情。

无论您做什么,都可能出现在两端可以同时编辑文件的情况,那么您就遇到了问题。我所知道的唯一一致的解决方案可以使这个解决方案令人满意。


请注意,下面提到的循环对于Rsync来说不会有问题,因为如果设置正确,它会保留其传输文件的修改日期。
Thingomy'3

0

如果是单向的(我是说,总是从一台服务器到另一台服务器,但反之则不行),则可以使用incron。就像cron一样,但是基于文件系统事件。

每次创建或更改文件时,它将触发到另一台服务器的scp或rsync。

双向存在循环问题:)。


0

这取决于您的需求.....我为群集式Web服务器设置了一个非常“便宜且简单”的设置。

我只是有一个“文件服务器”(NFS),其中所有网络服务器都挂载以下目录:

/etc/apache/sites-enabled
/etc/apache2/sites-avaliable
/var/www

死了简单而有效


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.