【问题标题】:Ways to implement data versioning in Cassandra在 Cassandra 中实现数据版本控制的方法
【发布时间】:2011-05-10 04:42:07
【问题描述】:

您能否分享一下您将如何在 Cassandra 中实现数据版本控制的想法。

假设我需要对一个简单地址簿中的记录进行版本化。 (通讯簿记录存储为 ColumnFamily 中的行)。 我希望历史:

  • 不常使用
  • 将一次性使用,以“时间机器”的方式呈现它
  • 单个记录的版本不会超过几百个。
  • 历史不会过期。

我正在考虑以下方法:

  • 将通讯录转换为超级列族,并将多个版本的通讯录记录存储在一个行键控(按时间戳)中作为超级列。

  • 创建新的超级列族以存储旧记录或对记录的更改。 这样的结构如下所示:

    { '通讯录行键': { '时间戳1':{ '名字': '新名字', '修改者':'用户ID', },

    'time stamp2': {
            'first name': 'new name',
            'modified by': 'user id',
        },
    },
    

    '另一个通讯录行键': { '时间戳':{ ....

  • 将版本存储为附加在新 ColumnFamily 中的序列化 (JSON) 对象。将版本集表示为行,将版本表示为列。 (仿照Simple Document Versioning with CouchDB

【问题讨论】:

    标签: cassandra database-versioning


    【解决方案1】:

    如果您可以假设地址簿中的条目通常少于 10,000 个,那么在超级列族中每个地址簿时间线使用一行将是一种不错的方法。

    一行看起来像:

    {'address_book_18f3a8':
      {1290635938721704: {'entry1': 'entry1_stuff', 'entry2': 'entry2_stuff'}},
      {1290636018401680: {'entry1': 'entry1_stuff_v2', ...},
      ...
    }
    

    其中行键标识地址簿,每个超级列名称是一个时间戳,子列代表该版本的地址簿内容。

    这将允许您仅使用一个查询读取最新版本的地址簿,还可以使用单个插入编写新版本。

    如果地址簿的元素少于 10,000 个,我建议使用此方法的原因是,即使读取单个子列,超级列也必须完全反序列化。总的来说,在这种情况下并没有那么糟糕,但需要牢记这一点。

    另一种方法是每个版本的地址簿使用单行,并使用单独的 CF,每个地址簿有一个时间线行,例如:

    {'address_book_18f3a8': {1290635938721704: some_uuid1, 1290636018401680: some_uuid2...}}
    

    这里,some_uuid1 和 some_uuid2 对应于这些版本的地址簿的行键。这种方法的缺点是每次读取地址簿时都需要两次查询。好处是它可以让您有效地只阅读地址簿的选定部分。

    【讨论】:

    • 感谢您指出您始终需要阅读整个超级专栏。我没有发现阅读 cassandra 文档的事实。
    【解决方案2】:

    HBase(http://hbase.apache.org/) 内置了这个功能。 试试看吧。

    【讨论】:

    猜你喜欢
    • 2011-05-10
    • 2011-05-10
    • 2013-09-05
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    相关资源
    最近更新 更多