2014-09-16 3 views
4

Недавно я много читал о MongoDB, но одна тема, на которую я не могу найти никакого ясного материала, заключается в том, как данные записываются в журнал и oplog.MongoDB Процессы записи и блокировки

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

  • Клиент подключения к mongod и выполняет запись. Запись сохраняется в буфере сокета
  • Когда Mongo доступен (не уверен, какие доступные средства на данный момент), данные записываются в журнал?
  • Документы mongoDB затем говорят, что каждые 60 секунд записи сбрасываются из журнала на диск. Под этим я могу только предположить, что это среднее значение написано на первичной и отплодной. Если это так, то как писать появляются раньше, чем интервал синхронизации 60 секунд?
  • Спустя некоторое время второстепенные сосут данные из первичного источника или источника синхронизации и обновляют их oplog и базы данных. Кажется очень смутным, когда это происходит и что это задерживает.

Мне также интересно, если журналирование отключено (я понимаю, что это действительно плохая идея), в какой момент обновляется oplog и база данных?

Наконец-то я немного надуман, в каких точках в этом процессе создаются блокировки записи. Это просто, когда база данных и oplog обновлены или в другое время тоже?

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

Simon

ответ

4

Вот что происходит, насколько я понимаю. Я немного упростил, но должен четко прояснить, как это работает.

  1. Клиент подключается к mongo. Никаких записей до сих пор нет, и никакое соединение не срывается, потому что это действительно зависит от беспокойства о записи, что происходит сейчас. Предположим, что мы идем с (по моменту написания) по умолчанию «признано».
  2. Клиент отправляет операцию записи. Вот где я действительно не уверен. Либо после этого, либо следующего подтверждения подтверждение отправляется драйверу.
  3. Операция записи выполняется через оптимизатор запросов. Именно здесь отправляется подтверждение, потому что если в подтвержденной проблеме записи вам может быть возвращена повторяющаяся ошибка ключа. Возможно, это было проверено на последнем шаге. Если бы я сделал ставку, я бы сказал, что это после этого.
  4. Выход оптимизатора запросов затем применяется к данным в памяти Собственно к данным памяти отображаются файлы данных, в памяти отображается oplog и память журнала отображаются файлы. Запросы отвечают из этих отображенных в памяти частей, или соответствующие данные сопоставляются с памятью для ответа на запрос. Кроме того, oplog считывается из памяти.
  5. Каждые 100 мс в общем случае журнал синхронизируется с диском. Точное значение определяется рядом факторов, одним из которых является journalCommitInterval configuration parameter. Если у вас есть проблемы с записью журнала, драйвер будет уведомлен сейчас.
  6. Каждые syncDelay секунд, то ток состояние памяти отображаются файлы синхронизируются на диск Я думаю, что журнал усекается до записей, которые не были применены к данным еще, но я не слишком уверен в том, что так как в принципе никогда не бывает, чтобы данные в журнале еще не применялись к текущим данным.

Если вы внимательно прочитали, вы заметили, что данные готовы к использованию oplog уже в процессе выполнения оптимизатора запросов и применяются к файлам, отображаемым в память. Когда запись oplog вытягивается одним из второстепенных, она немедленно применяется к ее данным файлов с отображением памяти и синхронизируется на диске так же, как и на первичной.

Некоторые примечания: Как только относительно небольшие данные записываются в журнал, это совершенно безопасно. Если узел идет между двумя синхронизациями в файлы данных, как файлы данных, так и oplog можно восстановить из своего последнего состояния в файлах данных и журнале. В общем случае максимальная потеря данных, которую вы можете получить, - это операции, записанные в журнал после последнего фиксации, 50 мс в медианной форме.

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

Запись замков на уровне файловой системы создается один раз, хотя и неявно, iirc. Во время запуска приложения в корневом каталоге dbpath создается файл блокировки. Любой другой экземпляр mongod откажется выполнять какую-либо операцию над этими файлами данных, пока существует действительная блокировка. И вы не должны:)

Надеюсь, это поможет.

+0

Спасибо за информативный ответ, я был так занят, чтобы даже ответить. Приятно знать, что я не единственный, кто не совсем понимает этот процесс. Я думаю, что я понимаю вас, но, чтобы подтвердить, вы говорите, что все данные изначально записываются в память, а затем каждые 100 мс (или независимо от того, на что он настроен) журнал записывается на диск. Затем каждые секунды SyncDelay записываются данные oplog и базы данных на диск. –

+0

Это имеет смысл, но моя проблема заключается в том, что если данные будут удалены из памяти до того, как они будут синхронизированы с диском. Значит ли это, что изменения не будут синхронизированы? Журнал будет по-прежнему находиться на диске (синхронизация каждые 100 мс), поэтому это может быть воспроизведено, если отсутствует в памяти. Тем не менее, если память упала, данные все равно могут отсутствовать до тех пор, пока журнал не будет воспроизведен в секундах syncDelay. Вы знаете, есть ли у Монго способ борьбы с этим? Спасибо за советы по замкам тоже, что определенно прояснилось. –

+0

Нет такой вещи, как 100% -ная безопасность. Если данные находятся только в памяти, а сервер терпит неудачу, данные будут потеряны. Если вам нужно что-то, уменьшающее вероятность того, что это произойдет, вы должны установить проблему записи w> 1 или большинства и иметь географически распределенные члены набора реплик. –

Смежные вопросы