我正在使用Astyanax 1.56.42和最新版本的Datastax 社区(Apache Cassandra 1.2.6)在一个新的两节点 Cassandra 集群和一个两节点 Glassfish 集群上,我在编写一些新用户时发现了一些问题会话条目。
我的键空间设置是:
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,则会出现新会话 - 但对于我的第二个查询来说为时已晚。
我究竟做错了什么?这是一个错误吗?我如何确定 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。此外,我已切换到一个(应用程序服务器)客户端以确保这与客户端无关-时间戳。读取和写入是同步完成的,但问题仍然随机发生。