web-dev-qa-db-ja.com

Cassandra NoHostAvailableException:クエリを試行したすべてのホストが本番環境で失敗しました

Cassandra-2.1.8を実行している本番環境には10個のCassandraノードがあります。最近2.1.8バージョンにアップグレードしました。以前はCassandra-2.1.2を実行しているノードを3つしか使用していませんでした。最初に、 2.1.2から2.1.8までの最初の3ノード( Cassandraのアップグレード で説明されている手順に従います)。次に、クラスターでCassandra-2.1.8を実行するノードをさらに7つ追加し、クライアントプログラムを開始しました。 。最初の数時間はすべて正常に機能しましたが、数時間後、クライアントプログラムログに次のようなエラーが表示されました。

Thread-0 [29/07/15 17:41:23.356] ERROR  com.cleartrail.entityprofiling.engine.InterpretationWriter - Error:com.datastax.driver.core.exceptions.NoHostAvailableException: All Host(s) tried for query failed (tried: [/172.50.33.161:9041, /172.50.33.162:9041, /172.50.33.95:9041, /172.50.33.96:9041, /172.50.33.165:9041, /172.50.33.166:9041, /172.50.33.163:9041, /172.50.33.164:9041, /172.50.33.42:9041, /172.50.33.167:9041] - use getErrors() for details)
       at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.Java:65)
       at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.Java:259)
       at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.Java:175)
       at com.datastax.driver.core.AbstractSession.execute(AbstractSession.Java:52)
       at com.cleartrail.entityprofiling.engine.InterpretationWriter.WriteInterpretation(InterpretationWriter.Java:430)
       at com.cleartrail.entityprofiling.engine.Profiler.buildProfile(Profiler.Java:1042)
       at com.cleartrail.messageconsumer.consumer.KafkaConsumer.run(KafkaConsumer.Java:336)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All Host(s) tried for query failed (tried: [/172.50.33.161:9041, /172.50.33.162:9041, /172.50.33.95:9041, /172.50.33.96:9041, /172.50.33.165:9041, /172.50.33.166:9041, /172.50.33.163:9041, /172.50.33.164:9041, /172.50.33.42:9041, /172.50.33.167:9041] - use getErrors() for details)
       at com.datastax.driver.core.RequestHandler.sendRequest(RequestHandler.Java:102)
       at com.datastax.driver.core.RequestHandler$1.run(RequestHandler.Java:176)
       at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
       at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
       at Java.lang.Thread.run(Thread.Java:745)

今、私はファイアウォール(いくつかの投稿で示唆されているように)、ポート、クライアントとノードのタイムアウトを再確認しました、そしてそれらはすべて正しいです。

また、その間のどこでも接続を閉じていません。バッチサイズが1000のバッチクエリを使用しています。クエリは更新クエリであり、テーブル内の3つの列を持つカウンターを更新します。

エンティティ、twfwv、cvalue

ここで、entity列とtwfwv列はテキストと主キーであり、cvalueはカウンター列です。

私はすべてのノードを再起動しましたが(同じ例外に直面したときにこのトリックが開発環境で私を助けたため)、それは役に立ちませんでした。ここで考えられる問題を提案してください。

7
abi_pat

コメントの Olivier Michallat のアドバイスに従って、NoHostAvailableExceptionのエラーコレクションを確認することで問題が解決しました。私にとっては、クラスター構成のプロトコルバージョンでした。鉱山はnullで、3に設定すると問題が修正されました。

3
bitsprint

私の問題は、プロパティを削除/使用して、接続で使用していたカスタム負荷分散TokenAwarePolicyを設定または設定解除し、デフォルトに依存することで解決しました。

具体的には、ローカルのSpringBootアプリが単一のドッキングされたCassandraインスタンスと通信するようにしようとしていました。

        Cluster.Builder builder = Cluster.builder()
            .addContactPoints(cassandraProperties.getHosts())
            .withPort(cassandraProperties.getPort())
            .withProtocolVersion(ProtocolVersion.V4)
            .withRetryPolicy(new LoggingRetryPolicy(DefaultRetryPolicy.INSTANCE))
            .withCredentials(cassandraProperties.getUsername(), cassandraProperties.getPassword())
            .withCodecRegistry(codecRegistry);

        if (loadBalanced) {
            builder.withLoadBalancingPolicy(
                new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().withLocalDc(localDc).build()));
        }
0
Matt