3

私は astyanax を試すために書かれたかなり単純なコードをいくつか持っています。localhost で単一ノードの Cassandra db と通信する場合は問題なく動作しますが、同じスキーマを 2 ノード クラスター (ホストから確実にアクセス可能) に書き込むと、TokenRangeOfflineException.

私は何が欠けていますか?

AstyanaxContext.Builder builder = new AstyanaxContext.Builder()
            .forKeyspace("myKeyspace")
            .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
                    .setDiscoveryType(NodeDiscoveryType.NONE)
            )
            .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
                    .setPort(9160)
                    .setMaxConnsPerHost(5)
                    .setSeeds("host1.domain.com,host2.domain.com")
            )
            .withConnectionPoolMonitor(new CountingConnectionPoolMonitor());

このエラーが発生します:

Exception in thread "main" com.netflix.astyanax.connectionpool.exceptions.TokenRangeOfflineException: TokenRangeOfflineException: [host=host1.domain.com, latency=59(94), attempts=1]UnavailableException()
    at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:165)
com.netflix.astyanax.connectionpool.exceptions.TokenRangeOfflineException: TokenRangeOfflineException: [host=host1.domain.com, latency=59(94), attempts=1]UnavailableException()
    at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:165)
    at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:60)
    at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1$2.execute(ThriftColumnFamilyQueryImpl.java:200)
    at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:60)
4

2 に答える 2

0

部分的に、私自身の質問に答えます。いくつかの変更を加えることで機能するようになりました。単純なケースがうまくいかない理由はわかりませんが、次の例ではうまくいきました。

最初に、デフォルトで作成されたキースペースを次のように置き換えました (キースペース foo を作成)。

create keyspace foo with placement_strategy = 'NetworkTopologyStrategy'
    AND strategy_options={DC1:1};

これにより、「nodetool describeing foo」の出力が変更され、endpoint_details に何かが含まれるようになります。以前にデバッガーをステップ実行したことがあり、astyanax 構成を次のように切り替えた後、endpoint_details が空であることがいくつかの失敗の原因であることに気付きました。

 AstyanaxContext.Builder builder = new AstyanaxContext.Builder()
            .forCluster("myCluster")
            .forKeyspace("foo")
            .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
                    .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
                    .setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE)
            )
            .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
                    .setPort(9160)
                    .setMaxConnsPerHost(5)
                    .setInitConnsPerHost(1)
                    .setSeeds("host1,host2")
            )
            .withConnectionPoolMonitor(new Slf4jConnectionPoolMonitorImpl());

一般的なクラスター/キースペースの設定に推奨される構成オプションについて説明しているドキュメントを参照してください。知識のある人にとっては当然のことだと思いますが、初心者にとっては少し不透明です。

于 2013-01-05T15:59:35.367 に答える
0

NodeDiscoveryType.RING_DESCRIBE で試してください

于 2013-01-05T09:27:32.213 に答える