当我尝试在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使用的语言,开发人员将继续尝试。
答案 0 :(得分:5)
更新(2017年3月6日):
EFS现在支持NFS v4.1锁定升级和降级:
来自文档:
锁定升级和降级: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扩展。