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 つの (アプリケーション サーバー) クライアントに切り替えて、これがクライアントとは関係がないことを確認しました。 -タイムスタンプ。読み取りと書き込みは同期して行われますが、問題はランダムに発生します。