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