【发布时间】:2013-07-07 13:11:41
【问题描述】:
我在一个新的两节点 Cassandra 集群上使用 Astyanax 1.56.42 和最新版本的 Datastax Community (Apache Cassandra 1.2.6)一个双节点 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 updates not working consistently 相关,但我正在做一些不同的事情。)
编辑:我的密钥空间是通过以下方式设置的:
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。此外,我已切换到一个(应用程序服务器)客户端,以确保这与客户端时间戳无关。读写是同步进行的,但是问题还是随机出现的。
【问题讨论】: