在初始化 lsyncd 之前运行 rsync 扫描以同步 EC2 上的实例

在初始化 lsyncd 之前运行 rsync 扫描以同步 EC2 上的实例

我的公司使用多台 EC2 服务器,这些服务器会根据我们网站上的负载随时扩展或缩小规模。为了便于讨论,我们运行了四个实例:

  • master.ourdomain.com - 网络服务器的文件同步“中心”
  • www1/www2/www3.ourdomain.com - 三个根据负载开启或关闭的网络服务器

我使用 lsyncd 来保持所有 Web 服务器同步,而且在大多数情况下,它运行良好。我们使用双向同步方案,即每个 Web 服务器与主服务器同步,主服务器与每个 Web 服务器同步。因此,即使 Web 服务器之间没有直接同步,它们也可以保持同步。

不过,我有一个很难解决的问题。它发生在以下情况下:

  • 当主服务器上发生更改时(可能是在我们推送新代码之后),而一些冗余的 Web 服务器正在休眠
  • 然后一个休眠的网络服务器被唤醒来吸收负载

在这种情况下,我希望发生以下情况:

  • 首先,新唤醒的 Web 服务器应该与主服务器同步其文件结构(单向),以使其 Web 应用程序代码保持最新。
  • 然后,也只有这样,它才应该开始将其文件结构中的更改推送回主服务器。

不幸的是,目前,当启动休眠服务器时,当 lsyncd 启动时,它会将更改推送回主服务器在更新自己的代码库之前,从而用旧代码覆盖新代码。

因此,在 lsyncd 启动之前,我希望能够将 Web 服务器代码与主服务器代码同步,也许可以通过在两台机器上运行简单的单向 rsync 来实现。

我们正在运行 lsyncd v.2,我尝试使用“bash”配置选项来实现这一点,该选项记录在lsyncd 手册。我的配置文件如下:

settings = {
   logfile      = "/home/user/log/lsyncd/log.txt",
   statusFile   = "/home/user/log/lsyncd/status.txt",
   maxProcesses = 2,
   nodaemon     = false,
}

bash = {
    onStartup = "rsync [email protected]:/home/user/www /home/user/www"
}

sync{
    default.rsyncssh,
    source="/home/user/www/",
    host="[email protected]",
    targetdir="/home/user/www/",
    rsyncOpts="-ltus",
    excludeFrom="/home/user/conf/lsyncd/exclude"
}

(显然,我对该文件进行了一些删节,以保护罪犯的身份。)

但简单地说,这根本行不通。

我还能用什么其他方法解决这个问题?我正在查看--delete-after中的选项man rsync,但我认为这并不能满足我的要求。

关于我应该如何解决这个问题,有什么建议吗?

感谢您付出的时间和专业知识。

克里斯

答案1

在网络服务器上的 lsyncd.lau 中设置 init=false 似乎对我来说有效。

此后,您仍然必须调用从主服务器到新启动的 Web 服务器的单向同步。

相关内容