为什么sqlite3无法在Amazon Elastic File System上运行?

时间:2017-02-06 14:31:27

标签: linux amazon-web-services sqlite nfs

当我尝试在EFS目录上创建一个sqlite3的基础时,会导致错误:

$ 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数据库应仅用于故事元数据,并且不经常更新。不需要并发访问。但是,如果创建数据库的进程终止,则需要在不同的主机上重新启动该进程,并继续执行先前实例退出的位置。

亚马逊声称EFS是一个“可通过文件系统接口(使用标准操作系统文件I / O API)访问Amazon EC2实例并且支持完整文件系统访问语义的文件系统(例如强一致性和文件锁定。)“因此,我认为它适合手头的任务。

/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

我理解it is often generally discouraged to put databases on NFS。但是,我相信,鉴于亚马逊和SQLite使用的语言,开发人员将继续尝试。

2 个答案:

答案 0 :(得分:5)

更新(2017年3月6日):

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

答案 1 :(得分:1)

默认情况下,sqlite在“unix”VFS上运行,它使用不受Amazon EFS锁升级支持。但是,如果将VFS更改为“unix-excl”(使用独占文件锁并且不需要升级),则可以在Amazon EFS上使用sqlite数据库。

有几种方法可以指定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中使用,则需要在调用open function之前注册VFS:

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

如果使用PHP PDO,那么你会被卡住,除非你愿意重新编译pdo_sqlite PHP扩展。