serfでhostsファイルを自動的に書き換えます。
ホスト | IP |
---|---|
node1 | 192.168.33.71 |
node2 | 192.168.33.72 |
インストール
ここからダウンロードする。
wgetは入ってなければsudo yum install -y wget
で入れておく。
$ wget https://dl.bintray.com/mitchellh/serf/0.6.3_linux_amd64.zip
$ unzip 0.6.3_linux_amd64.zip
# serfが無い事を確認
$ ls -lh /usr/local/bin/serf
$ sudo mv serf /usr/local/bin
$ which serf
serf起動テスト
[node1]
$ serf agent -iface=eth1 -node=node1 &
[node2]
$ serf agent -iface=eth1 -node=node2 &
# node1のIPアドレスにjoin
$ serf join 192.168.33.71
[node1, node2]
# node1, node2がメンバーになっていることを確認する
$ serf members
============================
2014/08/14 00:01:52 [INFO] agent.ipc: Accepted client: 127.0.0.1:57684
node1 192.168.33.71:7946 alive
node2 192.168.33.72:7946 alive
============================
# ログの確認
$ serf monitor
============================
2014/08/14 00:01:59 [INFO] agent.ipc: Accepted client: 127.0.0.1:57686
2014/08/13 23:59:56 [INFO] agent: Serf agent starting
2014/08/13 23:59:56 [INFO] serf: EventMemberJoin: node1 192.168.33.71
2014/08/13 23:59:57 [INFO] agent: Received event: member-join
2014/08/14 00:01:30 [INFO] serf: EventMemberJoin: node2 192.168.33.72
2014/08/14 00:01:31 [INFO] agent: Received event: member-join
2014/08/14 00:01:52 [INFO] agent.ipc: Accepted client: 127.0.0.1:57684
2014/08/14 00:01:59 [INFO] agent.ipc: Accepted client: 127.0.0.1:57686
============================
[node1, node2]
$ serf event 'Hello World'
どこで実行しても全MemberでHello Worldが表示される。
serf-hosts
/etc/hostsを自動管理する。本家のperl版をうまく動かせなかったのでshellscript版を利用。
先ほどのテストで起動したserfは終了させておく。
使い方
[node1]
$ wget https://gist.githubusercontent.com/manabusakai/8266181/raw/c2414cddc3648c8e5003d9fd2503653f9941b8eb/event_handler.sh
$ chmod 755 event_handler.sh
$ sudo /usr/local/bin/serf agent -iface=eth1 -node=node1 -discover=webapp -event-handler=./event_handler.sh &
# /etc/hostsにnode1追加されている事を確認
$ cat /etc/hosts
============================
...
192.168.33.71 node1
============================
[node2]
$ wget https://gist.githubusercontent.com/manabusakai/8266181/raw/c2414cddc3648c8e5003d9fd2503653f9941b8eb/event_handler.sh
$ chmod 755 event_handler.sh
$ sudo /usr/local/bin/serf agent -iface=eth1 -node=node2 -event-handler=./event_handler.sh &
# node1のIPアドレス。joinでnode2の/etc/hostsに反映される
$ sudo /usr/local/bin/serf join 192.168.33.71
# /etc/hostsにnode1, node2が追加されている事を確認
$ cat /etc/hosts
============================
...
192.168.33.72 node2
192.168.33.71 node1
============================
[node1]
# /etc/hostsにnode1, node2が追加されている事を確認
$ cat /etc/hosts
============================
...
192.168.33.71 node1
192.168.33.72 node2
============================
node2のserfを終了させると自動的にnode1の/etc/hostsからnode2の設定が消える。
[node2]
$ fg
sudo /usr/local/bin/serf agent -iface=eth1 -node=node2 -event-handler=./event_handler.sh
# Ctrl+cをおす
============================
^C==> Caught signal: interrupt
==> Gracefully shutting down agent...
2014/08/14 00:21:55 [INFO] agent: requesting graceful leave from Serf
2014/08/14 00:21:56 [INFO] serf: EventMemberLeave: node2 192.168.33.72
2014/08/14 00:21:56 [INFO] agent: requesting serf shutdown
2014/08/14 00:21:56 [INFO] agent: shutdown complete
============================
[node1]
$ cat /etc/hosts
============================
...
192.168.33.71 node1
============================
備考
起動(マルチキャストDNS)
serf joinしなくても自動でクラスタに参加する。
[node1]
$ serf agent -iface=eth1 -node=node1 -discover=webapp &
[node2]
$ serf agent -iface=eth1 -node=node2 -discover=webapp &
# node1, node2がメンバーになっていることを確認する
$ serf members
# ログの確認
$ serf monitor
hostsを書き換えるスクリプトは明示的にjoinしないとうまく反映されなかった。。
オプション
- -log-level=debug : デバッグモード