2014-02-17 3 views
3

Просматривая использования capped collections с MongoDB вопрос пришел в голову над следующим утверждением:.MongoDB Перетяжка Разъяснение

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

Это само по себе звучит разумно, если не полностью объяснить причины. И это заставляет меня задуматься: «Если я не хочу, чтобы документ расти, но, возможно, добавьте дополнительную информацию (то есть: $ push к массиву), то что было бы неправильно с заполнением документа до моего ожидаемого размера».

Итак, моя посылка звучит разумно (для меня в любом случае), вплоть до чтения этого фрагмента с FAQ on padding.

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

И снова это поднимает мой вопрос: «Почему это так?» Или конкретно:

  1. Зачем заполнять документ в закрытой коллекции в этой «разрывающей репликации»?

  2. Есть пропущенный раздел документации с указанием очевидных причин для этого? Или это просто «Темная магия» в закрытой коллекции внутренней работы на работе? (Возможно, связанная с частью «заполнение не сохранилась»)

  3. Или это просто очень пессимистично, и на самом деле нет причин, по которым вы не могли бы проложить такой способ? (По крайней мере, в последних версиях).

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

P.S Хотя это не строго программирования я рассматривал ручную набивку технику быть методом программирования, и, следовательно, оставил вопрос здесь.

+0

Я считаю, что это связано с тем, что второстепенные люди не знают о вашем заполнении вручную. Он не идет вниз oplog – Sammaye

ответ

2

Зачем заполнять документ в закрытой коллекции в этой «разрывающей репликации»?

Я думаю, что документация может быть немного перестраховкой (см. DOCS-1528) здесь.MongoDB не имеет никакого способа узнать, является ли поле padding_foobar используются для «ручного заполнения» или содержит системную критическую информацию, так что техника обычно работает, НО

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

Пример (Примечание: я буду использовать только размер контента здесь, что это не правильно, так как имена полей, идентификаторы типа, терминаторы и длины строк также занимают место, но это только усиливает аргумент):

// 1. insert w/ 20 bytes of 'content' 
insert({"name" : "john", "pad" : "0000000000000000"}); 

// 2. now we're performing an update, removing 16 bytes of padding, adding 
// 3 bytes so we now have 7 bytes of 'content' 
update({"name" : "john"}, {$unset: {"pad": 1}, $set: {"foo" : "bar"}}); 

// 3. at this point, we can easily grow the document again, as long as it doesn't 
// grow past its original size of 20 bytes of content 
update({"name" : "john"}, {$set: {"foo" : "barfoobar"}}); 

Теперь, когда начальная репликация произошла после шага 2), документ реплицируется без поля заполнения, так что на реплике всего 7 байтов «размер содержимого». В этом случае операция в , шаг 3) завершится ошибкой, потому что она расширяет документ за «исходный размер» реплики документа, который не соответствует оригинальному размеру документа мастера.

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

+0

Хорошо структурированный ответ. Но разве у меня («бутылка вина») выпало много очков IQ, как это не усиливает точку ** 3 ** из моего первоначального заявления? Если вы действительно не говорите, что ** где-то **, фаза «заполнения» пропускается. Который в моем сознании относится к * контрпродуктивным * к понятиям репликации, если не ** все ** ops переигрываются. Так что если это ** **, то это все еще кажется неправильным. –

+1

Как я уже писал, документ хочет, чтобы вы были осторожны (прочитайте обсуждение в упомянутом билете Jira), так что да, вы можете это сделать (это то, что я говорю в последнем абзаце), но помните, что начальная синхронизация с репликами * будет * сломать это. Поэтому, если вам нужно добавить третью реплику после года работы или разрывов реплик, она потерпит неудачу, если вы не скопировали файлы данных вручную, и файлы там до того, как какой-либо документ сжат. Это делает абстрагию крайне непроницаемой (devops должны понимать и знать об этом). В более технических терминах первоначальная синхронизация набора реплик нарушает идемпотентность oplog. – mnemosyn

+0

Прежде всего, извините за звук перекатируемых частиц, но я надеялся, что этот вопрос привлечет больше внимания со стороны людей, и особенно сотрудников MongoDB, которые здесь часто бывают. И я имею в виду, «по крайней мере, в комментарии». Хотя верно, что ваше «последнее предложение» в последующем комментарии содержит наибольший вес в рассуждении этого, моя логика заключается в том, что в «духе» вопроса мы говорим о «закрытой коллекции», и как таковая ** край кейс ** как это ** не должен ** быть действительным для общего использования. Помещение остается звуковым, предупреждение - FUD. Не в обиду. –

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