Надежное файловое хранилище ключей-значений с транзакциями XA или без них

Проблема

В настоящее время я реализую решение для одной довольно старой системы, которой требуется облегченное хранилище ключей-значений на основе файлов (значение ключа хранится в виде файла) с простыми операциями, подобными ConcurrentHashMap: put(), delete(), get() и listAll(). Он должен предоставлять возможность параллельных операций чтения и записи с полноценным транзакционным поведением (ACID + повторяемая изоляция чтения).

Кажется, этот компонент должен выглядеть очень похоже на TableFS...

Подход

Первоначальная идея состоит в том, чтобы взять облегченное встраиваемое постоянное хранилище ключей и значений и использовать его для хранения метаданных для файлов значений, расположенных в файловой системе (ключ файла, путь к файлу, размер, другие атрибуты...). Кроме того, он должен обеспечивать механизм быстрого поиска файлов на основе индексов. Так что, такое хранилище играет роль реестра...

Я довольно долго искал такое хранилище ключей-значений, которое могло бы удовлетворить следующие требования:

  • Открытый источник;
  • Встраиваемый;
  • Обеспечить поддержку карт и коллекций Java;
  • Устойчивость к сбою/отключению машины (журналы с упреждающей записью и другие подходы);
  • Обеспечение ACID транзакции;
  • Хранилище для чтения и записи (по сравнению с PalDB только для чтения).

и придумал варианты MapDb и LevelDb.

Поскольку мне нужно обеспечить разрешение параллелизма для этих пользовательских транзакций чтения/записи, мне нужно установить глобальные транзакции XA, включая хранилище ключ-значение и файловую систему. Для файловой системы есть системы транзакций XADisk и Jakarta Commons-Transactions, также для глобальной архивации есть менеджер транзакций Atomikos Essintials.

Однако я не могу найти ни одной статьи, объясняющей, как настроить MapDB или LevelDB с помощью диспетчера транзакций XA...

Вопросы

Не могли бы вы предложить следующее?

  1. имеет ли смысл мой подход или есть какие-то известные решения/реализации для описанной проблемы?
  2. какой подводный камень вы видите в этой задаче/подходе?
  3. есть ли какие-либо ресурсы, описывающие, как настроить такие хранилища ключ-значение для участия в транзакциях xa?

Обновления

Есть еще одна база данных — SQLite — которую можно интегрировать с Atomikos. Он не имитирует коллекции Java, но довольно легко эмулировать все операции вручную. Единственная ловушка, которую я вижу на данный момент, - это способ разрешения параллельных модификаций ключей с помощью параллельных транзакций (проблема потерянного обновления). Похоже, потребуется написать своего рода хранимую процедуру с функцией проверки и установки на основе временной метки ключа...


person Dmitry    schedule 21.04.2017    source источник
comment
вы смотрели на wiredtiger?   -  person amirouche    schedule 24.04.2017


Ответы (1)


Хорошо, наконец-то я придумал, как реализовать свою задачу, даже без XA-транзакций, блокировок файлов и прочих излишеств.

Если кому-то интересно, посмотрите мой проект на GitHub, по этой ссылке. Описание скоро будет добавлено в проект GitHub. Надеюсь, на данный момент код не требует пояснений.

person Dmitry    schedule 26.04.2017