我正在试验一个4节点的Cassandra(1.2)集群,我刚刚在CentOS 6.4上设置4个虚拟机.首先,我创建了一个复制因子为3的密钥空间,并在其中创建了几个表,并用少量行填充每个表 - 所有表都使用Cqlsh.简单的INSERT,SELECT和UPDATE似乎工作正常.
然后我开始随机断开一些节点,以查看集群的功能.当其中两个节点处于脱机状态时,我运行了几个SELECT,返回了正确的结果.随后,我尝试更新现有行,根据"nodetool getendpoints"托管在脱机节点以及运行Cqlsh的本地节点上.将两个节点重新联机后,对更新的行运行SELECT 不会返回更新的数据值.我等了一会儿又尝试了SELECTing,但仍然保留了原始数据.我也尝试了以下内容,其中没有一个返回更新的数据:
不同行中同一列的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的新手,所以我很可能会错过一些东西.任何建议或疑难解答提示(要检查的文件或要运行的命令),以帮助揭示这里发生的事情将不胜感激.
这可以通过服务器之间的时钟不匹配来解释.更新的时间戳由服务器从客户端接收更新来设置.如果服务器不同步,您可以获得这样的行为,其中旧更新具有更高的时间戳,因此会覆盖后续写入.
要找到答案,首先要检查服务器上的时钟.您应该始终在Cassandra服务器之间运行NTP,因此时钟是相同的.
您可以使用WRITETIME获取时间戳来确认这是否是实际问题:
select WRITETIME(active) from users where email = 'john.doe@bti360.com';
Run Code Online (Sandbox Code Playgroud)
这是自纪元以来的微秒.将值写入另一行并获取其时间戳.如果那是更早,那么这将是原因.
| 归档时间: |
|
| 查看次数: |
1396 次 |
| 最近记录: |