【问题标题】:Implementing FIFO read in Cassandra在 Cassandra 中实现 FIFO 读取
【发布时间】:2012-11-30 02:40:57
【问题描述】:

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

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

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

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

编辑:

看完rs_atl的帖子,我又有些疑惑了:

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

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

【问题讨论】:

    标签: java sorting cassandra hector


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • “因为 Cassandra 不支持事务”这不太正确。 Cassandra 以原子方式更新单个行键的所有列。这是您获得的唯一交易保证。
    • @Sarge:是的,你当然是正确的,但不支持他可能需要的那种交易。尽管实际上传统的 RDBMS 式事务也不能完全解决问题。他真正需要的是队列之类的东西提供的保证,或者通过 Zookeeper 之类的东西提供的分布式锁。
    • 假设我的键将是每小时数据的存储桶,我仍然需要对键进行排序才能获取最早一小时的行,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多