2012-12-12 94 views
2

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

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

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

另外,Hector是否提供了一种机制来总是获取行,使得最早的行被首先获取?

编辑:

阅读rs_atl的文章后,我有更多的疑惑:

  1. 如果我正确理解这一点,我将创建一个列族与TimeUUIDType作为比较。然后我将不得不使用时间戳列名。我脑海中出现的直接问题是如何为列名定义排序顺序(升序还是降序)?我可以在创建列家族时做到这一点,或者我必须通过客户端API来做到这一点?

  2. 如果我决定使用'小时'作为我的碎片间隔,即如果我将小时追加到我的键上,如何检索最长时间的行?

回答

2

有尝试与卡桑德拉这样的解决方案时需要考虑的一些事情:

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

赫克托根本不确定排序;这发生在插入并基于你选择的比较器。如果你想要一个特定的顺序,你必须以这种方式写数据(参见上面的第3点)。

关于你的编辑附加信息:

  1. 我不会用TimeUUIDType作为比较,只是一个长值要么Unix纪元或时间YYYYMMDDXX的形式为数值表示形式您需要的精度水平。您可以在查询时决定是以正常(升序)还是反转(降序)的顺序进行设置。

  2. 你可以要求所有按键,只需占用最小的一个,它可以很好地工作或者是一个可怕的想法取决于你有多少,你的等待时间要求。或者(当然更有效率),你可以在某个地方(一个文件,另一个CF,内存中,任何有意义的地方)写入最老的密钥。

+0

“因为卡桑德拉不支持事务”这并不完全正确。 Cassandra以原子方式更新单个行键的所有列。这是您获得的唯一交易保证。 – Sarge

+1

@Sarge:是的,你当然是对的,但他可能需要的那种交易是不被支持的。尽管实际上传统的RDBMS风格的交易也不能完全解决问题。他真正需要的是类似队列的保证,或者像Zookeeper这样的分布式锁。 –

+0

为了清晰起见,我已更新该帖子。 –