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

第1回 Serf入門:動的に変化する環境を簡単に管理

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

Serfのセットアップ

Serfを使うには,バイナリを各サーバ上に展開する必要があります。対応しているOSは,Linux,Mac OS X,Windowsなどです。ダウンロードページで作業環境に合わせてダウンロードをお願いします。以下はLinux環境(64bit)のセットアップ例です。

$ wget -O 0.6.4_linux_amd64.zip https://dl.bintray.com/mitchellh/serf/0.6.4_linux_amd64.zip
$ unzip 0.6.4_linux_amd64.zip
$ sudo cp ./serf /usr/local/bin/serf

正常であれば,次のようにバージョン情報を確認できます。Serfプロトコルのバージョンは,過去2世代まで互換性が保証されますので,実際の利用時には覚えておくことをお勧めします。

$ serf -v
Serf v0.6.4
Agent Protocol: 4 (Understands back to: 2)

Serfでクラスタを構成

エージェントの起動

2台のサーバでクラスタを構成するには,それぞれのサーバでSerfエージェントをコマンドラインで起動します。ここでは,次の図のような構成を想定します。

図3 2台でクラスタを構成

図3 2台でクラスタを構成

まず1台目のサーバでserf agentコマンドを使い,Serfを起動します。

$ serf agent &
==> Starting Serf agent...
==> Starting Serf agent RPC...
==> Serf agent running!
         Node name: 'sakura1.pocketstudio.net'
         Bind addr: '0.0.0.0:7946'
          RPC addr: '127.0.0.1:7373'
         Encrypted: false
          Snapshot: false
           Profile: lan

==> Log data will now stream in as it occurs:

    2015/03/10 22:21:16 [INFO] agent: Serf agent starting
    2015/03/10 22:21:16 [INFO] serf: EventMemberJoin: sakura1.pocketstudio.net 192.168.39.1
    2015/03/10 22:21:17 [INFO] agent: Received event: member-join

これで待機状態になりました。もう1台のサーバでは-joinオプションを使用して接続先のクラスタを明示して起動します。正常に起動すると「EventMemberJoin」というイベントが発生し,エージェントは相互にホスト名やIPアドレスなどの情報を共有開始します。

$ serf agent -join=192.168.39.11 &

3台目以降の場合も,同様のコマンドを使ってクラスタに参加できます。また,マルチキャスト通信(mDNS)が許可されているネットワーク内であればクラスタ参加先を明示しなくても自動的に参加するオプションがあります。エージェント起動時のオプションで-discover=<任意のクラスタ名称>を使う場合は,クラスタ名称の一致するSerfクラスタに自動的に参加します。

なお,Serfエージェントが通信するため,iptablesやファイアウォールで制限している場合,ポート7946(TCP/UDP)の許可が必要です。また,コマンドラインを通してRPCプロトコルを使って情報を取得する場合は,ポート7373(TCP)の許可も必要になります。

クラスタ情報の確認

クラスタを構成しているサーバの情報を表示するには,serf membersコマンドを実行します。実行結果には左から「ホスト名」⁠IPアドレス」⁠死活状況」⁠タグ(存在している場合⁠⁠」の情報が表示されます。

$ serf members
sakura1.pocketstudio.net  192.168.39.1:7946  alive
sakura2.pocketstudio.net  192.168.39.2:7946  alive

エージェントを停止しますと,⁠alive」の状態が「left」⁠Ctrl+Cなどで正常終了時)「failed」⁠異常停止時)の状態に切り替わります。

イベントとクエリ

次は,クラスタ間で情報が共有される状態を確認しましょう。ここではSerfのログを参照し,イベントが伝播する状況を確認します。エージェントを起動したままであれば,画面にデバッグ情報が出力され続けていると思います。別のコンソールから確認したい場合はserf monitorコマンドを実行します。

コマンドラインからserf event testと実行します。

$ serf event test
Event 'test' dispatched! Coalescing enabled: true

実行後はSerfクラスタ内でイベントが共有され,サーバすべてで次のようなログが表示されます。実際には,このイベント発生のタイミングで,任意のコマンドを実行するように設定できます。

    2015/03/10 22:42:24 [INFO] agent: Received event: user-event: test

イベントの他にクエリと呼ばれるリクエストを送ることができます。イベントは一方的に送るだけですが,クエリの場合は実行結果を実行したエージェントに戻せます。

まとめ

今回はSerfの基本的な概念や使い方を見て行きました。Serfの機能はバイナリ1つを置くだけですぐ使えますので,運用シーンにおける十徳ナイフのようなものと言えるのではないでしょうか。次回は,より実践的なイベントハンドラの取り扱い方を見ていきます。

参考情報

著者プロフィール

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

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

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

Twitter:@zembutsu