Безопасная запись части файлового алгоритма (запись атомарной части)

0

Предположим, я хочу написать простую базу данных (работа на Linux), которая должна удовлетворять следующим условиям:

У него только две функции:

  1. write_chunk (индекс, байты)
  2. read_chunk (индекс)

Где index - целое число от 0 до 1M, а байты - чанк 100 байтов. Я хочу, чтобы состояния файлов передавались атомарно после каждого вызова write_chunk.

Так что я хочу быть уверен:

  1. Блок из 100 байтов записывает в файл с индексом позиции * 100
  2. Все 100 байтов пишутся атомарно (или не пишутся вообще)
  3. Если внезапное отключение происходит при записи (предыдущие действительные 100 байт восстановлены)

Я представляю себе такие реализации:

Напишите реализацию функции:

  1. Перед тем, как начать запись 100 байтов, мы копируем предыдущие 100 байтов из индекса позиции * 100 в другой файл для отката (индекс также копируется). также мы подписываем все данные файла отката хешем. Сделайте fsync при откате.
  2. Затем мы начинаем писать новые 100 байтов с индексом позиции * 100, делаем fsync.
  3. Если шаг 2 в порядке, мы удаляем все данные из файла отката.
  4. Мы возвращаем нормально функцию вызывающего абонента.

Прочитать реализацию функции:

  1. Если мы начинаем чтение и откат файла не пустым и действительным, мы восстанавливаем 100 байт из отката и удаляем откат или просто удаляем откат, если хеш недействителен.

  2. Мы читаем чанк из индекса позиции * 100 и возвращаем данные

Я в безопасности с помощью следующего алгоритма?

Поэтому я хочу быть уверен, что я на том же уровне безопасности, что и базы данных, такие как mysql или postgresql, выполняющие вставку после фиксации.

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

Теги:
database
disk
acid

1 ответ

0

Это должно работать, пока у вас нет параллелизма, то есть только одна из этих функций может запускаться одновременно.

Почему бы вам не использовать простую встроенную базу данных?

  • 0
    Это больше для учебных целей, что если я реализую что-то вроде актерской модели, где у меня есть миллионы актеров, где состояние актера видимо только для себя через одну сопрограмму и без общих блоков данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню