GraphClient连接多addresses问题

public GraphClientImpl(List addresses, int timeout, int connTimeout,
int connectionRetry, int executionRetry)
该方法中传入多个hostandport,如果其中一个hostandport挂掉了,在connect的时候还会去尝试连接吗?我看代码中是随机一个地址去连接的。是否考虑负载均衡或者容错的做法?

我看代码中是随机一个地址去连接的

是的,现在就是这样的。多个address对于连接池才有意义,这里实现只是建立其中某个服务的链接,应该封装一个连接池,这块已经有人贡献连接池 pr 了。在 review 中。

是否考虑负载均衡或者容错的做法?

负载均衡现在还没考虑支持,后续是有这个计划,让所有客户端都支持这个特性。

那么目前要实现负载均衡或者容错有什么建议或者最佳实践吗?

客户端负载均衡这块,现在是用户自己做,大部分用户只是简单的用连接池创建好和多个服务端的连接,然后从连接池里面拿一个连接做请求。
后续的,是需要服务有一些负反馈,让客户端可以知道服务端的情况,相应的做策略选择。

负载均衡及高可用,我这边是使用haproxy+keepalived自行做了层服务

我是直接架了一层lvs,这样客户端永远连一个地址,lvs自己去ha、lb啥的

请问现在支持了吗。目前2.5版本的连接池 ,填写三个address,但是在console里面看到所有session链接的GraphAddr都是一台机器的address,这正常吗。会导致流量不均吗。

2.5.0 java client 有负载均衡啊,每次getSession时会和不同的地址建立session的。

ClientIp是分散的 但是GraphAddr 只有一台机器 而且 ,在监控看到流量大的时候 这几台机器负载非常不均,看版本变更说2.6.1在这里有优化是吗,请问解决的是这个问题吗 以及请教下2.5升级到2.6的话 只替换为2.6.1的server包就可以完成server的升级吗

请问正常的多机器的图 GraphAddr会只有一个地址吗

  1. client ip是分散的,GraphAddr只有一台机器是什么意思
  2. 2.6.1的版本变更 见这里 Release Nebula Java Client v2.6.1 · vesoft-inc/nebula-java · GitHub
  3. 你监控的是客户端向服务端发起的请求吧, 客户端的负载均衡是session 不是请求。 当你getSession时会和不同的graphd建立session, 但请求发给哪个graphd 要看你代码中请求用的是哪个session。
2 个赞

GraphAddr是我show sessions出来的 会话的Graph服务地址和端口。这个全部是一台正常吗

就是这个graphAddr都是指向一台机器的

你把show sessions 的执行结果贴出来看下

![image|690x476](



目前各项负载都不均,之后全部上线流量会是现在的十几倍,担心可能会加剧不均

你的代码应该是getSession 然后所有的请求都是使用的该session。
show sessions中显示信息说明 你在不同的client ip中连接graphd并发起请求,都是传的相同顺序的graphd 的地址列表, 所以你不同client ip 连接的都是地址列表中的第一个graphd服务。

解决:

  1. 你可以在多个client ip中连接graphd之前对你的地址列表进行下shuffle, 打乱下地址顺序。
  2. 业务代码中不要使用同一个session 去发起请求,可以在一个语句执行结束后release Session, 然后再次getSession 去执行下一个请求。
2 个赞

我这里确实所有请求都是使用的该session

不过nebula只有leader能够进行读写,那么是否总会有一台机器负载会比其他的高。我这边进行打乱地址顺序进行连接graphd,但最最终读写只能是leader的storage

帖子前面所有的讨论都是针对graphd 的负载。

对于storage服务而言,你有多个part, 每个part的leader 是可以通过balance 命令进行负载均衡的。 最终读写是leader,但不同part 的leader是均衡在多个storage实例中的。

o 我明白了 非常感谢作者的耐心解答 :kissing_heart: