Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

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 user@master.ourdomain.com:/home/user/www /home/user/www"
}

sync{
    default.rsyncssh,
    source="/home/user/www/",
    host="user@master.ourdomain.com",
    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

share|improve this question
add comment

1 Answer

Setting init=false in lsyncd.lau on the webservers seems to work for me.

You still have to invoke one-way sync from master to the newly started webserver after that.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.