Техника ведения журнала кажется единственной. Я не знаю, как это работает с несколькими приложениями, записывающими в один файл. У проекта Cassandra есть хорошая статья о том, как добиться успеха с журналом. Главное, чтобы убедиться в том, что журнал записывает только положительных действий (мой первый подход состоял в том, чтобы записать предварительное изображение каждой записи в журнал, позволяющее вам выполнить откат, но это оказалось слишком сложным ).
Таким образом, в основном ваш отображенный в память файл имеет transactionId
в заголовке, если ваш заголовок помещается в один блок, вы знаете, что он не будет поврежден, хотя многие люди пишут его дважды с контрольной суммой: [header[cksum]] [header[cksum]]
, Если первая контрольная сумма не пройдена, используйте вторую.
Журнал выглядит примерно так:
[beginTxn[txnid]] [offset, length, data...] [commitTxn[txnid]]
Вы просто продолжаете добавлять записи журнала, пока они не станут слишком большими, а затем перевернуть их в какой-то момент. При запуске вашей программы вы проверяете, находится ли идентификатор транзакции для файла с последним идентификатором транзакции журнала - если нет, вы воспроизводите все транзакции в журнале для синхронизации.