0

Astyanax 1.56.42を最新バージョンのDatastax Community (Apache Cassandra 1.2.6)で、2 ノードの Glassfish クラスターを備えた新しい 2 ノードの Cassandra クラスターで使用しています。新しいユーザーの書き込み中にいくつかの問題を発見しました。セッションエントリー。

私のキースペースの設定は次のとおりです。

CREATE KEYSPACE test WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 };

次を使用して、ユーザーセッションテーブルに更新を行っています。

KEYSPACE.prepareQuery(CF_USER_SESSIONS)
                .setConsistencyLevel(ConsistencyLevel.CL_ALL)
                .withCql("INSERT into usersessions (uid, (...)) VALUES (?, (...));")
                .asPreparedStatement()
                .withUUIDValue(uid)
                (...)
                .execute();

その後、このセッションを正確に読み取ろうとします。

result = KEYSPACE.prepareQuery(CF_USER_SESSIONS)
                .withCql("SELECT * from usersessions where uid=?;")
                .asPreparedStatement()
                .withUUIDValue(uid)
                .execute();

この読み取りは時々失敗します (= 行が返されません)。「ときどき」とは、クラスターがほぼアイドル状態の場合でもまったく失敗しないことを意味します。ただし、UPDATE ステートメントで setConsistencyLevel-Attribute が「ALL」に設定されているにもかかわらず、負荷が高い場合は、より頻繁に実行されます。

興味深いのは、遅延がこの問題を「解決」することです。後で cqlsh で手動 SELECT を実行しようとすると、新しいセッションが表示されますが、2 番目のクエリには遅すぎます。

私は何を間違っていますか?これはバグですか?ConsistencyLevel.CL_ALL が意図したとおりに動作することを確認するにはどうすればよいですか?

(私の質問は、Cassandraの更新が一貫して機能しないことに何らかの形で関連していますが、私は何か違うことをしています。)

編集:私のキースペースは次を使用して設定されます:

CONTEXT = new AstyanaxContext.Builder()
    .forCluster("test cluster")
    .forKeyspace("test")
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()      
        .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
        .setCqlVersion("3.0.0")
        .setTargetCassandraVersion("1.2")
    )
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl(CONNECTION_POOL_NAME)
        .setPort(9160)
        .setMaxConnsPerHost(100)
        .setSeeds(SOME_CLUSTER_SEEDS_IP_AND_PORT)
    )
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
    .buildKeyspace(ThriftFamilyFactory.getInstance());

CONTEXT.start();
KEYSPACE = CONTEXT.getClient();

編集 #2: すべてのクエリで整合性レベルを「ALL」に設定し、replication_factor を 1 に切り替えました。さらに、1 つの (アプリケーション サーバー) クライアントに切り替えて、これがクライアントとは関係がないことを確認しました。 -タイムスタンプ。読み取りと書き込みは同期して行われますが、問題はランダムに発生します。

4

1 に答える 1

0

読み取り時に一貫性レベルを設定して、正しく行っていることを確認することもできます。

result = KEYSPACE.prepareQuery(CF_USER_SESSIONS)
                .setConsistencyLevel(ConsistencyLevel.CL_ALL)
                .withCql("SELECT * from usersessions where uid=?;")
                .asPreparedStatement()
                .withUUIDValue(uid)
                .execute();

それが役立つかどうか教えてください。それから、そこから行くことができます。

編集: また、それが機能しない場合は、レプリケーション ファクターを 1 に設定してみてください。それが機能しない場合は、単一ノードへの読み取り/書き込みを試してください。

于 2013-07-09T22:09:44.410 に答える