【发布时间】:2014-07-26 12:14:45
【问题描述】:
我将 net_ticktime 值设置为 600 秒。
net_kernel:set_net_ticktime(600)
在 net_ticktime = TickTime 的 Erlang 文档中:
指定 net_kernel 滴答时间。 TickTime 以秒为单位。每 TickTime/4 秒一次,所有连接的节点都会被打勾(如果任何其他内容已写入节点),并且如果在最后四 (4) 个刻度时间内没有从另一个节点接收到任何内容,则该节点被视为已关闭。这可确保将因硬件错误等原因未响应的节点视为已关闭。
检测到没有响应的节点的时间T:
MinT < T < MaxT where:
MinT = TickTime - TickTime / 4
MaxT = TickTime + TickTime / 4
TickTime 默认为 60(秒)。因此,45
注意:通常情况下,会立即检测到终止节点。
我的问题: 我的 TickTime 是 600(秒)。因此,450(7.5 分钟)
然而值得注意的是,通常会立即检测到终止节点,但我找不到关于分布式 Erlang 中节点终止的立即响应原则的解释(在 Erlang 文档、Erlang 电子书或其他基于 Erlang 的资源中都没有)。分布式环境中的节点是否以小于net_ticktime 的间隔定期 ping,或者终止节点是否在终止之前向其他节点发送某种消息?如果它确实发送了消息,是否存在终止节点无法发送该消息并且必须被ping以调查其活跃度的情况?
此外,Erlang 文档中还指出,分布式 Erlang 对于超过 100 个节点的集群来说不是很可扩展,因为每个节点都与集群中的所有节点保持链接。调查节点活跃度(ping、宣布终止)的算法是否会随着集群规模的增加而修改?
【问题讨论】:
-
一个关键问题:您的节点是否在滴答之间(rpc、mnesia 交易等)进行自己的任何通信?如果是这样,VM 有可能(实际上,很有可能)在滴答声之前检测到一个宕机的节点。
-
我在两种情况下测试了问题:1.) 我尝试只使用 cmd
net_adm:ping(),远程连接驻留在两个 VM 上的 Erlang shell,关闭 shell 后 cmdnodes()立即识别出节点已关闭并且返回[],但滴答声之间没有通信。 2.) 我在我的 Riak 应用程序中尝试了这个问题。我杀死了运行应用程序的节点。然后定期向其他节点发送命令以获取有关被杀死节点的信息。在timer:sleep(10)存活节点之后仍然将被杀死的节点列为存活,但在timer:sleep(100)被杀死的节点被标记为关闭但 100ms
标签: erlang monitoring distributed fault-tolerance