Erlang 中终止节点的检测是如何工作的?net_ticktime 如何影响 Erlang 中节点活跃度的控制?

StackOverflow https://stackoverflow.com//questions/24061270

我将 net_ticktime 值设置为 600 秒。

net_kernel:set_net_ticktime(600)

在 Erlang 文档中 net_ticktime = TickTime:

指定 net_kernel 滴答时间。TickTime 以秒为单位给出。每 TickTime/4 秒一次,所有连接的节点都会被标记一次(如果已向节点写入其他内容),并且如果在最后四 (4) 个标记时间内未从另一个节点接收到任何内容,则该节点被视为已关闭。这确保了由于硬件错误等原因而没有响应的节点被视为已关闭。

检测到无响应节点的时间 T:

MinT < T < MaxT where:

MinT = TickTime - TickTime / 4
MaxT = TickTime + TickTime / 4

TickTime 默认为 60(秒)。因此,45 < T < 75 秒。

笔记:通常,会立即检测到终止节点。

我的问题: 我的 TickTime 是 600(秒)。因此,450(7.5 分钟)< T < 750 秒(12.5 分钟)。虽然,当我将 Erlang 中所有分布式节点的 net_ticktime 设置为值 600 时,当某些节点发生故障时(例如,当我关闭 Erlang shell 时),其他节点会立即收到消息,而不是根据滴答时间的定义。

然而,值得注意的是,通常会立即检测到终止节点,但我找不到分布式 Erlang 中节点终止的立即响应原则的解释(无论是在 Erlang 文档、Erlang 电子书或其他基于 Erlang 的源中)。分布式环境中的节点是否定期以更小的间隔进行 ping 操作 net_ticktime 或者终止节点在终止之前是否向其他节点发送某种消息?如果它确实发送消息,是否存在终止节点无法发送此消息并且必须对其进行 ping 操作以调查其活跃性的情况?

Erlang 文档中还指出,对于超过 100 个节点的集群,分布式 Erlang 的可扩展性不太好,因为每个节点都保持与集群中所有节点的链接。用于调查节点活跃度(ping、宣布终止)的算法是否会随着集群大小的增加而修改?

有帮助吗?

解决方案

当两个 Erlang 节点连接时,它们之间会建立 TCP 连接。您引发的故障将导致底层操作系统关闭连接,从而非常快速地有效通知其他节点。

网络标记用于检测与看似已启动但实际上未传递流量的远程节点的连接,例如当网络事件隔离节点时可能会发生这种情况。

如果要模拟需要勾选才能检测到的故障,请使用防火墙阻止节点首次 ping 时创建的连接上的流量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top