Nerve

ヘルスチェックを実行するサービス登録デーモン。airbnb/synapse のコンパニオン。
925
作成者Igor Serebryany

Nerveは、マシンとサービスの状態を追跡するためのユーティリティです。分散システムを構成するボックス上でローカルに実行され、状態情報を分散キーバリューストアに報告します。Airbnbでは、キーバリューストアとしてZookeeperを使用しています。NerveとSynapseの組み合わせにより、クラウドでのサービスディスカバリーが簡単になります。

モチベーション

リモートサービスを発見するために、既にSynapseを使用しています。ただし、これらのサービスでは、Zookeeperに自身を登録するためのボイラープレートコードが必要でした。Nerveは、基礎となるサービスを簡素化し、コードの再利用を可能にし、より構成可能なシステムを作成できるようにします。これは、ボイラープレートを独自のアプリケーションにファクタリングし、監視とレポートを独立して処理することで実現します。

これらの利点に加え、Nerveはシステムの一般的な監視役としても機能します。報告される情報は、集中型の自動化センターからのアクションに使用できます。分散システムのスケールアップまたはスケールダウン、ダウンタイムに関する運用またはエンジニアリングへのアラートなどのアクションです。

インストール

アプリケーションのGemfileに次の行を追加します。

gem 'nerve'

そして、以下を実行します。

$ bundle

または、以下のように自分でインストールします。

$ gem install nerve

設定

Nerveは、json形式の単一の設定ファイルに依存します。通常はnerve.conf.jsonと呼ばれます。設定ファイルの例はexample/nerve.conf.jsonにあります。設定ファイルは、主に2つのセクションで構成されています。

  • instance_id: サービスを登録するときにNerveが送信する名前。デバッグが容易になります。
  • services: Nerveが監視するサービスのハッシュ(サービス名から設定)。
  • service_conf_dir: 各jsonファイルが、ファイル名から拡張子.jsonを除いたベース名を持つサービスとして解釈されるディレクトリへのパス。

サービス設定

Nerveが監視する各サービスは、servicesハッシュで指定します。キーはサービスの名前で、値はNerveにサービスの監視方法を指示する設定ハッシュです。設定には、次のオプションが含まれています。

  • host: サービスチェックを行うデフォルトのホスト。サービスが公開されていることを確認するために、パブリックIPにする必要があります。
  • port: サービスチェックのデフォルトのポート。Nerveは、選択したレポーターを介してhost:portの組み合わせを報告します。
  • reporter_type: アップ/ダウン情報を報告するために使用されるメカニズム。選択したレポーターに応じて、追加のパラメーターが必要になる場合があります。デフォルトはzookeeperです。
  • check_interval: サービスチェックが開始される頻度。デフォルトは500msです。
  • checks: Nerveが実行するチェックのリスト。すべてが合格した場合、サービスは登録されます。それ以外の場合は、登録解除されます。

Zookeeperレポーター

reporter_type"zookeeper"に設定する場合は、これらのパラメーターも設定する必要があります。

  • zk_hosts: Nerveが登録を送信するアンサンブルを構成するZookeeperホストのリスト。
  • zk_path: 登録が作成されるパス(またはznode)。Nerveは、登録である一時ノードをこのパスの子として作成します。

Etcdレポーター

注: Etcdのサポートは現在実験段階です。

reporter_type"etcd"に設定する場合は、これらのパラメーターも設定する必要があります。

  • etcd_host: Nerveが登録を送信するEtcdホスト。
  • etcd_port: Etcdに接続するためのポート。
  • etcd_path: 登録が作成されるパス。Nerveは、このパスの子として、30秒のTTLを持つ登録であるノードを作成し、数秒ごとに更新します。

チェック

Nerveの中核は、サービスチェックのセットです。各サービスは複数のチェックを定義でき、サービスを登録するには、すべてが合格する必要があります。各チェックに渡される正確なパラメーターは異なりますが、すべていくつかの共通の引数を取ります。

  • type: (必須)チェックの種類。このリポジトリのlib/nerve/service_watcherディレクトリで使用可能なチェックタイプを確認できます。
  • name: (オプション)チェックの記述的で人間が読める名前。指定しない場合は、他のパラメーターに基づいて自動生成されます。
  • host: (オプション)チェックが実行されるホスト。デフォルトは、チェックが属するサービスのhostです。
  • port: (オプション)チェックが実行されるポート。hostと同様に、デフォルトはサービスのportです。
  • timeout: (オプション)チェックに許可される最大時間。デフォルトは100msです。
  • rise: (オプション)チェックが合格したと見なされるまでに連続して合格する必要があるチェックの数。デフォルトは1です。
  • fall: (オプション)チェックが失敗したと見なされるまでに連続して失敗する必要があるチェックの数。デフォルトは1です。

カスタム外部チェック

カスタムチェックを実行したいが、このプロジェクトにマージしようとは思わない場合は、@bakins(airbnb/nerve#36)のおかげで外部チェックを含めるメカニズムがあります。カスタムチェックを別のgemとしてビルドし、システムでbundle installしていることを確認してください。

理想的には、gemに"nerve-watcher-#{type}"という名前を付ける必要があります。これは、Nerveが起動時にrequireするものです。ただし、gemにカスタム名がある場合は、チェックのmodule引数で指定できます。

リンク