master側の/path/to/shared以下でファイルの変更が検知されたら、lsyncdがS3に同期をかけ、そののちserfクラスタにupdateイベントを発行する。 それを受け取ったslave側がS3からファイルを持ってくる。
- lsyncd
- serf
- awscli + S3へ読み込み・書き込みができるようなIAMアカウント
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側にもできてる。
- 大量のファイルが同時に更新されるとそのたびにupdateが発行されてslaveはsyncをかけてとなって不具合が出そう
- 大量のファイル更新のイベントをある程度まとめるとか、インターバルを置くとか、syncは同時に1プロセスしか走らせないとかすればいいかも?
- 複数の場所でlsyncdを動かしてmaster/slaveの区別をなくすってこともできるけど、ファイルの衝突が起こってひどいことになりそう