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 参数中指定该名称。

链接