MithrilDB icon indicating copy to clipboard operation
MithrilDB copied to clipboard

Инкрементальный бекап/рекавери.

Open nice-redbull opened this issue 6 years ago • 4 comments

Благодаря режиму "LIFO RECLAIM" размер такого бекапа должен быть, в некоторых сценария, минимален.

Для реализации такого механизма предложу свою идею:

  • Создать битмап индек в виде файла в той же дирректории что и база данных. (один бит - один блок/страница бд)
  • Устанавливать биты в "1" если блок связывается с транзакцией и считается потенциально "грязным"
  • Устанавливать биты в "0" после "реального коммита" или перед началом инкрементального бекапа -> "пройдя по списку" свободных блоков.

алгоритм инкрементального бекапа :

  • поставить "0" в таком битмапе по всем страницам что принадлежат списку свободных блоков.
  • скопировать в стрим весь индек. , потом последовательно все блоки для которых в индексе установлен "1".

Восстановление:

  • перезаписать все блоки для которых в индексе установлены "1" . (в файле инкрементального бекапа все блоки уже в нужной последовательности)
  • запустить проверку корректности. (этот алгоритм уже присутствует)

ЗЫ: полный (не инкрементальтный) бекап это бинарная копия файла базы данных.

nice-redbull avatar Mar 05 '19 13:03 nice-redbull

В следующей версии (ветка devel) подобное планируется реализовать, но несколько иначе:

  • заголовок страницы внутри БД будет добавлен номер породившей её транзакции (это также требуется для контроля целостности посредством Merkle Tree).
  • при инкрементальном бакапе последовательно сравниваются номера транзакций в актуальной и БД и резервной копии.
  • обновленные страницы помещаются в очередной слой incremental backup.

erthink avatar Mar 05 '19 14:03 erthink

Леонид, предложу к Вашему алгоритму пару дополнений :-) :

  • в момент помещения страницы в список свободных блоков, устанавливать номер транзакции в "0" , дабы страница игнорировалась при бекапе.
  • возможно ли на уровне листов б-три индекса устанавливать максимальный номер транзакции в поддереве для ускорения операции инкрементального бекапа ? (в таком случае не нужно сканировать поддерево чем и ускориться операция бекапа)

nice-redbull avatar Mar 05 '19 14:03 nice-redbull

Это достаточно очевидные вещи, которые я опустил как детали. Но теперь, на всякий случай, отмечу два момента:

  • пометка нулем нужна если вы идете линейно по файлу, а не обходите дерево.
  • отметка о максимальном номере, напротив, полезна только при обходе дерева.
  • отметка о максимальном номере транзакции в под-дереве будет занимать место в каждой branch-page.
  • следом в branch-страницы напрашивается еще масса "вкусных" значений, например кол-во ключей в поддереве для быстрой оценки range-выборок.

erthink avatar Mar 05 '19 14:03 erthink

Спасибо, вы меня успокоили ))) жду следующий "релиз", а пока буду rust биндинг пилить.

nice-redbull avatar Mar 05 '19 14:03 nice-redbull