删除Cassandra中的读取访问模式



我使用Cassandra存储交易信息。根据可用的查询,我将CF设计如下:

CREATE trades (trading_book text,
               trading_date timestamp,
               OTHER TRADING INFO ...,
               PRIMARY KEY (trading_book, trading_date));

我想以以下方式删除给定日期的所有数据:

  1. 收集所有交易书籍(存储在其他地方);
  2. 均匀分发所有交易书,分别以20个线程;
  3. 在每个线程中,遍历书籍,

从trading_book ='a_book''和 trading_date ='2015-01-01'

大约有100万笔交易,删除需要2分钟才能完成。然后在删除完成后立即在2015-01-01(大约100万笔交易)插入交易数据。

完成插入并重新阅读数据时,即使将超时设置为600秒,我也会收到错误:

ReadTimeout: code=1200 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - received only 0 responses." info={'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'} info={'received_responses': None, 'required_responses': None, 'consistency': 'Not Set'}

现在看来CF中的某些数据不一致,即协调员可以识别分区,但是分区上没有数据?

我的访问模式有什么问题吗?如何解决这个问题?

任何提示都将不胜感激!谢谢。

您正在为该日期(通过删除)为每个列创建墓碑,然后在顶部编写新记录。因此,现在每个阅读都必须首先阅读原始列,然后是墓碑,然后是新记录。如果您做的痕迹,您会看到墓碑读物正在杀死您。卡桑德拉(Cassandra)的这种模式是有问题的,因此您应该尝试找到另一种(不可变的)方法来做到这一点。另一种选择是简单地覆盖数据,在这种情况下,没有墓碑可以调和。但是您仍然必须处理两个版本。

除了RS_ATL的响应(击中了墓碑上的指甲),这里还有一些信息供您理解/解决问题:

到底是什么?

由于Sstables是不可变的,而不是在Cassandra中删除记录,因此我们插入一个基本上具有无效值的新单元格。那是一个墓碑。GC_Grace秒后可用于删除或垃圾收集墓碑(可通过表配置)。

墓碑和维修:

我们等待的原因是要确保C*有时间向所有复制品传播墓碑。如果墓碑没有复制到所有副本(例如,在某些带有低CL的边缘案例和flopping节点的情况下),然后删除/GC'ED,则删除的原始数据将重新栩栩如生。这就是为什么我们至少进行每个GC_Grace进行维修,确保墓碑一致性并防止僵尸数据。

我打了几个墓碑?

如果您打开CQLSH tracing on中的跟踪或打开YAML中或通过Nodetool打开概率跟踪,您将能够看到您要为特定请求打了多少个墓碑。随着这个数字越来越大,您的阅读性能会降低,直到您看到您提到的超时为止。

nodetool cfstats还为您提供了更多的宏观详细信息(每片平均墓碑)。

sstablemetadata实用程序在表中向您展示了墓碑的总数。

我该怎么做才能摆脱墓碑?

1)如果您要删除表中的所有内容,则截断表是一种在C*中免费删除数据的方法,因为您可以到期整个Sstables。

2)通过压实去除墓碑。您可以通过减少gc_grace_seconds和/或增加墓碑比以进行压实而更积极地删除墓碑,但请确保您正在运行维修或可能会看到僵尸数据。