Почему sqlite3 не работает в Amazon Elastic File System?

Когда я пытаюсь создать базу с sqlite3 в каталоге EFS, это приводит к ошибке:

$ sqlite3 foo.db SQLite version 3.7.17 2013-05-20 00:56:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .log stderr sqlite> CREATE TABLE foo (int bar); Error: disk I/O error

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

Amazon утверждает, что EFS - это «файловая система, доступная для инстансов Amazon EC2 через интерфейс файловой системы (использующий стандартные API-интерфейсы файлового ввода-вывода операционной системы) и поддерживающий полную семантику доступа к файловой системе (например, строгую согласованность и блокировку файлов) ». Таким образом, я предполагаю, что он подходит для поставленной задачи.

Варианты монтирования в /etc/fstab:

eu-west-1a.fs-ID.efs.eu-west-1.amazonaws.com:/ / efs nfs4 nfsvers = 4.1, rsize = 1048576, wsize = 1048576, hard, timeo = 600, retrans = 2 0 0

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


person Jan    schedule 06.02.2017    source источник
comment
Используйте .log stderr, чтобы получить дополнительную информацию об ошибках.   -  person CL.    schedule 06.02.2017
comment
@CL. .log stderr не дает дополнительных результатов   -  person Jan    schedule 06.02.2017
comment
Прежде чем пытаться что-либо написать.   -  person CL.    schedule 06.02.2017
comment
@CL. Я понимаю, см. Мою правку выше. Вот что я получаю.   -  person Jan    schedule 06.02.2017
comment
Обновите свой sqlite3 инструмент.   -  person CL.    schedule 06.02.2017
comment
strace процесс, чтобы увидеть, какие системные вызовы задействованы. Я заметил, что EFS использует очень большие (›32-битные) номера inode, fwiw.   -  person Michael - sqlbot    schedule 07.02.2017


Ответы (2)


Обновление (6 марта 2017 г.):

EFS теперь поддерживает обновление и понижение блокировки NFS v4.1:

https://aws.amazon.com/about-aws/whats-new/2017/03/amazon-elastic-file-system-amazon-efs-now-supports-nfsv4-lock-upgrading-and-downgrading/

Из документов:

Обновление и понижение блокировки: Amazon EFS возвращает NFS4ERR_LOCK_NOTSUPP, если клиент пытается обновить или понизить существующую блокировку.

Примечание

Поскольку обновления блокировок и более ранние версии не поддерживаются, сценарии использования, требующие этой функции, например, использующие SQLite или IPython, также не поддерживаются в Amazon EFS.

Видеть:

http://docs.aws.amazon.com/efs/latest/ug/efs-ug.pdf

а также:

http://docs.aws.amazon.com/efs/latest/ug/nfs4-unsupported-features.html

person 2tim    schedule 17.02.2017
comment
EFS теперь поддерживает обновления и понижения версии Lock. См. aws.amazon.com/about-aws/whats-new/2017/03/ - person user1071840; 09.03.2017
comment
Спасибо @ user1071840, я рад слышать это и для моего варианта использования. Я обновлю свой ответ, чтобы не сбивать с пути людей, которые его находят. - person 2tim; 09.03.2017
comment
Я все еще сталкиваюсь с этой проблемой при настройке AWS, что-нибудь особенное, что вы определили в настройке EFS / Grafana, чтобы заставить ее работать? - person koby meir; 05.09.2017
comment
Звучит как вопрос в службу поддержки AWS. - person 2tim; 11.09.2017

По умолчанию sqlite работает на "unix" VFS, которая использует неподдерживаемые обновлениями блокировки Amazon EFS. Но вы можете использовать базы данных sqlite в Amazon EFS, если измените VFS на «unix-excl», который использует эксклюзивные блокировки файлов и не требует обновлений.

Есть несколько способов указать VFS. Если вы используете командную строку, просто добавьте параметр -vfs unix-excl:

ubuntu@ip-1-1-1-1 /efs> sqlcipher foo.db -vfs unix-excl
SQLCipher version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> CREATE TABLE foo (int bar);
sqlite> .exit

Если вы используете API, вам необходимо зарегистрировать VFS перед вызовом функции open:

sqlite3_vfs_register(sqlite3_vfs_find("unix-excl"), 1);
sqlite3_open("foo.db", &db);

Если вы используете PHP PDO, то вы застряли, если только не захотите перекомпилировать расширение PHP pdo_sqlite.

person Sergey Payu    schedule 27.02.2017
comment
Полезно знать, в конце концов, можно запустить sqlite на EFS. - person Jan; 08.03.2017
comment
Возможно, но в целом все равно плохая идея: sqlite.org/howtocorrupt.html - person 2tim; 08.03.2017