我想知道是否可以镜像两台服务器,比如您可以将文件上传到一台服务器,然后将其推送到另一台服务器等。我对文件镜像更感兴趣,它不必镜像包管理和设置(但这也很酷!)
答案1
这很大程度上取决于手头的工作。
为什么需要文件镜像。您是否想要更新网站或内容存储库之类的东西(通常定期更新是可以的)。或者您是否需要实时同步数据?
对于定期异步镜像文件,通常只需有一个暂存区,将所有数据上传到该暂存区即可。然后从那里将其分发到服务器。对于您有两台服务器的情况,您可以在 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,它也使用 inotify)并编写您自己的小型同步守护程序。最后但并非最不重要的一点是,如果所有文件都通过 SFTP 等上传到一台服务器,您可以检查您的 SFTP 服务器是否允许您定义在某些事件(如文件上传)后调用的钩子。这样,您就可以告诉服务器在新数据上传时触发同步脚本。
如果您需要实时同步数据镜像,集群文件系统可能很合适。DRDB 已经命名。它非常适合块级复制,并且经常用于高可用性 MySQL 设置。您可能还想看看 GFS2、OCFS2、Lustre 和 GlusterFS。尽管 Lustre 和 GlusterFS 并不真正适合双服务器设置。
答案2
答案3
答案4
如果您尝试在此构建备份解决方案(我个人在几乎相同的设置中已经这样做过),请小心。您需要备份许多不同的东西,其中(可以说是)最大的一个是意外删除——任何实时复制系统都只会复制删除,而不提供安全性。对于这种情况,每日复制是可行的,但答案相当薄弱。试试 RSnapshot。
Unison 可能对你很有用,但我没有亲身经历。
使用 aproprate 标志在两个方向上运行 Rsync 是可行的,但它有一个相当棘手的问题,即如何处理已删除的文件,如果不进行特殊处理,它只会恢复文件,如果你像我一样从不删除任何东西,那么这很好,但否则就有点糟糕了。如果文件被移动,它也会做一些奇怪的事情。
无论您在做什么,如果出现可以在两端同时编辑文件的情况,那么您就会遇到问题。unison 是我所知道的唯一可以近乎令人满意地处理这个问题的解决方案。