Способы реализации контроля версий данных в Кассандре

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

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

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

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

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

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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам