TCP 重传超时编辑

每个 Elasticsearch 节点对之间通过多个 TCP 连接进行通信,这些连接 保持打开状态,直到其中一个节点关闭或节点之间的通信因底层基础设施故障而中断。

TCP 通过隐藏临时网络中断,为通信应用程序提供可靠的通信,即使网络偶尔不可靠。您的操作系统会重传任何丢失的消息多次,然后再通知发送方任何问题。Elasticsearch 必须在重传发生时等待,并且只能在操作系统决定放弃后才能做出反应。因此,用户也必须等待一系列重传完成。

大多数 Linux 发行版默认情况下会重传任何丢失的数据包 15 次。重传以指数方式退避,因此这 15 次重传需要超过 900 秒才能完成。这意味着 Linux 使用这种方法需要几分钟才能检测到网络分区或失败的节点。Windows 默认情况下只有 5 次重传,对应于大约 13 秒的超时。

Linux 默认值允许在可能经历很长时间的数据包丢失的网络上进行通信,但这种默认值对于大多数 Elasticsearch 安装使用的优质网络来说是过度的,甚至是有害的。当集群检测到节点故障时,它会通过重新分配丢失的分片、重新路由搜索以及可能选举新的主节点来做出反应。高可用性集群必须能够及时检测到节点故障,这可以通过减少允许的重传次数来实现。与 远程集群 的连接也应该比 Linux 默认值允许的更快地检测到故障。因此,Linux 用户应该减少 TCP 重传的最大次数。

您可以通过以下命令以 root 身份运行,将 TCP 重传的最大次数减少到 5。五次重传对应于大约 13 秒的超时。

sysctl -w net.ipv4.tcp_retries2=5

要永久设置此值,请更新 /etc/sysctl.conf 中的 net.ipv4.tcp_retries2 设置。要验证重启后是否生效,请运行 sysctl net.ipv4.tcp_retries2

此设置适用于所有 TCP 连接,并将影响与 Elasticsearch 集群以外的系统的通信可靠性。如果您的集群通过低质量网络与外部系统通信,则可能需要为 net.ipv4.tcp_retries2 选择更高的值。出于这个原因,Elasticsearch 不会自动调整此设置。

相关配置编辑

Elasticsearch 还实现了它自己的内部健康检查,其超时时间比 Linux 上的默认重传超时时间短得多。由于这些是应用程序级健康检查,因此它们的超时时间必须允许应用程序级影响,例如垃圾回收暂停。您不应该减少与这些应用程序级健康检查相关的任何超时时间。

您还必须确保您的网络基础设施不会干扰节点之间的长时间保持连接,即使这些连接看起来处于空闲状态。当连接达到一定年龄时就会断开连接的设备是 Elasticsearch 集群常见问题的来源,并且不能使用。