更新Java SDK版本

时间:2015-09-21 08:16:16

标签: couchbase couchbase-java-api

在更新Java SDK版本后尝试连接到群集时遇到问题。

系统设置如下:

我们有一个使用Java SDK和Couchbase集群的Web应用程序。在我们之间我们有一个VIP(虚拟IP地址)。我们意识到这并不理想,但我们无法立即改变,因为VIP是由Tech Ops强制执行的。 VIP基本上只是在应用程序启动时重新路由初始请求。这样我们就可以对集群进行修改,并确保在应用程序启动时,无论集群中的实际节点及其IP如何,都可以找到集群。

在此问题发生之前,我们使用了JAVA SDK 1.4.4版。我们的应用程序将启动,Java SDK将在端口8091上向VIP发起请求。请注意,8091端口是VIP上唯一开放的端口。 VIP会将请求重新路由到当前正在使用的节点集群之一,集群将响应Java SDK。此时,Java SDK将发现集群中的所有节点,并且应用程序可以正常运行。在上线时间,如果我们要添加,从群集中删除一个节点Java SDK将自动更新,一切都将运行没有问题。

在上一个sprint中,我们将Java SDK更新到2.1.3版。我们的应用程序将启动,Java SDK将在端口11210上向VIP发起请求。由于此端口未打开,请求将失败,Java SDK将引发异常:

Caused by: java.lang.RuntimeException: java.util.concurrent.TimeoutException
at com.couchbase.client.java.util.Blocking.blockForSingle(Blocking.java:93)
at com.couchbase.client.java.CouchbaseCluster.openBucket(CouchbaseCluster.java:108)
at com.couchbase.client.java.CouchbaseCluster.openBucket(CouchbaseCluster.java:99)
at com.couchbase.client.java.CouchbaseCluster.openBucket(CouchbaseCluster.java:89)

不会对任何端口提出进一步的请求。

似乎在不同版本之间更改了使用端口的顺序。有人可以确认或争议在版本之间更改了用于群集发现的端口的顺序。也有人可以就如何解决这个问题提供一些建议。我们正在尝试了解客户端的行为,如果我们可以在VIP上打开所有这些端口,那么客户端是否仍然可以正常运行并达到最佳性能?

问题出现在我们的生产环境中,我们不能用它来测试潜在的解决方案,因为它会干扰我们的产品。

2 个答案:

答案 0 :(得分:2)

在Java SDK的v2.x中,默认为11210以使集群映射引导应用程序。这实际上是一个巨大的改进,因为现在地图来自托管缓存而不是集群管理器(8091)。 SDK 应该使用8091作为后退,如果它无法在11210上获取地图。无论如何,你真的想从11210获得那张地图,相信我。它清理了很多问题。

要解决这个长期问题并遵循Couchbase最佳做法,请升级到Java 2.2.x SDK,完全删除VIP并改为使用DNS SRV记录。这为您提供了一个SDK连接对象的DNS条目,您只需在DNS中管理节点列表。它很棒。我说SDK 2.2作为DNS SRV记录解决方案在那里完全支持,在2.1它是实验性的。如今,Couchbase特别推荐VIP。在旧版本的SDK中,这样做很好,它有助于限制从应用程序到数据库节点的连接数量,但这不再是必要的,实际上可能是一件坏事。

答案 1 :(得分:1)

Kirk's long term answer(我建议您遵循)之外,短期解决方案可能是停用11210引导(运营商引导程序)在构建器上调用CouchbaseEnvironment,通过bootstrapCarrierEnabled(false)

我不保证即使在此之后它也能与vIP一起使用,但如果你赶时间,这可能值得一试。