对Cassandra中特定行的更新似乎丢失了

Aeh*_*ham 1 cassandra

我正在试验一个4节点的Cassandra(1.2)集群,我刚刚在CentOS 6.4上设置4个虚拟机.首先,我创建了一个复制因子为3的密钥空间,并在其中创建了几个表,并用少量行填充每个表 - 所有表都使用Cqlsh.简单的INSERT,SELECT和UPDATE似乎工作正常.

然后我开始随机断开一些节点,以查看集群的功能.当其中两个节点处于脱机状态时,我运行了几个SELECT,返回了正确的结果.随后,我尝试更新现有行,根据"nodetool getendpoints"托管在脱机节点以及运行Cqlsh的本地节点上.将两个节点重新联机后,对更新的行运行SELECT 不会返回更新的数据值.我等了一会儿又尝试了SELECTing,但仍然保留了原始数据.我也尝试了以下内容,其中没有一个返回更新的数据:

  1. 重新运行UPDATE几次
  2. 更新同一行中的不同列 - 该字段未更新
  3. 重新启动群集中的所有四个节点

不同行中同一列的UPDATE工作正常,与上面的#2一起使我认为这是行数据的问题.

以下代码段显示SELECT在看似成功的UPDATE之前和之后返回原始数据:

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
Run Code Online (Sandbox Code Playgroud)

我是Cassandra的新手,所以我很可能会错过一些东西.任何建议或疑难解答提示(要检查的文件或要运行的命令),以帮助揭示这里发生的事情将不胜感激.

Ric*_*ard 6

这可以通过服务器之间的时钟不匹配来解释.更新的时间戳由服务器从客户端接收更新来设置.如果服务器不同步,您可以获得这样的行为,其中旧更新具有更高的时间戳,因此会覆盖后续写入.

要找到答案,首先要检查服务器上的时钟.您应该始终在Cassandra服务器之间运行NTP,因此时钟是相同的.

您可以使用WRITETIME获取时间戳来确认这是否是实际问题:

select WRITETIME(active) from users where email = 'john.doe@bti360.com';
Run Code Online (Sandbox Code Playgroud)

这是自纪元以来的微秒.将值写入另一行并获取其时间戳.如果那是更早,那么这将是原因.