MongoDB не может выделить файлы данных в общей папке NFS - PullRequest
3 голосов
/ 14 октября 2011

Справочная информация:
Я использую Vagrant (http://vagrantup.com/) для создания виртуальной машины для разработки. Я использую систему сборки Python под названием Buildout для управления и сборки моего проекта. Я использую рецепт Buildout, который устанавливает и настраивает MongoDB. Он помещает данные 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 Операция не разрешена» . Это изначально предполагает, что права доступа к файлу неверны. Я не думаю, что это потому, что каталог данных доступен для записи в группу, а vagrant находится в группе «dialout», которая является владельцем группы общего ресурса NFS. Мое второе предположение было то, что NFS был виноват. Когда я запускаю эту команду в файловой системе, которая не является NFS, все хорошо. Я не уверен, что не так. Поиск в списке рассылки MongoDB обнаружил сообщение (http://groups.google.com/group/mongodb-user/browse_thread/thread/4129325d3a9a3237) от того, что кто-то сказал, что NFS не будет работать с MongoDB, если каталог данных не поддерживает эксклюзивную блокировку.

Возможное решение:
Поместите символическую ссылку в хранилище, которая указывает на каталог данных в расположении, отличном от NFS

  • Это то, чем я сейчас занимаюсь. Это не очень хорошо, потому что это не работает с рецептом Buildout и должно быть сделано вручную.
  • Нет простого способа определить, работает ли Buildout на виртуальной машине. Может быть, он может определить, является ли файловая система NFS, и записать в сценарий, чтобы он действовал соответствующим образом?
  • Немного раздражает наличие компонентов проекта в разных местах. Напротив, данные Postgres находятся в другом месте, так почему бы не поместить данные MongoDB также в другое место?

Вопросы:

  • Ошибка, с которой я сталкиваюсь, связана с NFS? Или есть другая возможная причина?
  • Является ли эксклюзивная блокировка функцией NFS? Это можно включить / отключить?
  • Я прочитал в списке рассылки MongoDB отчеты о том, что люди запускали MongoDB в NFS. Нужно ли особое внимание, чтобы сделать это?
...