Skip to content

Instantly share code, notes, and snippets.

@a2ikm
Last active February 3, 2017 19:52
Show Gist options
  • Save a2ikm/f371a597e1f16a79b810 to your computer and use it in GitHub Desktop.
Save a2ikm/f371a597e1f16a79b810 to your computer and use it in GitHub Desktop.
lsyncdとserfでS3を介してファイルを同期するようなやつ

lsyncdとserfでS3を介してファイルを同期するようなやつ

master側の/path/to/shared以下でファイルの変更が検知されたら、lsyncdがS3に同期をかけ、そののちserfクラスタにupdateイベントを発行する。 それを受け取ったslave側がS3からファイルを持ってくる。

Requirements

  • lsyncd
  • serf
  • awscli + S3へ読み込み・書き込みができるようなIAMアカウント

How to

master側

$ mkdir -p /path/to/shared
$ lsyncd /path/to/lsyncd.conf
$ serf agent -config-file=/path/to/master.json

slave側

$ mkdir -p /path/to/shared
$ serf agent -config-file=/path/to/slave.json

そしてmaster側で

$ touch /path/to/shared/foo.txt

ってやると、少し待った後、同じファイルがslave側にもできてる。

Problems?

  • 大量のファイルが同時に更新されるとそのたびにupdateが発行されてslaveはsyncをかけてとなって不具合が出そう
    • 大量のファイル更新のイベントをある程度まとめるとか、インターバルを置くとか、syncは同時に1プロセスしか走らせないとかすればいいかも?
  • 複数の場所でlsyncdを動かしてmaster/slaveの区別をなくすってこともできるけど、ファイルの衝突が起こってひどいことになりそう
#!/bin/bash
RETVAL=0
s3sync()
{
source=$1
target=$2
if [ -e $source ]; then
aws s3 sync $source $target
fi
}
s3cp()
{
source=$1
target=$2
if [ -f "$source" ]; then
aws s3 cp $source $target
fi
}
s3rm()
{
source=$1
target=$2
aws s3 rm $target
}
s3mv()
{
source=$1
target=$2
aws s3 mv $source $target
}
serf_update()
{
serf event update
}
case "$1" in
startup)
s3sync $2 $3
serf_update
;;
create)
s3cp $2 $3
serf_update
;;
modify)
s3cp $2 $3
serf_update
;;
delete)
s3rm $2 $3
serf_update
;;
move)
s3mv $2 $3
serf_update
;;
*)
echo $"Usage $0 {startup|create|modify|delete|move}"
esac
exit $RETVAL
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
pidfile = "/var/run/lsyncd.pid",
statusFile = "/tmp/lsyncd.status",
maxProccesses = 1,
nodaemon = false,
insist = 1,
}
s3sync = {
maxProcesses = 1,
onStartup = "aws s3 sync ^source ^target",
onCreate = "/path/to/lsyncd-event.sh create ^source^pathname ^target^pathname",
onModify = "/path/to/lsyncd-event.sh modify ^source^pathname ^target^pathname",
onDelete = "/path/to/lsyncd-event.sh delete ^source^pathname ^target^pathname",
onMove = "/path/to/lsyncd-event.sh move ^target^o.pathname ^target^d.pathname",
}
sync {
s3sync,
source = "/path/to/shared",
target = "s3://your-bucket",
}
{
"interface": "eth1"
}
#!/bin/bash
aws s3 sync s3://your-bucket /path/to/shared
exit 0
{
"interface": "eth1",
"start_join": [
"192.168.33.10:7946"
],
"event_handlers": [
"user:update=/path/to/pull.sh"
]
}
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "centos-6.6"
config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.6_chef-provisionerless.box"
config.vm.define :master do |master|
master.vm.hostname = "master"
master.vm.network :private_network, ip: "192.168.33.10"
end
config.vm.define :slave do |slave|
slave.vm.hostname = "slave"
slave.vm.network :private_network, ip: "192.168.33.20"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment