Как обеспечить безопасную синхронизацию файлов с sqlite и NFS

Недавно я преобразовал формат файла рабочей области для своего приложения в sqlite. Чтобы обеспечить надежную работу NFS, я использовал общую политику обновления, я делаю все модификации копии, хранящейся во временном месте на локальном жестком диске. Только при сохранении я изменяю исходный файл (возможно, в NFS), копируя исходный файл с временным файлом. Я открываю исходный файл только для того, чтобы сохранить на нем эксклюзивную блокировку, поэтому, если кто-то другой попытается открыть его, он будет предупрежден, что его использует кто-то другой.

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

Я могу придумать несколько способов обойти это:

(1) заключается в том, чтобы просто сбросить содержимое temp в оригинал с помощью sql, т. е. удалить таблицы в оригинале, очистить оригинал, выбрать из temp и вставить в оригинал. Однако мне не нравится выполнять операции sql с файлом sqlite, хранящимся в NFS. Это пугает меня проблемами с коррупцией. Прав ли я, думая так?

(2) Используйте различные дополнительные файлы, чтобы действовать как охранник, чтобы предотвратить вход других при копировании временного файла поверх оригинала. Использование файлов в качестве мьютекса в лучшем случае проблематично. Мне также не нравится идея наличия лишних файлов в случае сбоя приложения.

Мне интересно, есть ли у кого-нибудь другие решения для этого. Снова скопировать временный файл поверх исходного файла, при этом гарантируя, что другое приложение не проникнет и не захватит исходный файл при этом?

Я использую python2.5, sqlalchemy 0.6.6 и sqlite 3.6.20.

Спасибо, Дин


person Sandstone    schedule 18.02.2011    source источник


Ответы (1)


Проблемы с SQLite NFS связаны с неработающим кэшированием и блокировкой. Если ваш процесс единственный, кто обращается к файлу в NFS, все будет в порядке.

API резервного копирования SQLite был разработан именно для решения вашей проблемы. Вы можете выполнить резервное копирование непосредственно в базу данных NFS или в другой локальный временный файл, а затем скопировать его. API резервного копирования решает все проблемы блокировки и параллелизма.

Вы можете использовать APSW, чтобы получить доступ к API резервного копирования или самой последней версии pysqlite. (Раскрытие информации: я автор APSW.)

person Roger Binns    schedule 23.02.2011
comment
Спасибо, Роджер, я не знал об этом API. После прочтения документов sqlite api у меня остался вопрос, на который, надеюсь, вы сможете ответить. В моем приложении я блокирую исходный файл с помощью PRAGMA main.locking_mode=EXCLUSIVE, а затем копирую во временный файл, где я выполняю все свои операции. Я блокирую оригинал, поэтому, если появляется другое приложение, пользователю может быть показано сообщение об ошибке, что файл используется кем-то другим. Мои вопросы: нужно ли снимать блокировку исходного файла, чтобы начать резервное копирование? Это означает, что будет небольшое окно, в котором второе приложение может проникнуть и заблокировать файл из первого. - person Sandstone; 24.02.2011
comment
Выполнение резервного копирования блокирует только место назначения и источник во время копирования страниц. Вы можете скопировать все страницы сразу или скопировать меньшую часть, чтобы предоставить другим доступ к базе данных. Процесс копирования будет правильно обрабатывать другие средства доступа, вносящие изменения (или нет). - person Roger Binns; 26.02.2011