イベントハンドラとは?
前回の記事で見たように、
イベントハンドラは単純にコマンド実行するだけでなく、
そのため、
イベントは大きく2つに分類
Serfがイベントハンドラを実行するタイミングは、
Serfが強力なのは、
イベントの分類 | 特徴 | イベントの種類 |
---|---|---|
メンバ管理 | クラスタへのメンバ参加・ |
member-join、 |
カスタム | ユーザが任意のタイミングで発生させるイベント | user event、 |
イベントの種類
具体的にSerfが持つイベントの種類を見ていきます。Serfが
メンバ管理系イベント
「member-」

- 「member-join」
Serfクラスタに新しいメンバが参加
(join) したタイミングで発生します。このとき、 クラスタ全体に対して、 新しいメンバがクラスタに参加したことが伝わります。具体的な使い方としては、 クラスタ参加のタイミングでChefやPuppetなどの構成管理ツールを使う自動プロビジョニング処理に使えます。他には、 パブリック・ クラウド上に自動展開される仮想マシンのホスト名・ IPアドレスの把握や、 その情報を元に、 監視設定の自動投入へ応用できます。 - 「member-update」
Serfエージェントが各々に対して設定できるタグを変更するときに発生します。このタグ機能は、
「role=web」 のように、 任意のキー=バリューの組み合わせを設定できます。使い方としては、 特定のタグの値に応じて、 任意のコマンドの一斉実行や、 プロビジョニング用スクリプトの実行に活用できます。 - 「member-leave」
Serfクラスタからノードが離脱
(left) したタイミングで発生します。これは、 Serfエージェントを 「Ctrl+C」 で中断するなど、 正常に終了される場合です。明示的に停止したとSerfクラスタから判断されるため、 以降はSerfクラスタからのヘルスチェックから除外されます。 - 「member-failed」
Serfクラスタとの通信が途絶した場合や、
Serfエージェントが異常終了した場合に発生します。Serfクラスタからは一時的な障害とみなされるため、 障害後も定期的なヘルスチェックが継続します。デフォルトでは、 30秒です。この間隔は設定ファイル上でパラメータ reconnect_
を使い、interval 変更することができます。このイベントは、 ロードバランサからの設定除外や、 障害発生時の自動復旧コマンドの実行などに応用できます。また、 member-leaveイベントとは違い、 あくまで一時的な障害とみなされているため、 エージェントとの通信が再開次第、 クラスタに自動復帰します。 - 「member-leap」
member-leave
またはmember-failed
イベントによってクラスタから離脱後も、一定期間 (標準では24時間) クラスタ内で情報が保持されます。この保持された情報を完全に削除するタイミングで発生するのが、 この member-leap
イベントです。クラスタに完全に離脱するとみなされるため、例えば、 監視設定から永続的な設定削除に活用できます。
カスタムイベント
「user event」serf event <イベント名>
やserf query <イベント名>
のように実行します。

- 「user event」
(ユーザイベント) クラスタ上のサーバでコマンドを実行します。特定のサービスの再起動や、
コマンドの実行をしたい場合に手軽に利用できます。 - 「query」
(クエリ) クラスタ上のサーバでコマンドを実行し、
その実行結果を取得して標準出力に表示します。ユーザイベントと異なり、 コマンドの処理結果を画面上で確認できます。サーバにログインすることなく、 サーバ内の情報を取得できます。
カスタムイベントの特徴として、-rpc-addr=
オプションを指定して、
$ serf event -rpc-addr=192.168.39.3:7373 <イベント名> <ペイロード>
イベントハンドラの使い方
イベントハンドラを使うには、-event-handler=<コマンドスクリプト名>
の形式で指定します。より具体的な使い方と、
イベント発生毎に時刻を記録するには?
ここでは簡単な例として、date
コマンドの時刻を記録することを考えます。ファイル/tmp/
に書き出すには、-event-handler=
オプションを使い、
$ serf agent -event-handler="date >> /tmp/serf.log"
エージェント起動直後に/tmp/
を開くと、member-join
イベントが発生したからです。
$ cat /tmp/serf.log
2015年 3月 29日 日曜日 16:18:12 JST
以降は、serf event check
のようにカスタムイベントを実行したり、
特定のイベント時のみ実行するには?
イベント発生毎に実行するだけでなく、-event-handler=<イベント名>:<コマンドやスクリプト>
の形式で起動します。例えば、
$ serf agent -event-handler="member-join=date >> /tmp/serf-member-join.log"
この状態で再度serf event check
のようにユーザイベントを起動しても、member-join
イベント発生時は時刻が記録されることが分かります。
イベント名と時刻を記録するには?
時刻を記録するだけでなく、event.
を作成し、
$ touch event.sh $ chmod 700 ./event.sh
エディタでファイルを編集し、
#!/bin/sh
date
echo SERF_EVENT = ${SERF_EVENT}
while read line; do
echo $line
done
それから、event.
をイベントハンドラとして実行します。
$ serf agent -event-handler="./event.sh >> /tmp/serf-event.log"
任意のイベントを発行したり、
2015年 3月 29日 日曜日 16:55:47 JST
SERF_EVENT = member-join
sakura1.pocketstudio.net 192.168.39.11
2015年 3月 29日 日曜日 16:55:55 JST
SERF_EVENT = user
2015年 3月 29日 日曜日 16:56:00 JST
SERF_EVENT = member-join
sakura3.pocketstudio.net 192.168.39.13
クエリを試すには?
イベントハンドラでquery
を指定し、-event-handler=query=<コマンドまたはスクリプト名>
の形式でSerfエージェントを起動します。例えばuptime
コマンドを実行するクエリの指定は次のようにします。
$ serf agent -event-handler="query=uptime"
このときに注意するのは、-event-handler=
の指定が必要です。設定後、serf query uptime
イベントを発生すると、uptime
コマンドを実行した結果が表示されます。
$ serf query uptime Query 'uptime' dispatched Ack from 'sakura1.pocketstudio.net' Response from 'sakura1.pocketstudio.net': 17:38:47 up 368 days, 21:38, 3 users, load average: 0.12, 0.35, 0.30 Ack from 'sakura3.pocketstudio.net' Response from 'sakura3.pocketstudio.net': 17:38:48 up 368 days, 21:42, 1 user, load average: 0.29, 0.29, 0.21 Total Acks: 2 Total Responses: 2
その他の環境変数と応用の仕方
Serfのイベント情報は、SERF_
でイベント名を判別し、
主な環境変数は、
SERF_
EVENT 発生したイベント名です。ここには
member-join
,member-leave
,member-failed
,member-update
,member-leap
,user
,query
が入ります。SERF_
SELF_ NAME イベントハンドラを実行する自分自身のホスト名です。
SERF_
TAG_<タグ名> <タグ名>で指定した値です。
SERF_
USER_ EVENT ユーザイベントの名称が入ります。このときの環境変数
SERF_
はEVENT user
です。SERF_
QUERY_ NAME クエリの名称が入ります。このときの環境変数
SERF_
はEVENT query
です。
イベントハンドラと環境変数の関係を理解するには、serf-event.
を作成し、
$ serf agent -log-level=debug -event-handler=./serf-event.sh
起動後はSerfのクラスタに追加・
まとめ
Serfには2種類のイベントがあり、
次回は、