Как отключить безопасный режим в оболочке монго?

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

Длинный вопрос для тех, кто хочет знать контекст: я работаю над огромным набором данных, таких как

{
_id:ObjectId("azertyuiopqsdfghjkl"),
stringdate:"2008-03-08 06:36:00"
}

и некоторые другие поля, и около 250 миллионов таких документов (вся база данных с индексами весит 36Go). Я хочу конвертировать дату в реальном поле ISODATE. Я немного искал, как я могу сделать запрос на обновление, как

db.data.update({},{$set:{date:new Date("$stringdate")}},{multi:true})

но не нашел, как заставить это работать, и решил сам сделать скрипт, который будет принимать документы один за другим и делать обновление, чтобы установить новое поле, которое принимает новую дату (stringdate) в качестве значения. В запросе используется _id, поэтому используется индекс по умолчанию.

Проблема в том, что это занимает очень много времени. Я уже понял, что если бы я только вставил пустой объект дат при создании базы данных, я бы теперь получил лучшую производительность, поскольку существует проблема перемещения данных при добавлении нового поля. Я также установил индекс в соответствующем поле для обработки фрагмента базы данных по фрагменту. Наконец, я запустил несколько одновременных клиентов mongo как на сервере, так и на своей рабочей станции, чтобы убедиться, что ограничивающим фактором является доступность блокировки базы данных, а не какой-либо другой фактор, такой как процессор или стоимость сети.

Я контролировал все это с помощью mongotop, mongostats и интерфейсов веб-мониторинга, которые подтвердили, что блокировка записи выполняется в 70% случаев. Я немного разочарован: у mongodb нет более точной детализации блокировки записи, почему бы не разрешить одновременные операции записи в одной коллекции, если нет риска вмешательства? Теперь, когда я думаю об этом, я должен был разделить коллекцию на десяток фрагментов, даже оставаясь на том же сервере, потому что на каждом фрагменте были отдельные блокировки.

Но поскольку сейчас я ничего не могу сделать с текущей структурой базы данных, я искал, как улучшить производительность, чтобы, по крайней мере, тратить 90% своего времени на запись в монго (с 70% в настоящее время), и я понял, что с тех пор, как я запустил мой сценарий в оболочке mongo по умолчанию, каждый раз, когда я делаю обновление, есть также getLastError(), который вызывается впоследствии, и я не хочу его, потому что есть вероятность успеха 99,99%, и даже в случае неудачи я могу по-прежнему делать запрос агрегации после завершения большого процесса для извлечения единичных исключений.

Я не думаю, что выиграл бы так много, отключив вызовы getLastError, но я думаю, что стоит попробовать.

Я взглянул на документацию и нашел подтверждение поведения по умолчанию, но не процедуру его изменения. Любое предложение?

1 ответ

Решение

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

Ты можешь использовать db.getLastError({w:0}) ( http://docs.mongodb.org/manual/reference/method/db.getLastError/) делать то, что вы хотите, но это не поможет.

Это потому что для одного:

создайте сценарий, который принимает документы один за другим, и обновите его, чтобы установить новое поле, которое принимает новую дату (stringdate) в качестве значения.

При использовании оболочки в неинтерактивном режиме, например в цикле, она на самом деле не вызывает getLastError(), Как таковой, вы пишете 0 ничего не сделаю.

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

Когда люди спрашивали об этом материале, я добавлял эти поля в поле движения, но вместо этого они слушали парня, который сказал: "Оставь их! Они используют пространство!".

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

mongostats и интерфейсы веб-мониторинга, которые подтвердили, что блокировка записи выполняется в 70% случаев

Это из-за движения в ваших документах, это довольно сложно исправить.

Я немного разочарован, у mongodb нет более точной детализации блокировки записи

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

Блокировки записи в MongoDB являются мьютексами для одного.

Мало того, но есть множество правил, которые предписывают, что операции будут подчиняться операциям в очереди при определенных обстоятельствах, одно из них - сколько операций ожидает, другое - находятся ли данные в ОЗУ или нет, и многое другое.

К сожалению, я верю, что вы застряли между камнем и наковальней, и нет легкого выхода. Это случается

Другие вопросы по тегам