You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20下Erlang本地节点连接后无法共享KVS服务问题

解决Erlang跨节点调用KVS服务的问题

常见问题排查与解决方法

1. 模块未在目标节点加载

Erlang跨节点调用模块时,目标节点必须能找到对应模块的beam文件:

  • 在user1节点执行code:which(kvs).,确认模块路径
  • 在user2节点执行相同命令,若返回non_existing,则将模块所在目录添加到代码路径:
    code:add_path("/path/to/kvs/module/dir").
    
  • 更稳妥的方式是启动节点时直接指定代码路径:
    erl -sname user1 -pa /path/to/kvs/module/dir
    erl -sname user2 -pa /path/to/kvs/module/dir
    

2. 服务进程未使用全局注册

如果用本地注册名(如register(kvs, Pid))启动服务,其他节点无法直接访问,需改用全局注册:

  • 在user1节点启动服务时执行:
    Pid = kvs:start(),
    global:register_name(kvs, Pid).
    
  • 在user2节点通过全局名称调用:
    global:whereis_name(kvs) ! {put, Key, Value}.
    
    或用rpc直接调用模块函数:
    rpc:call(user1@yourhostname, kvs, put, [Key, Value]).
    

3. 节点cookie不匹配

即使ping通节点,cookie不一致会导致通信被拒绝:

  • 检查节点cookie:
    erlang:get_cookie().
    
  • 若不一致,在user2节点同步cookie:
    erlang:set_cookie(user1@yourhostname, 'your_cookie_value').
    
  • 或启动节点时直接指定统一cookie:
    erl -sname user1 -setcookie mysharedcookie
    erl -sname user2 -setcookie mysharedcookie
    

4. 函数调用方式错误

直接在user2节点执行kvs:put(Key, Value)只会在本地查找进程,必须指定节点:

  • 使用rpc跨节点调用:
    rpc:call(user1@yourhostname, kvs, put, [mykey, myvalue]).
    
  • 或通过节点+注册名发送消息:
    {kvs, user1@yourhostname} ! {put, mykey, myvalue}.
    

内容的提问来源于stack exchange,提问作者SamuelMastrelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:42:07