背景:
Vagrant (http://vagrantup.com/) を使用して、開発用の仮想マシンを作成しています。Buildout という Python ビルド システムを使用して、プロジェクトの管理とビルドを行っています。MongoDB をインストールして構成する Buildout レシピを使用します。MongoDB データをプロジェクト内のディレクトリに配置します。仮想マシンを使用していない場合、これはすべて正常に機能します。Vagrant は、ソース コード リポジトリがホスト マシン上に存在し、NFS を介して仮想マシンによってアクセスされるようにセットアップされます。
やりたいこと:
mongod を vagrant ユーザーとして (ゲスト OS で) 実行し、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 操作が許可されていません」に失敗します。これは、最初はファイルのパーミッションが間違っていることを示唆しています。データディレクトリがグループ書き込み可能であり、vagrant が NFS 共有のグループ所有者であるグループ「dialout」に属しているため、そうではないと思います。私の 2 番目の推測は、NFS が原因であるということでした。NFS ではないファイル システムでこのコマンドを実行すると、すべて問題ありません。何が悪いのかわかりません。MongoDB メーリング リストを検索したところ、データ ディレクトリが動作しない場合、NFS は MongoDB で動作しないというメッセージ ( http://groups.google.com/group/mongodb-user/browse_thread/thread/4129325d3a9a3237 ) が見つかりました。排他ロックをサポートします。
考えられる解決策:
NFS 以外の場所にあるデータ ディレクトリを指すシンボリック リンクをリポジトリに配置します。
- これが私が現在行っていることです。Buildout レシピでは機能せず、手動で行う必要があるため、あまり良くありません。
- Buildout が仮想マシンで実行されているかどうかを判断する簡単な方法はありません。ファイル システムが NFS であるかどうかを検出し、それに応じて動作するようにスクリプト化できるのでしょうか?
- プロジェクトのコンポーネントが別の場所にあるのは少し面倒です。それどころか、Postgres データは別の場所にあるので、MongoDB データも別の場所に置いてみませんか?
質問:
- 表示されているエラーは実際に NFS に関連していますか? それとも別の原因が考えられますか?
- 排他ロックは NFS の機能ですか? 有効/無効にできますか?
- MongoDB メーリング リストで、人々が NFS 上で MongoDB を実行しているというレポートを読みました。これを行うために必要な特別な考慮事項はありますか?