Базы данных NoSQL: как насчет согласованности чтения?
Из того, что я могу разглядеть, базы данных NoSQL могут быть хорошим вариантом для приложений чтения данных с высокой интенсивностью, но они менее пригодны, если вам нужно также делать много обновлений данных, и для вас очень важна транзакционность (чего нет Соответствие кислоте). Правильно? Возможно, слишком упрощенно.
Но в любом случае, предположив, что я частично прав, по крайней мере, я теперь обеспокоен тем, как базы данных NoSQL поддерживают "согласованное чтение" представление данных, которые вы либо читаете, либо пишете. Или они? А если нет, разве это не большая проблема?
Я имею в виду, что если данные, которые вы читаете (или обновляете), меняются по мере того, как вы читаете их, то вы потенциально можете получить противоречивый / грязный набор результатов. Исходя из опыта Oracle rdbms, где все это только для вас обрабатывается, я нахожу странным, что отсутствие согласованности чтения - это не большая проблема. Вполне возможно, что мне не хватает ключевого момента во всем этом. Может кто-нибудь поправить меня?
4 ответа
MongoDB позволяет приложению выбирать желаемый уровень согласованности чтения, используя "заботу о записи". Эта концепция позволяет вашему приложению блокироваться, пока не будет выполнено определенное условие для данной записи.
Например, вы можете считать любую запись успешной, если операция передана на главный сервер. Кроме того, вы можете заблокировать, пока запись не будет распространена на большинство узлов в вашем наборе реплик. Таким образом, вы можете смешивать производительность / последовательность по вкусу.
Я являюсь разработчиком Oracle NoSQL Database и отвечу на ваш вопрос относительно этой конкретной системы NoSQL.
Oracle NoSQL Database API позволяет программисту определять - с каждым вызовом API - уровень согласованности чтения. Четыре возможных значения, от самых строгих до самых слабых, это Абсолют, Время, Версия и Нет. Абсолют говорит, чтобы всегда читать с мастера репликации, так что возвращается самое последнее значение. "Время" означает, что система может возвращать значение из любой реплики, которое находится по крайней мере в пределах определенной дельты времени мастера (например, считывать значение из любой реплики, которая находится в пределах 2 секунд от мастера). Каждый вызов чтения и записи в системе возвращает "дескриптор версии". Этот дескриптор версии может быть передан в любой вызов чтения, когда указано Consistency.Version, и он сообщает системе, что нужно читать из любой реплики, которая по крайней мере так же актуальна, как и эта версия. Это полезно для сценариев Read Modify Write (aka CAS). Последнее значение, Consistency.None, говорит о том, что можно использовать любую реплику (т. Е. Согласованность не гарантируется).
Я надеюсь, что это полезно.
Чарльз Лэмб
База данных NoSQL может быть согласованной по чтению, хотя, как правило, это не большая проблема, если не строго, ознакомьтесь с теоремой CAP. В этой области было проведено довольно много исследований, я рекомендую прочитать статью Amazon Dynamo для быстрого просмотра некоторых проблем и решений, с которыми сталкиваются распределенные системы, такие как базы данных NoSQL.
Это зависит от базы данных NoSQL, которую вы используете, поскольку каждая из них реализует свою стратегию. Вы можете прочитать, например, объяснение Риака об их модели "возможной согласованности" или рецензию Ларса Хофансела на ACID в HBase