My company uses several EC2 servers that will scale up and down according to the load we're receiving on our sites at any given moment. For the sake of our discussion here, we're running four instances:
- master.ourdomain.com - the file syncing "hub" of the webservers
- www1/www2/www3.ourdomain.com - three webservers which turn on or off as dictated by load
I'm using lsyncd to keep all of the webservers in sync, and for the most part, it's working quite well. We're using a two-way syncing scheme, such that each webserver syncs against master, and master syncs against each webserver. Thus, the webservers are kept in sync, even though they aren't syncing against each other directly.
I'm having one problem that I'm having a hard time solving,though. It occurs under these circumstances:
- When changes are made on master (perhaps after we've pushed new code), while some of the redundant webservers are sleeping
- And then a sleeping webserver wakes-up to absorb load
Under that circumstance, I would like the following to happen:
- First, the newly-awoken webserver should sync its file structure - one way - against master, to bring its web application code up-to-date.
- Then, and only then, should it begin pushing changes in its file structure back to master.
Unfortunately, currently, when a sleeping server is started, when lsyncd starts up, it pushes changes back to master before updating its own codebase, thus overwriting new code with old.
Thus, before lsyncd starts, I'd like to be able to synchronize the webservers code against master's, perhaps by running a simple one-way rsync against the two machines.
We're running lsyncd v.2, and I've tried to make this happen by using the "bash" configuration options documented in the lsyncd manual. My configuration file looks like this:
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"
}
(I've obviously redacted that file somewhat to protect the identities of the guilty.)
Simply put, though, this just isn't working.
How else might I approach this problem? I was looking at the --delete-after
option in man rsync
, but I don't think that does what I'm looking for.
Are there any suggestions about how I should approach this problem?
Thanks for lending your time and expertise.
Chris