跳至主要内容
版本:4.0

网络心跳时间 (节点间通信心跳)

概述

本指南涵盖 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 的方法。

© 2024 RabbitMQ. All rights reserved.