我的公司使用多台 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 服务器的单向同步。