网络心跳时间 (节点间通信心跳)
概述
本指南涵盖 RabbitMQ 节点和 CLI 工具(准确来说,是 Erlang 节点)用来确定对等节点 [不] 可用性的机制,称为 "网络心跳"
或 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% for ) 秒内未收到来自节点的通信,则该节点被视为宕机,不再是集群的成员。
在集群中的所有节点上增加 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 上作为 Windows 服务启动,因此无法使用配置文件设置 net_ticktime
。请参阅 此部分 中的 Windows 配置 文档,了解在 RabbitMQ 作为 Windows 服务运行时设置 net_ticktime
的方法。