Почему MongoDB не использует fsync ()? - PullRequest
3 голосов
/ 17 сентября 2010

Итак, я провел некоторое исследование и обнаружил, что MongoDB не выполняет fsync (), что означает, что когда вы говорите базе данных написать что-то, база данных может сказать вам, что она написана, хотя это не так.Разве это не идет против CRUD?

Если я прав, есть ли для этого веские причины?

Ответы [ 2 ]

11 голосов
/ 17 сентября 2010

Причина в производительности. Без необходимости записи на диск при каждом изменении, MongoDB может обрабатывать обновления быстрее.

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

Примечание: текущая реализация возвращается, когда данные были доставлены на серверы. В будущих версиях появится больше возможностей для доставки, чем, скажем, для физического fsync на сервере.

Это идет против КИСЛОТЫ , более конкретно против D, что означает долговечность :

Долговечность [гарантирует], что как только пользователь будет уведомлен об успешности транзакции, транзакция не будет потеряна, изменения данных транзакции сохранятся после сбоя системы, и что все ограничения целостности будут выполнены, поэтому СУБД не потребуется отменить транзакцию.

Свойства ACID в основном применяются к традиционным системам СУБД. Системы NoSQL, которые включают MongoDB, отказываются от одного или нескольких свойств ACID для достижения лучшей масштабируемости. В случае MongoDB долговечность была принесена в жертву для повышения производительности при обработке большого количества обновлений.


MongoDB и ACID

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

A & mdash; Атомность заявляет, что транзакция должна либо успешно завершиться, либо провалиться Это не позволено частично преуспеть; если часть транзакции завершается неудачно, всю транзакцию необходимо откатить. MongoDB поддерживает атомарные операции на уровне документа, но не на уровне «транзакции».

C & mdash; Согласованность частично относится к атомарности, но также включает ссылочную целостность . Реляционная база данных отвечает за проверку правильности всех ссылок на внешние ключи. MongoDB не имеет понятия внешних ключей, поэтому это свойство ACID не применяется.

I & mdash; Изоляция гласит, что двум одновременным транзакциям не разрешается мешать друг другу; если две транзакции пытаются изменить одни и те же данные, вторая транзакция должна ждать завершения первой. Для этого база данных заблокирует данные. MongoDB не имеет концепции блокировки, поэтому он не поддерживает изоляцию для нескольких операций 1) . Отдельные операции изолированы.

D & mdash; Долговечность описана выше. MongoDB не поддерживает истинную долговечность (пока) с точки зрения стойкости к кислоте.

Теперь вы можете подумать, что MongoDB бесполезен по сравнению с системами RDBMS, потому что в ней отсутствуют транзакции и большинство гарантий ACID. Однако одна из причин того, что транзакции существуют, заключается в том, что реляционные базы данных должны обрабатывать определенные данные как единый объект , но эти данные были нормализованы в несколько таблиц .

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

1) Согласно первому комментарию на этой странице , db.eval() обеспечивает изоляцию для нескольких операций. Однако, согласно документации , вы обычно хотите избегать использования db.eval().

2 голосов
/ 17 сентября 2010

Это актуально?

durability: added occasinal file sync
default: sync every 60 seconds, confiruable with syncdelay

http://github.com/mongodb/mongo/commit/c44bff08fd95616302a73e92b48b2853c1fd948d

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...