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 中。設定檔由兩個主要部分組成

  • 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 參數中指定。

連結