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
相关产品推荐
相关产品推荐

