我有一个3节点集群,replicate_factor也是3。一致性级别为Write quorum,Read quorum。 交通有三个主要步骤
当一个节点关闭时,它可以根据一致性配置工作,最终状态是所有请求都已完成并删除。
因此,如果运行cassandra客户端列出结果(也设置一致性仲裁)。它显示为空(仅左键),这是正确的。
但是如果我们启动死节点,则提示的切换模型会将数据写回该节点。所以有很多创建,更新,删除。
我不知道由于GC或压缩,其他两个节点上的删除记录似乎不起作用,如果使用cassandra客户端列出数据(也是一致性仲裁),则删除的行将再次显示列值。由于恢复节点再次重播历史记录。
如果使用客户端多次检查数据,可以发现数据被更改,似乎提示切换重放操作,删除的数据显示然后消失。
有没有办法让这个程序从外部看不见,直到暗示的切换结束?
我想要的是最终状态同步,临时状态是过时的也是不正确的,永远不应该从外部看到。
是否由于行删除而不是列删除?还是压缩?
答案 0 :(得分:1)
检查完日志和配置后,我发现它有两个原因。
GC宽限期
我使用hector客户端连接cassandra,每个列族的GC宽限秒的默认值是零!因此,当提示切换重放临时值时,通过压缩删除其他两个节点上的逻辑删除。然后客户端将获得临时值。
二级索引
即使解决了第一个问题,我仍然可以从cassandra客户端获得临时结果。我使用“get my_cf where column_one ='value'”这样的命令来查询数据,然后再次显示临时值。但是当我使用原始键再次查询记录时,它就消失了。 从客户端,我们总是使用行键来获取数据,这样,我没有得到临时值。
因此,二级索引似乎不受一致性配置的限制。
当我将GC宽限期改为10天时。我们的问题已经解决,但使用索引查询时仍然是一种奇怪的行为。