Способы реализации контроля версий данных в Кассандре
Можете ли вы поделиться своими мыслями о том, как бы вы реализовали управление версиями данных в 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/) имеет встроенную функциональность. Попробуйте.