背景:
我使用 Vagrant (http://vagrantup.com/) 创建一个用于开发的虚拟机。我使用名为 Buildout 的 Python 构建系统来管理和构建我的项目。我使用安装和配置 MongoDB 的 Buildout 配方。它将 MongoDB 数据放入项目中的目录中。当不使用虚拟机时,这一切都很好。Vagrant 已设置为源代码存储库存在于主机上,并由虚拟机通过 NFS 访问。
我想做什么:
我想以流浪用户(在来宾操作系统中)运行 mongod,并在 NFS 共享中拥有数据目录。尝试像这样启动服务器会导致错误:
vagrant@natty:/nfs_share$ bin/mongod --dbpath /nfs_share/mongodb/data --master --port 27001 --directoryperdb -vvvvv
Thu Oct 13 18:30:38 isInRangeTest passed
Thu Oct 13 18:30:38 shardKeyTest passed
Thu Oct 13 18:30:38 shardObjTest passed
Thu Oct 13 18:30:38 must specify both start and end of balancing window: { start: 1 }
Thu Oct 13 18:30:38 must specify both start and end of balancing window: { stop: 1 }
Thu Oct 13 18:30:38 cannot parse active window (use hh:mm 24hs format): { start: "21:30", stop: "28:35" }
Thu Oct 13 18:30:38 BalancingWidowObjTest passed
Thu Oct 13 18:30:38 BackgroundJob starting: DataFileSync
Thu Oct 13 18:30:38 versionCmpTest passed
Thu Oct 13 18:30:38 [initandlisten] MongoDB starting : pid=3240 port=27001 dbpath=/nfs_share/mongodb/data master=1 64-bit
Thu Oct 13 18:30:38 [initandlisten] db version v1.8.1, pdfile version 4.5
Thu Oct 13 18:30:38 [initandlisten] git version: a429cd4f535b2499cc4130b06ff7c26f41c00f04
Thu Oct 13 18:30:38 [initandlisten] build sys info: Linux bs-linux64.10gen.cc 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_41
Thu Oct 13 18:30:39 [initandlisten] query: local.system.namespaces{ name: /^local.temp./ }
Thu Oct 13 18:30:39 [initandlisten] Accessing: local for the first time
Thu Oct 13 18:30:39 [initandlisten] used cursor: 0x182e180
Thu Oct 13 18:30:39 [initandlisten] query local.system.namespaces reslen:36 nreturned:0 1ms
Thu Oct 13 18:30:39 [initandlisten] enter repairDatabases (to check pdfile version #)
Thu Oct 13 18:30:39 [initandlisten] done repairDatabases
Thu Oct 13 18:30:39 [initandlisten] waiting for connections on port 27001
Thu Oct 13 18:30:39 [initandlisten] master=true
Thu Oct 13 18:30:39 [initandlisten] ******
Thu Oct 13 18:30:39 [initandlisten] creating replication oplog of size: 944MB...
Thu Oct 13 18:30:39 [initandlisten] create collection local.oplog.$main { size: 990000000.0, capped: true, autoIndexId: false }
Thu Oct 13 18:30:39 [FileAllocator] allocating new datafile /nfs_share/mongodb/data/local/local.ns, filling with zeroes...
Thu Oct 13 18:30:39 [FileAllocator] warning: posix_fadvise fails /nfs_share/mongodb/data/local/local.ns errno:1 Operation not permitted
Thu Oct 13 18:30:39 [FileAllocator] FileAllocator: posix_fallocate failed: errno:9 Bad file descriptor falling back
Thu Oct 13 18:30:39 [FileAllocator] error failed to allocate new file: /nfs_share/mongodb/data/local/local.ns size: 16777216 errno:9 Bad file descriptor
Thu Oct 13 18:30:39 [initandlisten] New namespace: local.oplog.$main
New namespace: local.system.namespaces
Assertion: 12520:new file allocation failure
Thu Oct 13 18:30:39 [initandlisten] exception in initAndListen std::exception: new file allocation failure, terminating
Thu Oct 13 18:30:39 dbexit:
Thu Oct 13 18:30:39 [initandlisten] shutdown: going to close listening sockets...
Thu Oct 13 18:30:39 [initandlisten] shutdown: going to flush diaglog...
Thu Oct 13 18:30:39 [initandlisten] shutdown: going to close sockets...
Thu Oct 13 18:30:39 [initandlisten] shutdown: waiting for fs preallocator...
Thu Oct 13 18:30:39 [initandlisten] shutdown: closing all files...
Thu Oct 13 18:30:39 closeAllFiles() finished
Thu Oct 13 18:30:39 [initandlisten] shutdown: removing fs lock...
Thu Oct 13 18:30:39 BackgroundJob starting: ClientCursorMonitor
Thu Oct 13 18:30:39 BackgroundJob starting: snapshot
Thu Oct 13 18:30:39 dbexit: really exiting now
mongod 无法创建数据文件。错误消息是“警告:posix_fadvise 失败 /nfs_share/mongodb/data/local/local.ns errno:1 Operation not allowed”。这最初表明文件权限是错误的。我不认为它们是因为数据目录是组可写的,而 vagrant 在组“dialout”中,该组是 NFS 共享的组所有者。我的第二个猜测是 NFS 是罪魁祸首。当我在不是 NFS 的文件系统上运行此命令时,一切正常。我不确定出了什么问题。在 MongoDB 邮件列表上的搜索发现了一条消息 ( http://groups.google.com/group/mongodb-user/browse_thread/thread/4129325d3a9a3237 ),有人说如果数据目录不支持,NFS 将无法与 MongoDB 一起工作。 t 支持排他锁。
可能的解决方案:
在存储库中放置一个符号链接,指向非 NFS 位置的数据目录
- 这就是我目前正在做的事情。这不是很好,因为它不适用于 Buildout 配方,必须手动完成。
- 没有简单的方法可以确定 Buildout 是否在虚拟机中运行。也许它可以检测文件系统是否为 NFS 并被编写相应的脚本?
- 将项目的组件放在不同的地方有点烦人。相反,Postgres 数据在别处,为什么不把 MongoDB 数据也放在别处呢?
问题:
- 我看到的错误实际上与 NFS 有关吗?还是有其他可能的原因?
- 排他锁是 NFS 的一个特性吗?可以启用/禁用吗?
- 我在 MongoDB 邮件列表上阅读了有关人们在 NFS 上运行 MongoDB 的报告。是否有任何特殊考虑需要这样做?