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