2016-06-17 20 views
2

あるとして我々はできるだけ早く我々は多くを参照してくださいクラスタから1つのノードをドレインとRF 3.カサンドラ3つのノードクラスタとすぐに1つのノードがダウンし

との3つのノードクラスタがある:

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つのノードですべてが完全に機能するはずです。しかし、ノードが停止している限り、例外がスローされます。

我々は2.2.4 + Javaのカサンドラドライバ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つの公共IPSの文字列配列です。

数ヶ月前に、クラスタが一時的に2つのノードのみで罰金働いていたが、不明な理由でそれはもはやそうではないと私はアイデアを実行しているよ:(

おかげであなたの助けのためにたくさんを!

+0

あなたが別のノードを停止してみましたかあなたはいつも同じものを停止しますか? – aalku

+0

私はすべての3つのノードを30分間appartで再起動し、3つのすべての例外について同じ例外を再起動しました。 – Etienne

答えて

0

問題(10.0)当社のカサンドラ・サーバがプライベートローカルIPアドレスを使用しています。

詳しい分析は問題はIPの問題から来ていたことを示した。解決我々のアプリサーバはその設定で自分のパブリック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; 
    } 
} 
関連する問題