节点间通信心跳(网络滴答时间)
概述
本指南涵盖了 RabbitMQ 节点和 CLI 工具(即 Erlang 节点)用于确定对等方 [是否] 不可用的一种机制,称为“net ticks”或“kernel.net_ticktime”。
集群中的每对节点都通过传输层连接。所有节点对之间会定期交换滴答消息,以维护连接并检测断开连接。否则,网络中断可能会在相当长一段时间内(取决于传输和操作系统内核设置,例如 TCP)未被检测到。从根本上说,这与心跳在消息传递协议中寻求解决的问题相同,只是对等方不同:RabbitMQ 集群节点和 CLI 工具。
节点和连接的 CLI 工具会定期互相发送小数据帧。如果在给定的时间内未从某个对等方收到数据,则认为该对等方不可用(“已宕机”)。
当一个 RabbitMQ 节点确定另一个节点已宕机时,它会记录一条消息,其中包含其他节点的名称和原因,例如:
2018-11-22 10:44:33.654 [info] node rabbit@peer-hostname down: net_tick_timeout
在此例中,net_tick_timeout 事件告诉我们,由于超过了网络滴答时间,另一个节点被检测为宕机。另一个常见原因是 connection_closed,表示连接在 TCP 层面被显式关闭。
Erlang 文档 包含有关此子系统的更多详细信息。
滴答频率
滴答消息的频率和故障检测频率由 net_ticktime 配置设置控制。通常,在 net_ticktime 秒内,节点对之间会交换四次滴答。如果在 net_ticktime (± 25%) 秒内未收到来自某个节点的通信,则该节点被认为已宕机,不再是集群成员。
增加集群中所有节点的 net_ticktime 可以使集群对短期网络中断更具弹性,但剩余节点检测宕机节点需要更长时间。反之,减小集群中所有节点的 net_ticktime 可以降低检测延迟,但会增加检测到虚假分区的风险。
应仔细考虑更改默认 net_ticktime 的影响。集群中的所有节点必须使用相同的 net_ticktime。以下示例 advanced.config 配置演示了将默认 net_ticktime 从 60 秒增加到 120 秒:
[
{kernel, [{net_ticktime, 120}]}
].
对 HTTP API 的影响
HTTP API 通常需要执行集群范围的查询,这会导致在检测和处理分区之前,UI 可能显得无响应。降低 net_ticktime 有助于在此类事件中提高响应能力,但如上所述,任何更改 net_ticktime 的决定都应谨慎进行。
Windows 配置
由于 RabbitMQ 作为 Windows 服务启动的方式,您无法使用配置文件设置 net_ticktime。请参阅 Windows 配置文档的此部分,了解在将 RabbitMQ 作为 Windows 服务运行时设置 net_ticktime 的方法。