Перезапуск / Авторемонт Mongodb в производстве - PullRequest
12 голосов
/ 26 ноября 2011

Чего я хочу добиться, так это иметь сценарий /etc/init.d, который более надежно запускает Mongodb, даже если он вышел из строя - он должен попытаться выполнить авторемонт, если система находится в заблокированном состоянии.

Да, я мог бы написать это сам, но я думаю, что кто-то там уже сделал это.

Я заметил, что после отказа сервера сервер Mongodb находится в состоянии, когда он не перезапускается с помощью сценария /etc/init.d/mongod. Очевидно, что файл (ы) блокировки необходимо удалить, и его нужно запустить с параметром --repair и сначала исправить --dbpath, прежде чем его можно будет успешно перезапустить. В некоторых случаях нужно также изменить владельца db-файлов на пользователя, который запускает mongodb. Еще одна проблема заключается в том, что стандартный скрипт /etc/init.d/mongod не сообщает об ошибке в этой ситуации, а скорее радостно и некорректно возвращается со статусом «ОК», сообщая, что Mongod был запущен, хотя и не был.

$ sudo /etc/init.d/mongod start
Starting mongod: forked process: 9220
all output going to: /data/mongo/log/mongod.log
                                                           [  OK  ]
$ sudo /etc/init.d/mongod status
mongod dead but subsys locked

Операционная система - CentOS или Fedora.

Кто-нибудь изменил сценарии /etc/init.d или указатель на такие сценарии, которые в такой ситуации пытаются выполнить восстановление автоматически? Или есть другой инструмент, который функционирует в качестве сторожевого устройства для Mongod?

Любые мнения о том, почему может быть плохой идеей попытаться автоматически восстановить mongodb?

$ sudo /etc/init.d/mongod status
mongod dead but subsys locked

$ sudo ls -l /var/lib/mongo/mongod.lock 
-rw-r--r--. 1 mongod mongod 5 Nov 19 11:52 /var/lib/mongo/mongod.lock


$ sudo tail -50 /data/mongo/log/mongod.log
************** 
old lock file: /data/mongo/db/mongod.lock.  probably means unclean shutdown
recommend removing file and running --repair
see: http://dochub.mongodb.org/core/repair for more information
*************
Sat Nov 19 11:55:44 exception in initAndListen std::exception: old lock file, terminating
Sat Nov 19 11:55:44 dbexit: 

Sat Nov 19 11:55:44 shutdown: going to close listening sockets...
Sat Nov 19 11:55:44 shutdown: going to flush oplog...
Sat Nov 19 11:55:44 shutdown: going to close sockets...
Sat Nov 19 11:55:44 shutdown: waiting for fs preallocator...
Sat Nov 19 11:55:44 shutdown: closing all files...
Sat Nov 19 11:55:44     closeAllFiles() finished

Sat Nov 19 11:55:44 dbexit: really exiting now

Ответы [ 2 ]

5 голосов
/ 27 ноября 2011

Итак, первое, что стоит упомянуть - это ведение журнала.Журналирование фактически объявлено как "быстрый ремонт".В 2.0+ ведение журнала включено по умолчанию, и по умолчанию выполняется это «восстановление».

Так что, если ваши диски могут справиться с дополнительной пропускной способностью записи журнала, это может решить вашу проблему.

Есть ли какие-либо мнения о том, почему может быть плохой идеей попытаться автоматически восстановить mongodb?

Проблема № 1 с автоматическим восстановлением MongoDB - просто одна из тех, которые возникли время.

Если у вас есть база данных объемом 200 ГБ, системе потребуется выполнить следующие действия при восстановлении:

  1. Выделить ~ 200 ГБ файлов ( у вас есть место на диске? )
  2. Считать все данные из существующих файлов в память (200GB read)
  3. Проверить правильность каждого документа и записать его обратно в новые файлы (200GB write)
  4. Пересоздайте все индексы (200GB reads + large number of writes)
  5. Сбросьте все на диск

Если вы посмотрите мои заметки, это серьезное перебивание диска для выполненияремонт.

Но большинство производственных установок используют наборы реплик.В этом случае вместо восстановления можно просто восстановить из резервной копии.Восстановление из резервной копии записывает данные только один раз, и это процесс, который вы уже должны выполнить.

Несмотря на то, что скрипт init.d возвращает OK, мониторинг вашей системы должен сообщить вам, что база данных не работает.

1 голос
/ 30 октября 2012

Просто хочу отметить, что ведение журнала работает в 32-битной версии.Однако он не включен по умолчанию в 32-разрядном режиме.

...