8

1 つの DC に 2 つの C* 2.0.2 ノード (cassandra.yaml のデフォルト構成) と RF=2 のキースペースがあります。2 つのクライアントが Datastax Java Driver 1.0.3 を使用してこの DC に接続されています。クライアントは、エラーなしで CL=ONE を指定して C* との間でデータを読み書きします。しかし、1 つのノードをシャットダウンすると、両方のクライアントで大量の例外が発生します。

com.datastax.driver.core.exceptions.NoHostAvailableException:
All host(s) tried for query failed (no host was tried)

その一連の例外の後、クライアントはまだ生きている別のノードで正常に動作し続けます。一度に少なくとも 1 つのアクティブなノードがあり、CL=ONE が使用されているため、NoHostAvailableException を受信しないようにするにはどうすればよいですか?

更新: 2 つのノードのいずれかをシャットダウンすると、アプリ ログに次の例外が表示されることがあります。

[Reconnection-1] [ERROR] [Control connection] Cannot connect to
any host, scheduling retry

1 つのノードだけをシャットダウンすると、両方のノードが使用できないのはなぜですか? 2 つ目は現時点でまだ生きていて、cqlsh で接続できます。

4

1 に答える 1

0

CL=ONE を指定して要求を実行すると、ドライバーは 1 つのノードのみを照会しようとします。そのため、そのノードへのリクエストが失敗した場合 (またはノードが使用できない場合) は、すぐに例外がスローされます。この動作はcom.datastax.driver.core.policies.RetryPolicy、 の作成時に指定することによって制御されますCluster

RetryPolicy再試行回数を固定する a がニーズに合うと思います。残念ながら、Cassandra Driver 1.0.3 にはバンドルされていません (それ以降のバージョンにバンドルされているかどうかはわかりません)。それでも、次のように実装できます。

public class MyRetryPolicy implements RetryPolicy {

    final int attempts;

    public MyRetryPolicy(int attempts) {
        this.attempts = attempts;
    }

    @Override
    public RetryDecision onReadTimeout(Query query, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataRetrieved, int nbRetry) {
        return (nbRetry >= attempts) ? RetryDecision.rethrow() : RetryDecision.retry(cl)
    }        

    ... <onWriteTimeout & onUnavailable methods with similar implementation>
}

MyRetryPolicy(2)ドライバーの内部を深く掘り下げていないので、これで十分かどうかはわかりません。おそらく、同じ要求を同じホストに送信する別の試みが行われるでしょう。を試すことができますMyRetryPolicy(10)。少なくとも、失敗の数が大幅に減少するはずです。

いくつかの失敗がまだ残っている場合 (1000 分の 1 など)、 をcom.datastax.driver.core.ConvictionPolicy調べてその使用法を見つけ、さらに調査する価値があります。

于 2013-12-12T18:49:35.623 に答える