Способы реализации управления версиями данных в Cassandra

StackOverflow https://stackoverflow.com/questions/4183945

  •  10-10-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

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

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

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

Это было полезно?

Решение

Если вы можете добавить предположение, что в адресных книгах обычно содержится менее 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 соответствуют ключу строки для этих версий адресной книги.Недостатком этого подхода является то, что он требует двух запросов каждый раз при чтении адресной книги.Положительным моментом является то, что это позволяет вам эффективно читать только отдельные разделы адресной книги.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top