Какие сетевые файловые системы не обеспечивают правильную блокировку?


8

В качестве распространенной причины повреждения файлов в документации часто указывается причина «NFS, которая неправильно реализует блокировку на уровне файлов» или что-то подобное, например, для SQLite:

Как повредить файл базы данных SQLite , пункт 2.1

2.1 Файловые системы со сломанными или отсутствующими реализациями блокировок

SQLite зависит от базовой файловой системы, чтобы сделать блокировку, как указано в документации. Но некоторые файловые системы содержат ошибки в своей логике блокировки, так что блокировки не всегда ведут себя так, как объявлено. Это особенно верно для сетевых файловых систем и NFS в частности. Если SQLite используется в файловой системе, где блокирующие примитивы содержат ошибки, и если два или более потоков или процессов пытаются получить доступ к одной и той же базе данных одновременно, это может привести к повреждению базы данных.

Об этом - или о чем-то подобном - часто упоминалось уже более десяти лет, обычно в смешанных средах Windows / Unix. Однако я никогда не обнаруживал никаких признаков того, какие сетевые файловые системы (или комбинации клиент / сервер) действительно находятся под угрозой.

Что я могу сказать своим клиентам?


1
Дело не столько в файловой системе, сколько в протоколе общего доступа (несмотря на название, NFS не файловая система). Samba выполняет блокировку записи.
Фрэнк Томас

так что это будет проблемой между определенными клиентами / серверами?
peterchen

ну, это проблема с сервером. но ты в основном прав. NFS должна информировать любую существующую файловую систему, чтобы реализовать блокировку при открытии файла для записи. эта файловая система может быть EXT, BTRFS, MurderFS, NTFS или любой другой. Все FS должны иметь дело с блокировкой записи, но протокол совместного использования отвечает за посредничество между запросом сети и семантикой, специфичной для файловой системы. к сожалению, NFS, кажется, не делает это хорошо. Я не уверен, почему, но я бы предположил, что это проблема с тем, как он абстрагируется от реальных операций FS.
Фрэнк Томас

Ответы:


2

Какие сетевые файловые системы не обеспечивают правильную блокировку?

Считаю, что правильный ответ вкратце: «Все они».

Это должно учитываться в контексте нескольких процессов на нескольких компьютерах, обращающихся к одной и той же базе данных по сети. Не должно возникнуть проблем, когда все процессы, обращающиеся к базе данных, выполняются на одном компьютере, если ядро ​​базы данных (SQLite) использует инструменты исключения, такие как семафоры или мьютекс (и использует их правильно ...).

Причина этого заключается в том, что информация о том, что заблокировано, обычно хранится в контексте «процесса X блокирует Y». Это может очень хорошо работать, когда все процессы выполняются на одном компьютере, но не очень хорошо, когда они находятся на разных компьютерах.

Когда процесс с одного компьютера получает доступ к файлу на другом компьютере, локальная операционная система заменяет собой удаленный процесс, фактически работая агентом для процесса, о котором он ничего не знает. У него могут даже быть трудности в различении двух разных процессов, выполняющихся на одном и том же удаленном компьютере, и они ошибочно принимают один за другим.

Для правильной блокировки файлов, всего файла или его части, действительно потребуется одна операционная система, которая выполняется на всех задействованных компьютерах с централизованным хранилищем данных для блокировки файлов. К сожалению, ни Linux, ни Windows не могут сделать это в общем случае.

Лучшее соглашение по теме SQLite можно найти в разделе «Как повредить файлы базы данных» в предыдущей статье « Блокировка и параллелизм файлов в SQLite версии 3» . Это подробности, которые системные вызовы SQLite используют для обеспечения параллелизма в Windows и Linux как для блокировки файловых секций, так и для сброса обновленных данных с компьютера в базу данных. Все перечисленные функции будут хорошо работать только в контексте одного компьютера. Соответственно, эта статья содержит предложение «Ваша лучшая защита - не использовать SQLite для файлов в сетевой файловой системе».

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

Некоторые дополнительные сведения можно найти в статье SQLite « Атомная фиксация в SQLite» , раздел « Что может пойти не так» . Это добавляет случай, когда разные процессы и компьютеры могут использовать разные механизмы блокировки, когда один не блокирует другой.

В системах управления базами данных, которые решили эту проблему, таких как Oracle или SQL Server, решение состоит в том, чтобы назначить один конкретный компьютер единственным, который может обновлять базу данных, поэтому блокировка значительно упрощается. Другие компьютерные сетевые системы, такие как Apache Hadoop, предоставляют собственные механизмы блокировки для решения этих проблем.

Еще одна интересная статья - « О сломанности блокировки файлов» .


Ты побил меня этим, сказав "Все они". И ваши ссылки очень информативны. Гораздо более обширный ответ, чем я бы дал сам.
Тонни

Это можно сделать ... но вам нужно что-то действительно тяжелое, например распределенная служба блокировки Paxos . Конечно, не такая вещь, как обычная сетевая файловая система потребительского уровня.
Кевин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.