如何从本地节点模拟erlang集群中的临时netsplit?

如何从本地节点模拟erlang集群中的临时netsplit?,erlang,simulation,distributed-system,Erlang,Simulation,Distributed System,我在本地计算机上有几个节点连接到集群中。在以gproc作为依赖项运行我的应用程序的每个节点上。我需要测试如果出现临时netsplit,我的应用程序将如何运行。如何模拟临时netsplit?您可以将特定节点的cookie设置为不正确的值,然后手动断开连接。这两个节点将无法重新连接,因为Cookie不匹配 erlang:set_cookie(myothernode@localhost, invalid_cookie), erlang:disconnect_node(myothernode@local

我在本地计算机上有几个节点连接到集群中。在以gproc作为依赖项运行我的应用程序的每个节点上。我需要测试如果出现临时netsplit,我的应用程序将如何运行。如何模拟临时netsplit?

您可以将特定节点的cookie设置为不正确的值,然后手动断开连接。这两个节点将无法重新连接,因为Cookie不匹配

erlang:set_cookie(myothernode@localhost, invalid_cookie),
erlang:disconnect_node(myothernode@localhost)
要重新连接,请再次设置正确的cookie并ping节点:

erlang:set_cookie(myothernode@localhost, erlang:get_cookie()),
pong = net_adm:ping(myothernode@localhost)
通常,netsplit(或一般的网络故障)的行为不同于“正确断开连接”。这就是我建议通过修改底层网络堆栈来模拟此类故障的原因

为此,您可以使用
iptables
tc

现有的库可以通过使用
docker
来帮助您进行这样的设置-如果这是一个选项,您可以查看。一旦设置好,您就可以很容易地引入许多在分布式系统上工作时必须处理的常见网络故障(免责声明:我不久前为该库做了贡献)