2

RF 3 の 3 ノード クラスタがあります。

クラスターから 1 つのノードを排出するとすぐに、多数のノードが表示されます。

All host(s) tried for query failed (no host was tried)
com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried)
        at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:84)
        at com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:37)
        at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:214)
        at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:52)

すべての書き込みと読み取りは整合性レベル QUORUM または ONE で行われるため、ノードが 1 つダウンしてもすべてが完全に機能するはずです。ただし、ノードがダウンしている限り、例外がスローされます。

Cassandra 2.2.4 + Java Cassandra Driver 2.1.10.2 を使用

クラスターを作成する方法は次のとおりです。

new Cluster.Builder()
    .addContactPoints(CONTACT_POINTS)
    .withCredentials(USERNAME, PASSWORD)
    .withRetryPolicy(new LoggingRetryPolicy(DefaultRetryPolicy.INSTANCE))
    .withReconnectionPolicy(new ExponentialReconnectionPolicy(10, 10000))
    .withLoadBalancingPolicy(new TokenAwarePolicy(new RoundRobinPolicy()))
    .withSocketOptions(new SocketOptions().setReadTimeoutMillis(12_000))
    .build();

CONTACT_POINTS は、ノードの 3 つのパブリック IP の文字列配列です。

数か月前、クラスターは一時的に 2 つのノードのみで正常に動作していましたが、理由は不明ですが、もうそうではなく、アイデアが不足しています :(

助けてくれてどうもありがとう!

4

1 に答える 1

0

問題が解決しました。

さらに分析を行ったところ、この問題は IP の問題に起因していることがわかりました。私たちの cassandra サーバーはプライベート ローカル IP (10.0.) を使用して相互に通信しますが、アプリ サーバーは構成にパブリック IP を持っています。

同じネットワークにいるときは正常に機能していましたが、別のネットワークに移動すると、クラスターの 1 台のマシンにしか接続できず、他の 2 台はプライベート ローカルに接続しようとしたため、ダウンしていると見なされました。他の 2 つのパブリック IP の代わりに IP。

解決策は、クラスタ ビルダーに IPTranslater を追加することでした。

.withAddressTranslater(new ToPublicIpAddressTranslater())

次のコードを使用します。

private static class ToPublicIpAddressTranslater implements AddressTranslater {

    private Map<String, String> internalToPublicIpMap = new HashMap<>();

    public ToPublicIpAddressTranslater() {
        for (int i = 0; i < CONTACT_POINT_PRIVATE_IPS.length; i++) {
            internalToPublicIpMap.put(CONTACT_POINT_PRIVATE_IPS[i], CONTACT_POINTS[i]);
        }
    }

    @Override
    public InetSocketAddress translate(InetSocketAddress address) {
        String publicIp = internalToPublicIpMap.get(address.getHostString());
        if (publicIp != null) {
            return new InetSocketAddress(publicIp, address.getPort());
        }
        return address;
    }
}
于 2016-06-20T10:01:20.870 に答える