nebula-go 使用问题

  • nebula 版本:3.8.0
  • 部署方式:分布式
  • 安装方式:RPM
  • 是否上生产环境:Y
  • 硬件信息
    • 磁盘 SSD
    • CPU、内存信息 16c128g
  • 问题的具体描述
  • 相关的 meta / storage / graph info 日志信息(尽量使用文本形式方便检索)
    程序输出错误日志:failed to initialize the session pool, failed to open transport, error: dial tcp 172.22.9.3:9669: i/o timeout

检查了服务是正常的,防火墙是通的


代码

# 参考githhub的seesion_pool_example实现
# hostList已经封装好,格式如:[{\"Host\":\"172.22.9.3\",\"Port\":9669},...]
    poolConf, err := nebula_go.NewSessionPoolConf(datasource.Username, datasource.Password, hostList, datasource.SpaceName,
		nebula_go.WithTimeOut(time.Duration(datasource.TimeOut)),
		nebula_go.WithIdleTime(time.Duration(datasource.IdleTime)),
		nebula_go.WithMaxSize(datasource.MaxSize),
		nebula_go.WithMinSize(datasource.MinIdle),
		nebula_go.WithHTTP2(false),
	)
	if err != nil {
		common.RootLogger.Errorf("init apollo nebula catalog:%s config error, %s", nebulaCatalog, err)
		return
	}
	pool, err := nebula_go.NewSessionPool(*poolConf, nebula.DefaultLogger{})
	if err != nil {
		common.RootLogger.Errorf("init nebula catalog:%s session pool error, %s", nebulaCatalog, err)
		return
	}

换了nebula-go v3.4.0版本,就可以了,排查是由于v3.8.0版本的HandshakeKey为空导致的.

另外,换了nebula-go v3.4.0还一个问题
自定义连接池配置,不能配置TimeOut,配置的话需要配为0,尝试了300s,3600s都会出现io tomeout

poolConf, err := nebula_go.NewSessionPoolConf(datasource.Username, datasource.Password, hostList, datasource.SpaceName,
	nebula_go.WithMinSize(datasource.MinIdle), nebula_go.WithMaxSize(datasource.MaxSize),
	nebula_go.WithIdleTime(time.Duration(datasource.IdleTime)),
//, nebula_go.WithTimeOut(time.Duration(datasource.TimeOut))
)
1 个赞

你用的是 release 的 3.8 的客户端吗?

是的,刚开始用的是v3.8.0,后面换到v3.4.0

另外还发现一个问题,如果配置time_out为0,即是永不过期;
如果客户端一直没有调用,session超过了8小时,nebula服务端会关闭session,然而客户端还一直持有该session;
如果使用该session查询时,会出现172.22.9.3:9669: write: broken pipe错误

客户端设置 timeout 跟服务端的 session 过期完全没有关系的。

能不能发一下 timeout 是怎么设的,单位是啥

问题原因如下:
1、需要使用nebula-go 3.4.0稳定版本
2、设置idleTime和timeOut时time.Duration单位是纳秒,需要转成秒
3、空闲session由idleTime配置释放,不会出现使用已关闭session问题

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