卡桑德拉的副作用暗示了切换导致不一致

时间:2013-10-09 01:29:32

标签: cassandra consistency

我有一个3节点集群,replicate_factor也是3。一致性级别为Write quorum,Read quorum。 交通有三个主要步骤

  • 创建:
    • Rowkey:xxxx
    • 列:status = new,requests =“xxxxx”
  • 更新:
    • Rowkey:xxxx
    • 列:status = execution,requests =“xxxxx”
  • 删除:
    • Rowkey:xxxx

当一个节点关闭时,它可以根据一致性配置工作,最终状态是所有请求都已完成并删除。

因此,如果运行cassandra客户端列出结果(也设置一致性仲裁)。它显示为空(仅左键),这是正确的。

但是如果我们启动死节点,则提示的切换模型会将数据写回该节点。所以有很多创建,更新,删除。

我不知道由于GC或压缩,其他两个节点上的删除记录似乎不起作用,如果使用cassandra客户端列出数据(也是一致性仲裁),则删除的行将再次显示列值。由于恢复节点再次重播历史记录。

如果使用客户端多次检查数据,可以发现数据被更改,似乎提示切换重放操作,删除的数据显示然后消失。

有没有办法让这个程序从外部看不见,直到暗示的切换结束?

我想要的是最终状态同步,临时状态是过时的也是不正确的,永远不应该从外部看到。

是否由于行删除而不是列删除?还是压缩?

1 个答案:

答案 0 :(得分:1)

检查完日志和配置后,我发现它有两个原因。

  1. GC宽限期

    我使用hector客户端连接cassandra,每个列族的GC宽限秒的默认值是!因此,当提示切换重放临时值时,通过压缩删除其他两个节点上的逻辑删除。然后客户端将获得临时值。

  2. 二级索引

    即使解决了第一个问题,我仍然可以从cassandra客户端获得临时结果。我使用“get my_cf where column_one ='value'”这样的命令来查询数据,然后再次显示临时值。但是当我使用原始键再次查询记录时,它就消失了。 从客户端,我们总是使用行键来获取数据,这样,我没有得到临时值。

    因此,二级索引似乎不受一致性配置的限制。

    当我将GC宽限期改为10天时。我们的问题已经解决,但使用索引查询时仍然是一种奇怪的行为。