べにやまぶろぐ

技術寄りの話を書くつもり

JTF2014「Serfでシステム監視と運用を楽しくする話」の聴講メモ #techfesta

Docker や Vagrant とか Chef とか Ansible とかは割と使っているとは思うのですが、いわゆるオーケストレーションツールや運用における監視といったところはまだ届いておらず、Serf 名前だけ知ってます状態だったので こちらのセッション に参加してきました。

個人的に響いたこと
  • Vagrant でおなじみ Mitchell Hashimoto 氏率いる HashiCorp から最近出てきたのは Serf だけでなく Consul というのもある。
  • ノードの死活監視をメインにする Serf に対して Consul はサービス単位での監視を行うことができる。
    • マルチ DC なんてサービスもあるし、Web API でクラスタの状態抜けたり自前で KVS もってるからいろいろ使えそう
  • ゴシッププロトコルと聞いて真っ先に思い浮かべるのは Cassandra。
  • 今いち棲み分けというかベストプラクティスがわからないのでこの辺は要体験
講演メモ
  • ご注文は監視自動化ですか?
    • Serf や Consul は計量シンプルでありながら様々なシーンに利用できる。
    • また他の類似ツールを使うより敷居が低く煩雑な業務から解放されることができる
    • Serf と Consul は Immutable Infrastructure の文脈で登場
  • Serf : 軽量単純なツール
    • 軽量なオーケストレーションツール
    • 全ノードで秒単位のイベント同期
    • メンバ一覧とイベントの発生を管理
    • 障害検知、フェイルオーバー機能
    • ロールとタグ機能を持つ
    • 3つの特徴
      • メンバ管理
        • クラスタをゴシッププロトコルで構成
        • マスタサーバがない(全て並列)
        • クラスタ参加・離脱を監視
          • イベントハンドラを使うと任意のコマンドをクラスタ全体のノードに実行できる
          • どのノードに話しかけても join できる
          • ランダムに相互監視する
      • 障害検知
        • ノードが死んでも復活しないかしばらく(デフォルト24時間)定期的に確認する
      • 同期イベント
        • メンバーシップ : member-join/member-leave/member-fall/member-leap
        • カスタム : event/query
    • 基本的な使い方 : serf agent で起動
  • Consul : Serf を作った後に出た
    • サービス検出 : Serf だとノードが存在するかどうかしかわからないが、Consul であれば内部のサービス単位でチェックできる
    • HTTP の API / DNS を提供しているので如何様にでもアクセスできる
      • consul の中で DNS レコードを管理するのでドメイン名で見に行って内部 IP をチェックすることができる
    • 障害検知 : サービスやノードのヘルスチェック
    • マルチデータセンタ
    • キーバリューストレージ : Restful に操作可能で、Consul が内部的に使っているものだけでなくユーザーが自分のために使うこともできる
  • Consul による監視
    • Web UI を提供(http://demo.consul.io/ui/)
      • 過去の状態は記録しないで今の状態しか知らない、immutable infrastructure の思想?
      • nagios / munin をそのまま使うこともできる
    • HTTP API
    • DNS interface
    • Blocking query
    • envconsul
  • 特徴
    • 非中央集権型
    • リアルタイムに動作
      • 従来のツールはサーバが異常検知するまでにタイムラグがある
      • envconsul と連携することで障害発生後のアクションを行える
    • 今を知る(時系列は保存しない)
  • Consul: サービス単位とノード単位の監視、サービスに近いレイヤ、Serf: マシンや OS - ミドルまでを対象
  • Consul の情報同期は Anti entropy
    • クライアントが主体
    • エージェントがサーバに push することで状態の更新が行われる。クライアントがサーバーの状況を書き換える
    • 監視用サーバーの IP 変更なども一斉に行うことができる
  • 学習のコストが低い、既存の仕組みを変更しない