Набор реплик MongoDB SECONDARY застрял в состоянии ROLLBACK

11

Во время недавнего автоматического обновления нашего mongodb PRIMARY, когда PRIMARYон вышел из строя , он окончательно перешел в ROLLBACKсостояние.

После нескольких часов в ROLLBACKсостоянии .bsonфайл отката в rollbackкаталоге базы данных mongodb все еще не находился. Это, а также эта строка в нашем файле журнала:, [rsSync] replSet syncThread: 13410 replSet too much data to roll backпохоже, указывают на то, что ROLLBACKпроцесс завершился неудачно.

Я хотел бы помочь с анализом, что именно пошло не так.

  • Похоже, два разных отката произошли в наших журналах. Это тот случай или это заняло 3 часа?
  • Если первый откат (в 19:00) прошел успешно, почему ничего не появилось в rollbackкаталоге ou ?
  • Есть предположения относительно причины всех этих предупреждений? Может ли это быть связано с ошибкой отката?
  • Мы потеряли 18 секунд данных из-за первого ROLLBACK?
  • Есть ли общее решение проблемы «застрял в ROLLBACKсостоянии»? В итоге нам пришлось подключить всю базу данных и выполнить повторную синхронизацию с основной.

Соответствующие строки журнала:

# Primary coming back after restart...
Tue May 15 19:01:01 [initandlisten] MongoDB starting : pid=3684 port=27017 dbpath=/var/lib/mongodb 64-bit host=magnesium
Tue May 15 19:01:01 [initandlisten] db version v2.0.5, pdfile version 4.5
# ... init stuff
Tue May 15 19:01:01 [initandlisten] journal dir=/var/lib/mongodb/journal
Tue May 15 19:01:01 [initandlisten] recover : no journal files present, no recovery needed
# ... More init stuff
Tue May 15 19:01:03 [rsStart] trying to contact rs1arb1.c9w.co:27017
Tue May 15 19:01:03 [rsStart] trying to contact rs1m2.c9w.co:27017
Tue May 15 19:01:03 [rsStart] replSet STARTUP2
Tue May 15 19:01:03 [rsHealthPoll] replSet member rs1arb1.c9w.co:27017 is up
Tue May 15 19:01:03 [rsHealthPoll] replSet member rs1arb1.c9w.co:27017 is now in state ARBITER
Tue May 15 19:01:03 [rsSync] replSet SECONDARY
Tue May 15 19:01:05 [rsHealthPoll] replSet member rs1m2.c9w.co:27017 is up
Tue May 15 19:01:05 [rsHealthPoll] replSet member rs1m2.c9w.co:27017 is now in state PRIMARY
Tue May 15 19:01:09 [rsSync] replSet syncing to: rs1m2.c9w.co:27017
Tue May 15 19:01:09 [rsSync] replSet our last op time written: May 15 19:00:51:6
Tue May 15 19:01:09 [rsSync] replSet rollback 0
Tue May 15 19:01:09 [rsSync] replSet ROLLBACK
Tue May 15 19:01:09 [rsSync] replSet rollback 1
Tue May 15 19:01:09 [rsSync] replSet rollback 2 FindCommonPoint
Tue May 15 19:01:09 [rsSync] replSet info rollback our last optime:   May 15 19:00:51:6
Tue May 15 19:01:09 [rsSync] replSet info rollback their last optime: May 15 19:01:09:19
Tue May 15 19:01:09 [rsSync] replSet info rollback diff in end of log times: -18 seconds
Tue May 15 19:01:10 [rsSync] replSet WARNING ignoring op on rollback no _id TODO : nimbus.system.indexes { ts: Timestamp 1337108400000|17, h: 1628369028235805797, op: "i", ns: "nimbus.system.indexes", o: { unique: true, name: "pascalquery_ns_key_start_ts_keyvals", key: { __ns__: 1, _key: 1, start_ts: 1, _keyval.a: 1, _keyval.b: 1, _keyval.c: 1, _keyval.d: 1, _keyval.e: 1, _keyval.f: 1, _keyval.g: 1, _keyval.h: 1 }, ns: "nimbus.wifi_daily_series", background: true } }
# ...
# Then for several minutes there are similar warnings
# ...
Tue May 15 19:03:52 [rsSync] replSet WARNING ignoring op on rollback no _id TODO : nimbus.system.indexes { ts: Timestamp 1337097600000|204, h: -3526710968279064473, op: "i", ns: "nimbus.system.indexes", o: { unique: true, name: "pascalquery_ns_key_start_ts_keyvals", key: { __ns__: 1, _key: 1, start_ts: 1, _keyval.a: 1, _keyval.b: 1, _keyval.c: 1, _keyval.d: 1, _keyval.e: 1, _keyval.f: 1, _keyval.g: 1, _keyval.h: 1 }, ns: "nimbus.wifi_daily_series", background: true } }
Tue May 15 19:03:54 [rsSync] replSet rollback found matching events at May 15 15:59:13:181
Tue May 15 19:03:54 [rsSync] replSet rollback findcommonpoint scanned : 6472020
Tue May 15 19:03:54 [rsSync] replSet replSet rollback 3 fixup

Потом позже по какой-то причине происходит очередной откат ...

Tue May 15 22:14:24 [rsSync] replSet rollback re-get objects: 13410 replSet too much data to roll back
Tue May 15 22:14:26 [rsSync] replSet syncThread: 13410 replSet too much data to roll back
Tue May 15 22:14:37 [rsSync] replSet syncing to: rs1m2.c9w.co:27017
Tue May 15 22:14:37 [rsSync] replSet syncThread: 13106 nextSafe(): { $err: "capped cursor overrun during query: local.oplog.rs", code: 13338 }
Tue May 15 22:14:48 [rsSync] replSet syncing to: rs1m2.c9w.co:27017
Tue May 15 22:15:30 [rsSync] replSet our last op time written: May 15 19:00:51:6
Tue May 15 22:15:30 [rsSync] replSet rollback 0
Tue May 15 22:15:30 [rsSync] replSet rollback 1
Tue May 15 22:15:30 [rsSync] replSet rollback 2 FindCommonPoint
Tue May 15 22:15:30 [rsSync] replSet info rollback our last optime:   May 15 19:00:51:6
Tue May 15 22:15:30 [rsSync] replSet info rollback their last optime: May 15 22:15:30:9
Tue May 15 22:15:30 [rsSync] replSet info rollback diff in end of log times: -11679 seconds
# More warnings matching the above warnings
Tue May 15 22:17:30 [rsSync] replSet rollback found matching events at May 15 15:59:13:181
Tue May 15 22:17:30 [rsSync] replSet rollback findcommonpoint scanned : 7628640
Tue May 15 22:17:30 [rsSync] replSet replSet rollback 3 fixup

Единственная полезная информация о откате, которую я нашел, - это эти заметки, которые не относятся к ситуации «застрял в откате». http://www.mongodb.org/display/DOCS/Replica+Sets+-+Rollbacks http://www.snailinaturtleneck.com/blog/2011/01/19/how-to-use-replica-set-rollbacks/

Крис У.
источник
Вы проверяли запись-беспокойство? docs.mongodb.com/manual/core/replica-set-write-concern/…
Озма

Ответы:

7

Когда экземпляр MongoDB переходит в состояние отката, а данные отката превышают 300 МБ данных, вы должны вмешаться вручную. Он будет оставаться в состоянии отката до тех пор, пока вы не предпримете действия по сохранению / удалению / перемещению этих данных, затем (теперь вторичные) должны быть повторно синхронизированы, чтобы привести их в соответствие с первичными. Это не обязательно полная ресинхронизация, но это самый простой способ.

Многочисленные откаты являются скорее симптомом, чем причиной проблемы. Откат происходит только тогда, когда вторичный сервер, который не был синхронизирован (из-за задержки или из-за проблемы с репликацией), становится первичным и выполняет записи. Итак, проблемы, которые вызывают это, в первую очередь, - это то, о чем нужно позаботиться - сам откат - это то, с чем вам нужно иметь дело как администратору - существует слишком много потенциальных ловушек для MongoDB для автоматического согласования данных.

Если вы хотите смоделировать это снова для целей тестирования, я обрисовал в общих чертах, как это сделать здесь:

http://comerford.cc/2012/05/28/simulating-rollback-on-mongodb/

В конечном итоге эти данные будут храниться в коллекции (в локальной БД), а не выгружаться на диск, что предоставит возможности для более эффективного обращения с ними:

https://jira.mongodb.org/browse/SERVER-4375

Однако в данный момент, как только вы обнаружили откат, требуется ручное вмешательство.

Наконец, руководство содержит информацию, похожую на блог Кристины:

https://docs.mongodb.com/manual/core/replica-set-rollbacks

Адам С
источник
2

«Решение», которое мы в итоге использовали, заключалось в том, что мы полностью теряли нашу базу данных на машине, которая зависла в ROLLBACKрежиме, и позволяли вновь отключенным средствам SECONDARYвыполнять повторную синхронизацию с мастером. Это кажется неоптимальным решением, потому что, насколько я могу судить, у нас все еще было достаточно места, oplogтак что теоретически машины должны были быть в состоянии синхронизироваться.

Надеюсь, кто-нибудь придумает лучший ответ на это.

Крис У.
источник
Спасибо, что сообщили нам о том, что вы сделали. Если вы найдете больше информации об этом, вернитесь и обновите свой ответ (или предоставьте другой).
Ник Чаммас