2016-04-01 21 views
2

これは文書化されているように、これはTokenAware(DCAwareRoundRobinPolicy)です。私クラスタの設定は、次のようになります私のクラスタは、このようになりますDatastaxに関する問題Cassandraドライバのデフォルトの負荷分散ポリシー

lazy val session = { 
val poolOptions = new PoolingOptions() 
poolOptions.setMaxConnectionsPerHost(HostDistance.LOCAL, config.getInt("pooling.max-local")) 
poolOptions.setCoreConnectionsPerHost(HostDistance.LOCAL, config.getInt("pooling.min-local")) 
poolOptions.setMaxConnectionsPerHost(HostDistance.REMOTE, config.getInt("pooling.max-remote")) 
poolOptions.setCoreConnectionsPerHost(HostDistance.REMOTE, config.getInt("pooling.min-remote")) 
Cluster.builder.addContactPoints(hosts) 
    .withPoolingOptions(poolOptions) 
    .build 
    .connect 
} 

DC1

10.dc1.rac1.ip1

10.dc1.rac2.ip1

DC2

10.dc2.rac1.ip1

10.dc2.rac2.ip1

アプリケーションは5番目の無関係のマシンで実行されています。問題はlocalDcの自動検出に関連しているようです。ソースコードによれば、ドライバはホストリストの最初のノードとしてローカルDCを検出する必要があります。ここが起こると思われるものです:

  • ホスト場合= [10.dc1.rac1.ip1、10.dc2.rac1.ip1]、アプリがNoHostAvailableException 50/50基づいて成功します。ローカルDcは "dc1"または "dc2"になります

  • hosts = [10.dc1.rac1.ip1、10.dc1.rac2.ip1]の場合、AppはNoHostAvailableExceptionと一貫して失敗します。ローカルDCは間違って "dc2"になります。他の2台のマシンを使用する場合も同じです。アプリケーションの場所は変更されていません。

  • ビルドでlocalDcを手動で設定した場合、すべてが正常に動作します。広告された機能が別のデータセンターにフォールバックできる必要があるため、これは問題にはなりません。

また、ドライバには、実行中のcassandraインスタンスはありませんが、ローカルホストに接続しようとしているようです。これは一見したところではバグですが、私の設定のシンプルさとdatastaxドライバの熟練した性質を考えると、私は驚くでしょう。

EDIT:謝罪は、私はアンディTolbertは、上記の探している人のための正しい答えを持っていた3.0.0

+0

使用しているドライバのバージョンは? – doanduyhai

+2

ノードのいずれかにあるcassandra.yamlのrpc_address/broadcast_rpc_addressがlocalhostに設定されているため、ドライバがlocalhostを試している可能性があります。これが事実であるかどうかを確認できますか? さらに、各ホストごとにcqlshを実行し、 'select * from system.peers'を実行してsystem.peersテーブルを調べ、各ノードのrpc_addressとdata_centerの値が各ピアの値であることを確認する必要があります。 –

答えて

0

を使用してい言及している必要があります。残念ながら、デフォルト設定(および各マシンで正しいアドレスを明示的に設定する以外の設定)では、ローカルホストとリモートホストからの接続を同時に受け入れることはできません。