2012-05-24 2 views
7

Если бы можно было выдать последовательную серию write(2) в Linux/Unix разделенным fdatasync(2) или fsync(2) или sync(2) является гарантировала, что первая запись() будет сохранена на диск перед вашей второй записи() ? Следующий SO post, похоже, говорит, что такие гарантии не могут быть заданы, так как задействованы несколько слоев кэширования. Для систем баз данных, которые гарантируют согласованность, это, по-видимому, важно, поскольку при восстановлении WAL (Write Ahead Logging) вам необходимо, чтобы ваши журналы сохранялись на диске до фактического изменения ваших данных, чтобы в случае сбоя приложения/системы вы можете вернуться к своему последнему известному согласованному состоянию. Как это обеспечивается/реализуется в реальной системе баз данных?Гарантии в упреждающее журналирование реализации

+0

Я бы рассмотрел объяснения на сайте SQLite. В нем рассказывается о том, как используются подходы, поскольку они предоставляют обзор того, когда используются аппаратные (синхронизационные) флеши и т. Д. –

ответ

1

Системный вызов sync() практически не помогает; он обещает запланировать операции записи на диск, но это все.

Нормальный метод, используемый, чтобы установить правильные параметры при open() дескриптор файла для файла на диске: O_DSYNC, O_RSYNC, O_SYNC. Тем не менее, fsync() и fdatasync() довольно близки к тем же эффектам. Вы также можете посмотреть O_DIRECTIO, который часто поддерживается, хотя он не стандартизован вообще POSIX.

В конечном итоге СУБД полагается на O/S, чтобы данные, записанные и синхронизированные с одним диском, были безопасными. Пока устройство всегда будет возвращать то, что было написано в СУБД, даже если оно не находится на самом диске еще из-за кэширования (поскольку оно хранится в энергонезависимом кеше или что-то в этом роде), то это не критично , Если, с другой стороны, у вас есть NAS (сетевое хранилище), которое не гарантирует, что то, что вы в последний раз написали (и сказали, было безопасно на диске), возвращается при его чтении, тогда ваша СУБД может пострадать, если это необходимо восстановление. Таким образом, вы выбираете, где вы храните свои СУБД с осторожностью, следя за тем, чтобы хранилище работало разумно. Если хранилище не работает достаточно как гипотетический диск, вы можете потерять данные.

+0

DirectIO не предоставляет гарантий, которые задает этот вопрос. Но флаг OSYNC для открытия делает то, что ожидается, конечно. – ArekBulski

0

Да, fsync в современных версиях ядра делает как флеш память (буферный кеш), так и дисковый аппаратный буфер для диска. Страница «Человек» говорит, что старые ядра используют только первое.

ОПИСАНИЕ FSYNC() передает («смывает») все модифицированы в активной зоне данных из (т.е. измененных страниц кэша буферов для) файл называется файл опи тор Fd на диск устройство (или другое постоянное устройство хранения ), так что вся измененная информация может быть восстановлена ​​ даже после сбоя системы или ее перезагрузки. Включает в себя запись или очистку дискового кеша, если он присутствует. Блоки вызовов до тех пор, пока устройство не сообщит о завершении передачи . Он также сбрасывает информацию метаданных, связанную с файлом (см. Stat (2)).

Реализации fsync() в старых ядрах и используются меньше filesys-tems не знает, как очистить кеш диска. В этих корпусах дисков необходимо отключить с помощью hdparm (8) или sdparm (8), чтобы гарантировать безопасную работу.

Это относится к тому, какие приложения могут запрашивать. Fsync - это интерфейс, который файловые системы предоставляют приложениям, сами файловые системы используют что-то еще под ним. Файловые системы используют барьеры или, скорее, четкие флеши и запросы FUA для фиксации журнала.Посмотрите на LWN post.

Смежные вопросы