2

给定一个 Cassandra 数据库,是否有一种以 FIFO 方式获取记录的机制,以便可以按插入时间的升序读取记录。我基本上需要分批读取 N 最旧的行,处理它们并在处理完成后删除该批次。

据我了解,列按其类型排序(由 CompareWith 指定),行按其分区器排序。

我可以使用 OrderPreservingPartitioner 按插入时间的升序对行进行排序吗?我在单个节点上运行 Cassandra,所以我并不担心密钥的分配。如果可以使用 OrderPreservingPartitioner,如何配置我的键的排序条件,以便记录按插入的升序维护?

或者,Hector 是否提供了一种始终获取行的机制,以便首先获取最旧的行?

编辑 :

看完rs_atl的帖子后,我还有一些疑问:

  1. 如果我正确理解了这一点,我将创建一个以 TimeUUIDType 作为比较器的列族。然后,我将不得不对列名使用时间戳。我想到的直接问题是如何将列名的排序顺序定义为升序或降序?我可以在创建列族时执行此操作,还是必须通过客户端 API 执行此操作?

  2. 如果我决定使用“小时”作为我的分片间隔,即,如果我将小时附加到我的键,我如何检索最早一小时的行?

4

1 回答 1

2

在尝试使用 Cassandra 进行此类解决方案时,需要考虑许多事项:

  1. 始终使用 RandomPartitioner,因为如果你不这样做,你会得到热点。
  2. 您的密钥应该是时间段(如几天或几小时),因此您可以在给定的时间段内提前知道它们。
  3. 您的列名应该是按时间顺序排序的时间戳(按字典顺序或数字顺序)。这将允许您查询范围。
  4. 确保至少使用 QUORUM(或 LOCAL_QUORUM)读取和写入,这样您就不会遇到一致性问题。
  5. 您需要在您的应用程序中找到一种方法,以确保您不会多次处理相同的数据,因为其他人可能会在您读取记录以进行处理然后将其删除(即,它不像队列)。

Hector 根本不决定排序。这发生在插入时,并且基于您选择的比较器。如果您想要特定的顺序,则必须以这种方式写入数据(参见上面的第 3 点)。

关于您编辑中的其他信息:

  1. 我不会使用 TimeUUIDType 作为您的比较器,只是一个长值,它可以是 Unix 纪元,也可以是 YYYYMMDDxx 形式的时间数字表示,达到您需要的精度水平。您可以在查询时决定是否需要正常(升序)或反向(降序)顺序的值。

  2. 您可以要求所有密钥,然后只取最小的一个,这可能会很好,也可能是一个糟糕的主意,具体取决于您拥有的数量和延迟要求。或者(当然更有效),您实际上可以在某处写入最旧的密钥(一个文件,另一个 CF,在内存中,任何有意义的东西)。

于 2012-12-12T14:55:02.117 回答