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

Cassandra 卡桑德拉暗示的切换的副作用会导致不一致,cassandra,consistency,Cassandra,Consistency,我有一个3节点的集群,复制因子也是3。一致性级别为写入仲裁、读取仲裁。 交通有三个主要步骤 创建: 行键:xxxx 列:status=new,requests=“xxxxx” 更新: 行键:xxxx 列:状态=正在执行,请求=“xxxxx” 删除: 行键:xxxx 当一个节点关闭时,它可以根据一致性配置工作,最终状态为所有请求都已完成并已删除 因此,如果运行cassandra客户端以列出结果(同时设置一致性仲裁)。它显示为空(仅左行键),这是正确的 但是如果我们启动死节点,暗示的

我有一个3节点的集群,复制因子也是3。一致性级别为写入仲裁、读取仲裁。 交通有三个主要步骤

  • 创建:
    • 行键:xxxx
    • 列:status=new,requests=“xxxxx”
  • 更新:
    • 行键:xxxx
    • 列:状态=正在执行,请求=“xxxxx”
  • 删除:
    • 行键:xxxx
当一个节点关闭时,它可以根据一致性配置工作,最终状态为所有请求都已完成并已删除

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

但是如果我们启动死节点,暗示的切换模型将把数据写回这个节点。所以有很多创建、更新和删除

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

并且如果使用客户端多次检查数据,可以发现数据发生了更改,似乎暗示了切换重播操作,删除的数据会出现然后消失

有没有办法让这个过程从外部看不见,直到暗示的切换完成

我想要的是最终状态同步,临时状态已过期且不正确,不应从外部查看


是因为行删除而不是列删除吗?还是压缩?

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

  • GC格雷斯秒

    我使用hector客户端连接cassandra,每个列族的GC grace seconds的默认值为!因此,当提示切换重放临时值时,通过压缩删除另两个节点上的墓碑。然后客户端将获得临时值

  • 二级索引

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

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

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


  • 在检查日志和配置后,我发现它是由两个原因引起的

  • GC格雷斯秒

    我使用hector客户端连接cassandra,每个列族的GC grace seconds的默认值为!因此,当提示切换重放临时值时,通过压缩删除另两个节点上的墓碑。然后客户端将获得临时值

  • 二级索引

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

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

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