我正在试验一个4节点的Cassandra(1.2)集群,我刚刚在CentOS 6.4上设置了4个虚拟机。首先,我创建了一个复制因子为3的密钥空间,并在其中创建了几个表,并用少量行填充每个表 - 所有表都使用Cqlsh。简单的INSERT,SELECT和UPDATE似乎工作正常。
然后我开始随机断开一些节点,以查看正在运行的集群的功能。当其中两个节点处于脱机状态时,我运行了几个SELECT,返回了正确的结果。随后,我尝试更新现有行,根据“nodetool getendpoints”托管在脱机节点以及运行Cqlsh的本地节点上。将两个节点重新联机后,针对更新的行运行SELECT, 不 返回更新的数据值。我等了一会儿又尝试了SELECTing,但仍然保留了原始数据。 我也尝试了以下方法,其中没有一个返回更新的数据:
另一行中同一列的UPDATE工作正常,与上面的#2一起使我认为这是行数据的问题。
以下代码段显示SELECT在看似成功的更新之前和之后返回原始数据:
cqlsh:demo> select email, active from users where email = 'john.doe@bti360.com';
email | active
--------------------+--------
john.doe@bti360.com | True
cqlsh:demo> update users set active = false where email = 'john.doe@bti360.com';
cqlsh:demo> select email, active from users where email = 'john.doe@bti360.com';
email | active
--------------------+--------
john.doe@bti360.com | True
我是Cassandra的新手,所以我很可能会错过一些东西。任何建议或疑难解答提示(要检查的文件或要运行的命令),以帮助揭示这里发生的事情将非常感激。
答案 0 :(得分:6)
这可以通过服务器之间的时钟不匹配来解释。更新的时间戳由服务器从客户端接收更新来设置。如果服务器不同步,您可以获得这样的行为,其中旧更新具有更高的时间戳,因此会覆盖后续写入。
要找出答案,首先要检查服务器上的时钟。您应该始终在Cassandra服务器之间运行NTP,因此时钟是相同的。
您可以使用WRITETIME获取时间戳来确认这是否是实际问题:
select WRITETIME(active) from users where email = 'john.doe@bti360.com';
这是自纪元以来的微秒。将值写入另一行并获取其时间戳。如果那是更早,那么这将是原因。
答案 1 :(得分:0)
我能想到的一个原因是,理查德提到的时间同步之外,是ANY或ONE的一致性,与QUORUM或ALL相反。但是,使用QUORUM或ALL并且节点数量太少会导致读取和写入超时。
然而,即使一致性,数据最终也应该保持一致。没有指定它变得一致所需的时间,但在我看来它看起来真的很快。