Zuz*_*ana 5 erlang monitoring distributed fault-tolerance
我将net_ticktime值设置为600秒.
net_kernel:set_net_ticktime(600)
Run Code Online (Sandbox Code Playgroud)
在Erlang文档中,net_ticktime = TickTime:
指定net_kernel滴答时间.TickTime以秒为单位.一旦每个TickTime/4秒,所有连接的节点都被勾选(如果还有其他任何东西被写入节点),并且如果在最后四(4)个滴答时间内没有从另一个节点接收到该节点被认为是关闭的.这可以确保由于硬件错误等原因而未响应的节点被认为已关闭.
时间T,其中检测到未响应的节点:
MinT < T < MaxT where:
MinT = TickTime - TickTime / 4
MaxT = TickTime + TickTime / 4
Run Code Online (Sandbox Code Playgroud)
TickTime默认为60(秒).因此,45 <T <75秒.
注意:通常,会立即检测到终止节点.
我的问题: 我的TickTime是600(秒).因此,450(7.5分钟)<T <750秒(12.5分钟).虽然,当我将某个节点发生故障时(例如,当我关闭Erlang shell时)将net_ticktime设置为Erlang中的所有分布式节点值为600时,其他节点立即获取消息而不是根据ticktime的定义.
但是请注意,通常会立即检测到终止节点,但我无法在分布式Erlang中找到针对节点终止的立即响应原则的解释(在Erlang文档或Erlang电子书或其他基于Erlang的源中).分布式环境中的节点是否以较小的间隔周期性地ping通,net_ticktime
或终止节点在终止之前是否向其他节点发送某种消息?如果确实发送了消息,那么终止节点何时无法发送此消息并且必须进行调整以调查其活动性?
此外,在Erlang文档中还注意到,对于大于100个节点的集群,Distributed Erlang的扩展性不是很高,因为每个节点都保持与集群中所有节点的链接.用于调查节点活跃性的算法(ping,宣布终止)是否随着群集规模的增加而被修改?
当两个 Erlang 节点连接时,它们之间会建立 TCP 连接。您引发的故障会导致底层操作系统关闭连接,从而非常快速地有效通知其他节点。
网络滴答用于检测与远程节点的连接,该连接看似已启动但实际上并未通过流量,例如当网络事件隔离节点时可能会发生这种情况。
如果您想模拟需要滴答来检测的故障,请使用防火墙来阻止节点首次 ping 时创建的连接上的流量。