Cassandra - 在另一个线程写入后读取不返回任何数据

时间:2017-01-14 00:35:16

标签: cassandra

我有一个3节点的cassandra集群。作业正在写入特定节点,我尝试在单独的线程中读取数据,这可能最终会产生不同的cassandra节点。我没有得到cassandra的数据,即使是一个单独的线程的数据在不同的线程查询10-15秒之前插入它。

我的复制因素如下。

  

SELECT * FROM system.schema_keyspaces;

keyspace_name      | durable_writes | strategy_class                                       | strategy_options
--------------------+----------------+------------------------------------------------------+----------------------------
            application |           True | org.apache.cassandra.locator.NetworkTopologyStrategy |                {"DC1":"3"}
 system_distributed |           True |          org.apache.cassandra.locator.SimpleStrategy | {"replication_factor":"3"}
             system |           True |           org.apache.cassandra.locator.LocalStrategy |                         {}

一致性: -

通过单独的应用程序进行读写操作。

写入数据的应用程序已将一致性级别设置为ANY。  读取数据的应用程序已将一致性级别设置为QUORUM。

我在这里缺少任何配置吗?

由于

1 个答案:

答案 0 :(得分:2)

15秒是很长的时间 - 所以你应该看到数据。

由于您使用ANY(http://docs.datastax.com/en/archived/cassandra/3.x/cassandra/dml/dmlConfigConsistency.html)编写,因此您的群集可能不“健康”且没有副本节点存在/或者您遇到连接问题并且写入仍然会成功,因为它们已写入提示越区切换。

要查看此信息,您可以:

  1. 将写入一致性更改为LOCAL_ONE / ONE - 这将确保至少有一个副本已收到数据。
  2. 启用概率跟踪(http://docs.datastax.com/en/archived/cassandra/3.x/cassandra/tools/toolsSetTraceProbability.html)并检查是否已发送写入。
  3. 写线程是否使用批处理或独立写入每一行 - 如果您不使用批处理,请确保使用令牌感知策略(http://docs.datastax.com/en/drivers/java/3.0/com/datastax/driver/core/policies/TokenAwarePolicy.html)和预准备语句 - 这将确保客户端将写入具有副本的节点。