【发布时间】:2013-06-08 18:04:31
【问题描述】:
我正在试验一个 4 节点 Cassandra (1.2) 集群,我刚刚在 CentOS 6.4 上跨 4 个 VM 设置该集群。首先,我创建了一个复制因子为 3 的键空间,并在其中创建了几个表,并用少量行填充每个表 - 全部使用 Cqlsh。简单的 INSERT、SELECT 和 UPDATE 似乎工作正常。
然后我开始随机断开一些节点,以查看集群的功能。虽然其中两个节点处于脱机状态,但我运行了一些返回正确结果的 SELECT。随后,我尝试更新现有行,根据“nodetool getendpoints”,该行托管在离线节点以及运行 Cqlsh 的本地节点上。使两个节点重新联机后,对更新的行运行 SELECT 并不返回更新的数据值。我等了一会儿,再次尝试 SELECTing,但仍然返回原始数据。 我还尝试了以下方法,但都没有返回更新的数据:
- 重新运行 UPDATE 几次
- 更新同一行中的不同列 - 该字段未更新
- 重新启动集群中的所有四个节点
不同行中同一列的 UPDATE 工作正常,这与上面的 #2 一起让我认为这是行数据的问题。
下面的 sn-p 显示了一个 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
我是 Cassandra 的新手,所以我很可能会遗漏一些东西。任何有助于发现这里发生的事情的建议或故障排除提示(要检查的文件或要运行的命令)将不胜感激。
【问题讨论】:
-
如果使用一致性级别 ALL,是否返回更新数据?您可以在 cqlsh 中使用 'CONSISTENCY ALL' 进行设置。
-
不幸的是,它没有。
-
在这种情况下更新失败。当您在节点关闭的情况下进行更新时,您是否有 cqlsh 输出?
-
这很难说,因为我在第一次幻像 UPDATE 之前和之后做了很多类似的操作,但我不记得当时看到过失败。无论哪种方式,为什么对同一行的后续更新会继续丢失?我绝对没有得到任何错误。
-
您能否粘贴所有 cqlsh 输出以进行更新并选择显示此行为的内容?
标签: cassandra