2013-06-12 72 views
1

我正在试验一个4节点Cassandra(1.2)群集,我刚刚在4个虚拟机上安装了CentOS 6.4。首先,我创建了3个复制因子密钥空间,并在其中创建了情侣对表,人口每一个与行的少数 - 全部使用Cqlsh。简单的INSERT,SELECT和UPDATE似乎工作正常。对Cassandra中特定行的更新似乎不见了

然后我开始随机断开一些节点以查看集群的实际功能。虽然其中两个节点脱机,但我运行了几个返回正确结果的SELECT。随后,我试图更新现有的行,而根据“nodetool getendpoints”是在离线节点以及上Cqlsh正在运行的本地节点上托管。在将两个节点重新联机后,对更新的行运行SELECT操作而不是返回更新的数据值。我等了一会儿,再次尝试SELECT,但仍然保持返回原始数据。 我也试过以下,其中没有返回更新后的数据:

  1. 重新运行更新几次
  2. UPDATEing同一行中不同的列 - 没有更新领域
  3. 重新启动集群中的所有四个节点

对不同行中同一列的更新工作正常,这与上述#2一起导致我认为这是行数据的问题。

下面的代码片段显示了一个SELECT之前和之后的一个看似成功的UPDATE返回原始数据:

cqlsh:demo> select email, active from users where email = '[email protected]'; 

email    | active 
--------------------+-------- 
[email protected] | True 

cqlsh:demo> update users set active = false where email = '[email protected]'; 

cqlsh:demo> select email, active from users where email = '[email protected]'; 

email    | active 
--------------------+-------- 
[email protected] | True 

我是新来卡桑德拉所以我很可能是失去了一些东西。任何建议或故障排除技巧(要检查的文件或命令来运行),以帮助发现是怎么回事,这里将不胜感激。

+0

如果你使用的一致性级别的所有返回您更新的资料?你可以用'CONSISTENCY ALL'在cqlsh中设置它。 – Richard

+0

不幸的是,它不。 – Aeham

+0

在这种情况下,更新失败。当你用节点进行更新时,你有没有cqlsh输出? – Richard

回答

5

这可能是由服务器之间的时钟不一致来解释。更新的时间戳由接收来自客户端的更新的服务器设置。如果服务器不同步,就可以得到这样一个地方旧的更新具有更高的时间戳行为,以便覆盖后续写入。

要知道,首先检查服务器上的时钟。您应该始终在Cassandra服务器之间运行NTP,以便时钟相同。

你可以确认这是否是通过使用WRITETIME得到时间戳的实际问题:

select WRITETIME(active) from users where email = '[email protected]'; 

这是因为时代微秒。将值写入不同的行并获取其时间戳。如果那是更早的话,这将是原因。

+0

现货!同步服务器时钟解决了问题。非常感谢Richard! – Aeham

+1

这非常有帮助,谢谢!我们设置了时钟来解决其中一台服务器上的临时问题,并且它从未得到更新。如果时钟未同步,CQL客户端/驱动程序应该会发出很大的警告。 – Loki

0

除了Richard提到的时间同步外,我能想到的一个原因是ANY或ONE的一致性,与QUORUM或ALL相反。但是,使用QUORUM或ALL并且节点太多,并且在读取和写入时会超时。

但是,即使一致性为1,数据最终应该一致。没有指定它需要多长时间才能保持一致,但在我看来,这看起来确实很快。