session查询失效但是能ping通

  • nebula 版本:2.5.0
  • 部署方式(分布式 / 单机 / Docker / DBaaS):单机
  • 是否为线上版本:Y

session设置过期时间为10s (session_idle_timeout_secs=10),某次查询session失效后,再次去ping,第一次能ping通返回true,然后再ping则返回false。

  1. 为什么session失效了还能返回ping通的结果?
  2. 怎么才能保证客户端连接(meta/graph/storage)的高可用?

  1. session 失效后再ping,结果是否有延迟存在 @Aiee
  2. 客户端是做了高可用的,你在连接的时候传入Nebula集群多个graphd地址,当某一个地址不可用时,内部会自动做reconnect连接其他graph实例
  1. 请问有没有类似数据库那种 “断线重连” 的机制呢?

客户端的断线重连是针对部分异常情况的,而且重连的是集群中其他节点,不是当前节点。 可以参考代码 https://github.com/vesoft-inc/nebula-java/blob/fc643c79aa9511e42902ea84a42b7a928225e874/client/src/main/java/com/vesoft/nebula/client/graph/net/Session.java#L87

没有一个完整的针对meta/graph/storage连接的判断机制吗?
meta、storage、session,这三个组件之间互相没有心跳机制;他们的java客户端连接也没有心跳机制,都是一次性使用,如果在一次查询中,出现查询超时,但是设置的过期时间太小,那不是所有的查询都会出错吗?

在客户端去监控neubla服务的高可用很麻烦啊~

出现查询超时一般是进行了长query, 目前没有针对超时做超时时间的自动重试, 你可以来github提issue描述下需求哈

是否有延迟?
客户端怎么判断是延迟还是真的连接失效?

按理说没有延迟的, 你在 ping 完得到 false 后 session 还持有连接吗?
ping() 的作用是判断连接的服务是否可用, 具体实现是故意用一个 invalid sessionID 0 发送 YIELD 1 到当前连接的地址, 只关心网络是否ok

1 个赞

如果没有延迟,那怎么得到true的结果呢?
“持有连接”是什么意思, ping 完得到 false 后 session是invalid的了,不过连接肯定还在,再怎么ping肯定都是false了。
我主要是想知道,客户端怎么判断连接是真的失效了?

ping 只看服务器是否 available,无关session的话,加上 楼主提到了 ping false,看起来 graphclient 到 graphD 确实有不可用的时候呢,可以这么理解么?

另外这里不应该用 ping 来确保session 是 好的,请问 @Aiee 这里最佳的方式是什么呢哈?

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。