В рамках проекта LiteTree развивается вариант SQLite с поддержкой ветвления БД

Доступна новая встраиваемая СУБД LiteTree, построенная на базе модифицированного движка SQLite, переработанного для поддержки ветвления, по аналогии с Git. Наработки проекта распространяются под лицензией MIT.

LiteTree позволяет хранить несколько вариантов состояния одной базы данных, но в отличие от срезов состояния (снапшотов) каждая ветка может продолжать независимо развиваться, обновляться и дополняться. Таким образом, пользователь получает возможность обращения к БД через несколько точек подключения, каждая из которых связана с определённым ответвлением в развитии БД. Среди практического применения ветвления БД называется реализация структур хранения в виде блокчейнов. В том числе, СУБД LiteTree была создана компанией Blocko специально для проекта Aergo, развивающего универсальную платформу для создания бизнес-систем на базе блокчейна и P2P-коммуникаций.

Все транзакции в LiteTree сохраняются в виде коммитов, каждый из который имеет свой номер. По умолчанию БД привязывается к ветке master, но разработчик может создать ответвление, указав в качестве отправной точки определённый коммит (например, «PRAGMA new_branch=test at master.2»). После этого ветки разделяются и в каждую из них можно отдельной вносить изменения. В каждой ветке применяется идентичная модель нумерации коммитов (номер отражает удаление от первого коммита), что позволяет последовательно перебирать ветки, анализировать возникшие ветвления, возвращаться к любому состоянию БД в прошлом и создавать новые ветки, отбрасывая определённый пласт изменений.

0_1535786566.png

Ограничением предложенной модели хранения является невозможность изменения данных после фиксации коммита — задним числом уже добавленные данные изменить нельзя, возможно только добавить изменение в вершине текущей ветки при помощи нового коммита или создать новую ветку начиная с изменяемого коммита, если необходимо изменить состояние БД относительно этого коммита. Также имеется возможность удаления хвоста ветки, начиная с заданного коммита, переименования ветки или полного удаления ветки.

Для обработки SQL-запрсов и манипуляции блоками данных в LiteTree по возможности задействован уже проверенный код SQLite, но для хранения на диске блоков применяется LMDB. Данные сохраняются без применения сжатия с расчётом один блок SQLite на один сектор (4096 байт). Дублирующиеся в разных ветках данные сохраняются только в одном экземпляре, а при создании новой ветки существующие данные не копируются (при выполнении транзакции копируются только связанные с ней изменённые блоки).

Примечательно, что применяемый в LiteTree подход похволил существенно поднять производительность — по сравнению с SQLite новая СУБД в проведённых тестах оказалась более чем в два раза быстрее как при чтении, так и при записи данных. Из пока нереализованных планов на будущее упоминается предоставление средств для анализа различий между ветками, просмотра истории изменений, слияния веток, разграничение доступа к веткам и прикрепления метаданных к веткам или коммитам.

Дополнительно можно отметить похожий проект git-sqlite, позволяющий хранить различные ветки БД в форме Git-репозитория. В отличие от LiteTree в git-sqlite используется немодифицированные SQLite и Git, дополненные прослойками для определения различий между прошлой веткой и текущим состоянием БД, отражения этих различий в Git и слияния разных веток. Тем не менее, так как в git-sqlite для получения выбранной ветки требуется загрузка SQL-дампа из Git и перестроение БД, данная система больше подходит для решения задач архивирования и анализа изменений.

© OpenNet