java - 当第一个节点没有响应时,Couchbase Client Java SDK 不会使用另一个集群节点

标签 java couchbase observable bootstrapping couchbase-java-api

因此根据此页面:http://developer.couchbase.com/documentation/server/current/sdk/java/start-using-sdk.html

// Connects to a cluster on 10.0.0.1 and tries 10.0.0.2
// if the other one does not respond during bootstrap.
Cluster cluster = CouchbaseCluster.create("10.0.0.1", "10.0.0.2");

看起来很简单,我在 Eclipse 中打开了一个 Maven 项目。对 couchbase 客户端使用最新的 Java SDK:

<dependency>
    <groupId>com.couchbase.client</groupId>
    <artifactId>java-client</artifactId>
    <version>2.3.4</version>
</dependency>

我的代码,简短而甜蜜:

import com.couchbase.client.java.Cluster;
import com.couchbase.client.java.CouchbaseCluster;

public class Main {
    public static void main(String[] args){
        Cluster cluster = CouchbaseCluster.create("10.200.0.10", "10.200.0.11", "10.200.0.12");
        System.out.println(cluster.clusterManager("Administrator", "password").info().raw());
    }
}

我的 Couchbase 集群由三个虚拟机上的三个节点组成。使用docker部署。它们工作得很好,我有另一个应用程序使用 SDK 中的所有出色功能,但我在测试时发现了一些问题:

如果我在节点 10.200.0.11 或/和节点 10.200.0.12 关闭时运行上述代码,一切都很好。我在控制台中得到了一个不错的 json,其中包括所有三个节点的详细信息!

问题: 如果我运行此代码并且节点 10.200.0.10 已关闭,那么它不会尝试使用其他两个节点进行引导,如其文档中的示例所示。相反,抛出异常并且应用程序结束。

错误:

WARNING: [null][ConfigEndpoint]: Could not connect to remote socket.
Exception in thread "main" java.lang.RuntimeException: java.net.ConnectException: Connection refused: /10.200.0.10:8091
    at     com.couchbase.client.core.utils.Blocking.blockForSingle(Blocking.java:85)
    at com.couchbase.client.java.cluster.DefaultClusterManager.info(DefaultClusterManager.java:59)
    at com.couchbase.client.java.cluster.DefaultClusterManager.info(DefaultClusterManager.java:54)
    at quickTestDeleteThis.Main.main(Main.java:10)
Caused by: java.net.ConnectException: Connection refused: /10.200.0.10:8091
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
    at com.couchbase.client.deps.io.netty.channel.socket.nio.NioSocketChannel.do    FinishConnect(NioSocketChannel.java:223)
    at com.couchbase.client.deps.io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:285)
    at   com.couchbase.client.deps.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:589)
    at com.couchbase.client.deps.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:513)
    at com.couchbase.client.deps.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:427)
    at com.couchbase.client.deps.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:399)
    at com.couchbase.client.deps.io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:140)
    at com.couchbase.client.deps.io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
    at java.lang.Thread.run(Thread.java:745)
Nov 02, 2016 4:45:22 PM com.couchbase.client.core.endpoint.AbstractEndpoint$2 operationComplete
WARNING: [null][ConfigEndpoint]: Could not connect to remote socket.

我认为这可能与 10.200.0.10 作为协调器有关,并且没有新的协调器会响应集群信息。 但根据 Couchbase 架构文档: http://www.couchbase.com/sites/default/files/uploads/all/whitepapers/Couchbase_Server_Architecture_Review.pdf

如果协调器节点崩溃,现有节点将检测到它不再可用,并选择一个新的节点 立即协调器,以便集群继续运行而不会中断。

看起来,如果与 Cluster 对象中节点列表中的第一个节点的连接不可连接,那么它不会尝试其他可能的错误?

最佳答案

已知问题,目前正在修复。可以在这里找到: https://issues.couchbase.com/browse/JCBC-999

关于java - 当第一个节点没有响应时,Couchbase Client Java SDK 不会使用另一个集群节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40374813/

相关文章:

node.js - Sails JS - 如何将用户 api 模型连接到 Couchbase 中的用户存储桶?

angular - RxJS Observables 数组以及要保存的附加数据

javascript - 即使评估为 True,带有复选框的 TakeUntil 也会阻止流

angular - Angular 项目中使用 rxjs 的 Http 轮询和条件逻辑

java - 在 jersey 项目中包含 jersey-bom import scoped 依赖项的目的是什么?

java - 为 Couchbase lite 2.x 和同步网关设置复制器时出现问题

.net - 如何强制 Ruby 将小数存储为 32 位整数

java - Java 中的迷宫模式构建

java - 提示HINT_PASS_DISTINCT_THROUGH可将PageRequest的每页返回的实体数量降低到低于配置的页面大小(PostgreSQL)

java - 重构大数据对象