一、为什么Erlang节点突然"失联"了

作为分布式系统的老司机,你一定遇到过这样的场景:明明配置看起来没问题,但节点之间就是找不到对方。就像两个人在同一个商场却死活碰不到面,这种时候就需要一份详细的"寻人启事"——网络配置检查清单。

举个真实案例:

%% 节点A启动命令
erl -name node_a@192.168.1.100 -setcookie mysecret

%% 节点B启动命令  
erl -name node_b@192.168.1.101 -setcookie mysecret

%% 在节点A尝试ping
net_adm:ping('node_b@192.168.1.101').  % 返回pang表示失败

注释说明:

  • 使用完全限定域名(FQDN)格式
  • 确保cookie值完全一致
  • ping命令是Erlang节点间的基础连通性测试

二、网络基础配置检查

2.1 防火墙的"隐形墙"效应

现代防火墙就像过度保护的老母亲,常常把正常通信也拦在外面。检查要点:

%% 查看Erlang使用的端口范围
application:get_env(kernel, inet_dist_listen_min).  % 默认端口范围起点
application:get_env(kernel, inet_dist_listen_max).  % 默认端口范围终点

注释:

  • Erlang分布式通信使用TCP协议
  • 默认端口范围通常是9000-9999
  • 需要开放这些端口的双向通信

2.2 DNS解析的"指路牌"是否准确

%% 测试DNS解析功能
inet:gethostbyname("node_b.example.com").  % 检查是否能解析到正确IP
net_adm:names().  % 查看当前EPMD注册的节点

注释:

  • 建议在/etc/hosts中配置静态解析
  • EPMD(Erlang Port Mapper Daemon)默认使用4369端口

三、Erlang运行时配置详解

3.1 节点命名的正确姿势

%% 正确示例 - 使用统一命名规范
erl -name my_node@host.domain.com  % 长名称格式
erl -sname my_node  % 短名称格式(仅限本地网络)

%% 错误示例 - 混合使用会导致问题
erl -name node1@host1 -sname node2  % 绝对不要这样混用!

注释:

  • 长名称格式需要完整DNS解析支持
  • 短名称格式适用于本地测试环境

3.2 Cookie配置的玄机

%% 查看当前cookie值
erlang:get_cookie().  % 返回当前节点的magic cookie

%% 动态设置cookie(不推荐生产环境使用)
erlang:set_cookie(node(), 'newsecret').

注释:

  • cookie相当于节点间的"暗号"
  • 分布式Erlang要求所有通信节点使用相同cookie
  • 可通过.home/.erlang.cookie文件配置

四、高级网络调试技巧

4.1 网络追踪工具包

%% 启用分布式通信调试
dbg:tracer(), dbg:p(all,c), dbg:tpl(net_kernel, x).  % 跟踪网络内核模块

%% 检查连接状态
net_kernel:monitor_nodes(true).  % 启用节点监控

注释:

  • dbg是Erlang的强大调试工具
  • 监控节点上下线事件
  • 生产环境慎用全量跟踪

4.2 EPMD的隐藏功能

# Linux下查询EPMD注册信息
epmd -names  # 列出所有注册节点
epmd -kill   # 强制重启EPMD守护进程

注释:

  • EPMD是Erlang节点发现的基石
  • 遇到节点发现问题时可以尝试重启EPMD
  • 确保4369端口可访问

五、容器化环境特别注意事项

在Docker/Kubernetes环境中,网络配置更加复杂:

%% Kubernetes环境下的典型配置
erl -name node@$(hostname).$(NAMESPACE).svc.cluster.local \
    -setcookie ${ERLANG_COOKIE} \
    -kernel inet_dist_listen_min 9100 \
    -kernel inet_dist_listen_max 9200

注释:

  • 需要使用完整的集群内DNS名称
  • 明确指定端口范围便于防火墙配置
  • 通过环境变量传递敏感配置

六、经典故障案例复盘

案例:某金融系统节点间歇性失联

%% 故障现象
net_adm:ping('trade_node@10.10.10.5').  % 有时成功有时失败

%% 最终发现是MTU设置问题
os:cmd("ping -M do -s 1472 10.10.10.5").  % 测试最大传输单元

注释:

  • 金融系统常用VPN导致MTU变小
  • Erlang分布式通信对大数据包敏感
  • 解决方案:调整MTU或拆分大数据包

七、最佳实践总结

  1. 统一命名规范:要么全用-sname,要么全用-name
  2. 网络准备三步走:
    • 测试基础连通性(ping/telnet)
    • 验证端口可访问性(nc/telnet)
    • 检查DNS解析正确性
  3. 容器化部署时:
    • 使用StatefulSet保证主机名稳定
    • 配置就绪探针检查节点连通性
  4. 生产环境必备:
    • 实现自动化健康检查
    • 建立节点监控告警机制

记住,Erlang分布式就像交朋友——需要正确的介绍方式(节点命名)、共同的秘密语言(cookie)、以及畅通的交流渠道(网络配置)。按照这份清单逐步排查,相信你的节点很快就能愉快地"聊天"了!