0

我正在使用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。此外,我已切换到一个(应用程序服务器)客户端以确保这与客户端无关-时间戳。读取和写入是同步完成的,但问题仍然随机发生。

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 回答