Jan*_*Jan 3 linux sqlite nfs amazon-web-services
当我尝试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数据库应仅用于故事元数据,并且不经常更新.不需要并发访问.但是,如果创建数据库的进程终止,则需要在不同的主机上重新启动该进程,并继续执行先前实例退出的位置.
亚马逊声称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
据我所知,通常不鼓励将数据库放在NFS上.但是,我相信,鉴于亚马逊和SQLite使用的语言,开发人员将继续尝试.
更新(2017年3月6日):
EFS现在支持NFS v4.1锁定升级和降级:
来自文档:
锁定升级和降级:如果客户端尝试升级或降级现有锁定,则Amazon EFS将返回NFS4ERR_LOCK_NOTSUPP.
注意
由于不支持锁升级和降级,因此Amazon EFS也不支持需要此功能的用例,例如使用SQLite或IPython的用例.
看到:
http://docs.aws.amazon.com/efs/latest/ug/efs-ug.pdf
并且:
http://docs.aws.amazon.com/efs/latest/ug/nfs4-unsupported-features.html
默认情况下,sqlite 在“unix” VFS上运行,该 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
Run Code Online (Sandbox Code Playgroud)
如果从 API 使用,则需要在调用 open 函数之前注册 VFS:
sqlite3_vfs_register(sqlite3_vfs_find("unix-excl"), 1);
sqlite3_open("foo.db", &db);
Run Code Online (Sandbox Code Playgroud)
如果使用 PHP PDO,那么你就会陷入困境,除非你愿意重新编译 pdo_sqlite PHP 扩展。