Serf/Consulで管理を自動化! ~実践的な手法を紹介~

第2回 Serfのイベントハンドラで自動化を使いこなす

この記事を読むのに必要な時間:およそ 4 分

イベントハンドラとは?

前回の記事で見たように,Serfエージェントをサーバ上で起動することで,簡単にネットワーク上にクラスタを構成できます。クラスタを構成後,Serfはネットワーク上で相互に死活監視するだけでなく,クラスタのメンバ管理(ホスト名・IPアドレス・タグ等を共有)を行えます。この監視状況やメンバの変化という「イベント」に応じて,シェルスクリプトやコマンドを実行する機能が「イベントハンドラ」です。

イベントハンドラは単純にコマンド実行するだけでなく,環境変数を通してSerfからスクリプトに様々なデータを渡せます。この仕組みを使い,コマンド実行時に動的に変わる引数(ホスト名・IPアドレス・タグ等)の指定や,動的に変わる環境に対する設定変更を行えます。

そのため,イベントハンドラの理解・習得が,Serfを使って自動化を進めるうえで欠かせません。とは言え,さほど難しい概念ではありませんので,身構えなくとも大丈夫です。

イベントは大きく2つに分類

Serfがイベントハンドラを実行するタイミングは,⁠イベント」の発生時です。イベントとはSerfクラスタ内で発生する出来事に対して定義します。イベントは表1のように2つに分類されます。1つは,クラスタ内のメンバ管理に関してシステムが自動的に発行するもので,もう1つはユーザが任意に発行するものです。

Serfが強力なのは,これらのイベント発生時,クラスタ内で瞬時かつ一斉にイベントハンドラを実行できる点です。従来の監視ツールでも,Serfのイベントハンドラと同様に一斉処理を行えるでしょう。しかし,監視サーバから監視対象のサーバやリソースを監視するため,障害発生から検出・対処までタイムラグが発生します。一方のSerfであれば,クラスタ全体に対して瞬時にイベントが伝わるため,各々のサーバ内で任意の処理を行えます。

表1 イベントの分類

イベントの分類 特徴 イベントの種類
メンバ管理 クラスタへのメンバ参加・離脱等のタイミングで自動的に発生するイベント member-join,member-leave,member-failed,member-update,member-leap
カスタム ユーザが任意のタイミングで発生させるイベント user event,query

イベントの種類

具体的にSerfが持つイベントの種類を見ていきます。Serfが「どの」タイミングで「何」を実行したいかを決めるのは,イベント種類の使い分けによります。

メンバ管理系イベント

「member-」で始まるイベントは,Serfによって構成されるクラスタ上において,メンバ変更のタイミングで自動発生します図1)⁠

図1 メンバー管理系イベント

図1 メンバー管理系イベント

「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」「query」イベントは,どちらもユーザが任意のタイミングで発生できるイベントです図2)⁠システムで自動発行されるイベントではありませんので,コマンドライン上でserf event <イベント名>serf query <イベント名>のように実行します。

図2 カスタムイベント

図2 カスタムイベント

「user event」(ユーザイベント)

クラスタ上のサーバでコマンドを実行します。特定のサービスの再起動や,コマンドの実行をしたい場合に手軽に利用できます。

「query」(クエリ)

クラスタ上のサーバでコマンドを実行し,その実行結果を取得して標準出力に表示します。ユーザイベントと異なり,コマンドの処理結果を画面上で確認できます。サーバにログインすることなく,サーバ内の情報を取得できます。

カスタムイベントの特徴として,実行するサーバやPC上のSerfは,クラスタに参加している必要がありません。そのため,手元のPC上から-rpc-addr=オプションを指定して,次のようにイベントを実行させることができます。複数台のサーバ上で一斉に処理を実行できるため,例えば障害発生後の一次対応をサーバにログインせず行うような応用が考えられます。

$ serf event -rpc-addr=192.168.39.3:7373 <イベント名> <ペイロード>

著者プロフィール

前佛雅人(ぜんぶつまさひと)

クリエーションライン株式会社 Technology Evangelist

ホスティングサービスで運用保守サポートに携わった後,現職へ。サポート業務や新技術検証・開発業務を行う。趣味で監視や自動化に関するOSS検証や翻訳を行うのが好き。辛口の日本酒が大好き。

Twitter:@zembutsu

コメント

コメントの記入