Способы реализации контроля версий данных в Кассандре - PullRequest
19 голосов
/ 15 ноября 2010

Можете ли вы поделиться своими мыслями о том, как реализовать управление версиями данных в Cassandra.

Предположим, мне нужно записать версии в простой адресной книге. (Записи адресной книги хранятся в виде строк в ColumnFamily). Я ожидаю, что история:

  • будет использоваться нечасто
  • будет использоваться сразу, чтобы представить его в виде "машины времени"
  • не будет больше версий, чем несколько сотен для одной записи.
  • история не истечет.

Я рассматриваю следующий подход:

  • Преобразование адресной книги в семейство Super Column и сохранение нескольких версий записей адресной книги в одной строке (с отметкой времени) в виде столбцов Super *.

  • Создание нового семейства суперколонок для хранения старых записей или изменений в записях. Такая структура будет выглядеть следующим образом:

    { 'ключ строки адресной книги': { 'отметка времени1': { «имя»: «новое имя», «изменено»: «идентификатор пользователя», },

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

    'ключ строки другой адресной книги': { 'отметка времени': { ....

  • Хранить версии в виде сериализованного (JSON) объекта, присоединенного в новом ColumnFamilly. Представление наборов версий в виде строк и версий в виде столбцов. (смоделировано после Простое управление версиями документов с помощью CouchDB )

Ответы [ 2 ]

8 голосов
/ 25 ноября 2010

Если вы можете добавить предположение о том, что в адресных книгах обычно содержится менее 10 000 записей, то использование одного ряда на строку времени в адресной книге в семействе суперколонок будет приемлемым подходом.

Строка будетвыглядят так:

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

, где ключ строки идентифицирует адресную книгу, каждое имя столбца super является меткой времени, а подколонки представляют содержимое адресной книги для этой версии.

Это будетпозволяют читать последнюю версию адресной книги только с одним запросом, а также писать новую версию с одной вставкой.

Причина, по которой я предлагаю использовать это, если в адресных книгах меньше 10 000 элементов, заключается в том, что супер-столбцыдолжен быть полностью десериализован, когда вы читаете хотя бы один вложенный столбец.В целом, не так уж и плохо в этом случае, но об этом следует помнить.

Альтернативный подход состоит в том, чтобы использовать одну строку для каждой версии адресной книги и использовать отдельный CF с строкой временной шкалы.для каждой адресной книги, например:

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

Здесь some_uuid1 и some_uuid2 соответствуют ключу строки для этих версий адресной книги.Недостатком этого подхода является то, что он требует два запроса каждый раз, когда читается адресная книга.Плюс в том, что он позволяет эффективно читать только отдельные части адресной книги.

1 голос
/ 18 марта 2013

HBase (http://hbase.apache.org/) имеет встроенную функциональность. Попробуйте.

...