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"
,还应设置以下参数
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
:(可选)必须连续通过多少次检查才能认为检查已通过;默认为 1fall
:(可选)必须连续失败多少次检查才能认为检查已失败;默认为 1自定义外部检查
如果您想运行自定义检查,但不想尝试将其合并到此项目中,则由于 @bakins (airbnb/nerve#36),存在一个包含外部检查的机制。将您的自定义检查构建为一个单独的 gem,并确保在您的系统上 bundle install
它。
理想情况下,您应该将 gem 命名为 "nerve-watcher-#{type}"
,因为这是 nerve 在启动时 require
的内容。但是,如果您为 gem 指定了自定义名称,则可以在检查的 module
参数中指定该名称。