Безопасная запись части файлового алгоритма (запись атомарной части)
Предположим, я хочу написать простую базу данных (работа на Linux), которая должна удовлетворять следующим условиям:
У него только две функции:
- write_chunk (индекс, байты)
- read_chunk (индекс)
Где index - целое число от 0 до 1M, а байты - чанк 100 байтов. Я хочу, чтобы состояния файлов передавались атомарно после каждого вызова write_chunk.
Так что я хочу быть уверен:
- Блок из 100 байтов записывает в файл с индексом позиции *100
- Все 100 байтов пишутся атомарно (или не пишутся вообще)
- Если внезапное отключение происходит при записи (предыдущие действительные 100 байт восстановлены)
Я воображаю реализации, как это:
Напишите реализацию функции:
- Перед тем, как начать запись 100 байтов, мы копируем предыдущие 100 байтов из индекса позиции *100 в другой файл для отката (индекс также копируется). также мы подписываем все данные файла отката хешем. Сделайте fsync при откате.
- Затем мы начинаем писать новые 100 байтов с индексом позиции *100, делаем fsync.
- Если шаг 2 в порядке, мы удаляем все данные из файла отката.
- Мы возвращаем нормально функцию вызывающего абонента.
Прочитать реализацию функции:
Если мы начинаем чтение и откат файла не пустым и действительным, мы восстанавливаем 100 байт из отката и удаляем откат или просто удаляем откат, если хеш недействителен.
Мы читаем чанк из индекса позиции *100 и возвращаем данные
Я в безопасности с помощью следующего алгоритма?
Поэтому я хочу быть уверен, что я на том же уровне безопасности, что и базы данных, такие как mysql или postgresql, выполняющие вставку после фиксации.
Какую технику я могу использовать, чтобы гарантировать атомарную и долговременную запись, я имею в виду, может быть, мне нужно использовать хеширование на чанке, чтобы убедиться, что он действительный, или использовать двойную копию файла отката. Или сохраняйте данные в файле отката немного позже, чтобы обеспечить очистку дисковых подсистем. (Я слышал, что я не безопасен, даже если я вызываю fsync после записи, это зависит от подсистемы диска, тогда он физически записывает данные).
1 ответ
Это должно работать, пока у вас нет параллелизма, то есть только одна из этих функций может запускаться одновременно.
Почему бы вам не использовать простую встроенную базу данных?