2015-11-16 2 views
8

В режиме реплики каждая операция записи в любую коллекцию в любой БД также записывается в коллекцию oplog.MongoDB 3.0 запись блокировки на сбор oplog в режиме реплики

Теперь, когда вы пишете несколько БД параллельно, все эти операции записи также записываются в oplog. Мой вопрос: нужны ли эти операции записи для блокировки oplog? (Я использую w: 1). Если это так, это похоже на глобальную блокировку между всеми операциями записи ко всем различным БД, не так ли?

Буду рад получить любые намеки на это.

ответ

4

В соответствии с documentation в репликации, когда MongoDB записывает в коллекцию на первичной основе, MongoDB также записывает в oplog первичного элемента, который является специальной коллекцией в локальной базе данных. Поэтому MongoDB должен блокировать базу данных коллекции и локальную базу данных. Mongod должен одновременно блокировать обе базы данных, чтобы поддерживать целостность базы данных и гарантировать, что операции записи, даже с репликацией, являются операциями «все или ничего».

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

+0

Хм, я прочитал документы, но я до сих пор не могу в это поверить. Поскольку записи oplog являются идемпотентными, и база данных заблокирована в приложении, на самом деле не было бы необходимости в этом ... Я действительно не понимаю. –

+1

Это сообщение в блоге также стоит прочитать. Автор столкнулся с этой «глобальной блокировкой» при разработке метрической системы реального времени. – Jaco

+1

Забыл добавить ссылку: ссылка: http: //daprlabs.com/blog/blog/2014/04/19/mongodb/. Обратите внимание, что блоггер работает для Microsoft, и некоторые его выводы кажутся несколько предвзятыми. – Jaco

3

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

Зачем им это?

  1. Предпосылка: Базы данных, по определению, не связаны между собой
  2. oplog entries are always idempotent
  3. Oplog является capped collection, with a guarantee of preserving the insert order

Давайте предположим, что истинный параллелизм запросов применяется. Итак, у нас есть два запроса, поступающих в одно и то же время, и нам нужно будет решить, какой из них нужно сначала вставить в oplog. Первый, берущий замок, напишет первым, верно? Кроме того, есть проблема. Предположим, что первый запрос является простым db.collection.update({_id:"foo"},{$set:{"bar":"baz"}}), в то время как другой запрос является более сложным, и поэтому для проверки правильности требуется больше времени. Таким образом, чтобы предотвратить это, замок должен был быть сделан по прибытии и выпущен после записи записи idempotent oplog.

Вот где я должен полагаться на моей памяти

Однако запросы не применяются параллельно. Запросы поставлены в очередь и оцениваются в порядке поступления. База данных get блокируется приложением запросов после запуска оптимизатора запросов. Во время этой блокировки запросы idempotent oplog записываются в oplog. Поскольку базы данных не взаимосвязаны, и только один запрос может быть применен к базе данных в любой момент времени, достаточно блокировки в базе данных. Никаких двух запросов на изменение данных не может быть применено к одной и той же базе данных в любом случае, так почему же следует установить блокировку в oplog? Видимо, блокировка берет локальную базу данных. Однако, поскольку блокировка уже взята на данные, я не вижу причины.* царапиныMyHead *

+2

Это сообщение в блоге также стоит прочитать, оно описывает «эффективную глобальную блокировку», которая может встречаться в наборах реплик в более подробной технической информации: http://daprlabs.com/blog/blog/2014/04/19/mongodb/ – Jaco

+0

@Jaco интересно читать, хотя я не могу повторить его выводы. Однако проблему с двойным замком можно было бы изучить. –

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