Является ли NoSQL 100% ACID 100% времени? - PullRequest
3 голосов
/ 11 июля 2011

Цитата: http://gigaom.com/cloud/facebook-trapped-in-mysql-fate-worse-than-death/

Были предприняты различные попытки преодолеть проблемы производительности и масштабируемости SQL, в том числе шумное движение NoSQL, которое появилось на сцене пару лет назад.Однако было быстро обнаружено, что, хотя NoSQL может быть быстрее и лучше масштабироваться, он сделал это за счет согласованности ACID.

Подождите - я неправильно это читаю?

это означает, что если я использую NoSQL, мы можем ожидать, что транзакции будут повреждены (хотя я осмелюсь сказать, что это очень низкий процент)?

Ответы [ 8 ]

8 голосов
/ 11 июля 2011

Это на самом деле правда, но и немного ложная. Речь идет не о коррупции, а о том, чтобы увидеть что-то другое в течение (ограниченного) периода.

Реальная вещь здесь - это теорема CAP , которая просто утверждает, что вы можете выбрать только два из следующих трех:

  1. Согласованность (все узлы видят одни и те же данные одновременно)
  2. Доступность (гарантия того, что каждый запрос получает ответ о том, был ли он успешным или неудачным)
  3. Partition допуск (система продолжает работать, несмотря на произвольную потерю сообщения)

Традиционные системы SQL выбирают "допуск раздела", когда многие (не все) системы NoSQL выбирают "согласованность".

Точнее: они отбрасывают «Сильную согласованность» и выбирают более расслабленную Модель согласованности , например « Возможная согласованность ».

Таким образом, данные будут согласованными при просмотре с разных точек зрения, но не сразу.

5 голосов
/ 11 июля 2011

Решения NoSQL обычно предназначены для преодоления ограничений масштаба SQL.Эти ограничения масштаба объясняются теоремой CAP .Понимание CAP является ключом к пониманию того, почему системы NoSQL имеют тенденцию отказываться от поддержки ACID.

Итак, позвольте мне объяснить CAP в чисто интуитивном смысле.Во-первых, что означают C, A и P:

Согласованность: с точки зрения внешнего наблюдателя каждая «транзакция» либо полностью завершена, либо полностью откатана.Например, при совершении покупки amazon подтверждение покупки, обновление статуса заказа, сокращение запасов и т. Д. Должны отображаться «синхронно» независимо от внутреннего разделения на подсистемы

Доступность: 100% запросов успешно завершены.

Допуск раздела: любой заданный запрос может быть выполнен, даже если поднабор узлов в системе недоступен.

Что это означает с точки зрения проектирования системы?Какое напряжение определяет CAP?

Для достижения P нам нужны реплики.Много их!Чем больше копий мы храним, тем выше вероятность того, что любой нужный нам фрагмент данных будет доступен, даже если некоторые узлы отключены.Для абсолютного «P» мы должны реплицировать каждый элемент данных на каждый узел в системе.(Очевидно, что в реальной жизни мы идем на компромисс на 2, 3 и т. Д.)

Чтобы достичь А, нам не нужна ни одна точка отказа.Это означает, что конфигурации репликации «первичный / вторичный» или «главный / подчиненный» выходят за пределы окна, так как главный / основной является единственной точкой отказа.Нам нужно использовать несколько основных конфигураций.Для достижения абсолютного «A» любая отдельная реплика должна быть способна обрабатывать операции чтения и записи независимо от других реплик.(на самом деле мы идем на компромисс в отношении асинхронности, очереди, кворумов и т. д.)

Для достижения C нам нужна «единая версия истины» в системе.Это означает, что если я пишу в узел A, а затем сразу же читаю обратно из узла B, узел B должен возвращать актуальное значение.Очевидно, что это не может произойти в действительно распределенной мультимастерной системе.

Итак, каково «правильное» решение проблемы?Детали действительно зависят от ваших требований, но общий подход состоит в том, чтобы ослабить некоторые из ограничений и пойти на компромисс с другими.

Например, для достижения гарантии "полной согласованности записи" в системе сn реплик, число операций чтения + количество операций записи должно быть больше или равно n: r + w> = n.Это легко объяснить на примере: если я храню каждый элемент на 3-х репликах, у меня есть несколько вариантов, чтобы гарантировать согласованность:

A) Я могу записать элемент на все 3 реплики, а затем прочитать из любогоодин из трех, и будьте уверены, что я получаю последнюю версию. B) Я могу записать элемент в одну из реплик, а затем прочитать все 3 реплики и выбрать последний из 3 результатов. C) Я могу написать в 2 из3 реплики и считывание с 2 из 3 реплик, и я гарантирую, что на одной из них будет установлена ​​последняя версия.

Конечно, в приведенном выше правиле предполагается, что ни один узел не вышел из строя.тем временем.Чтобы обеспечить P + C, вам нужно быть еще более параноиком ...

Существует также почти бесконечное количество хаков "реализации" - например, уровень хранилища может завершить вызов, если он не можетзаписывать в минимальный кворум, но может продолжать распространять обновления на дополнительные узлы даже после успешного возвращения.Или это может ослабить семантические гарантии и возложить ответственность за объединение конфликтов версий на бизнес-уровень (это то, что сделали в Amazon Dynamo).

Различные подмножества данных могут иметь разные гарантии (т. Е. Одна точка отказаможет быть в порядке для критических данных или в порядке блокировки вашего запроса на запись, пока минимальное количество реплик записи не успешно записало новую версию)

Шаблоны для решения 90% случая уже существуют, но каждое решение NoSQL применяет их в разных конфигурациях.Шаблоны - это такие вещи, как разбиение (стабильное / на основе хеша или на основе переменной / поиска), избыточность и репликация в кэшах памяти, распределенные алгоритмы, такие как map / проводить.

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

1 голос
/ 12 июля 2011

Существует множество различных типов и реализаций хранилищ NoSQL. Каждый из них может по-разному решать компромиссы между согласованностью и производительностью.Лучшее, что вы можете получить - это перестраиваемый фреймворк.

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

1 голос
/ 11 июля 2011

Во-первых, вопрос о том, является ли NoSql 100% КИСЛОТОЙ 100% времени, - это немного бессмысленный вопрос. Это все равно что спросить "Собаки на 100% защищены 100% времени?" Есть некоторые собаки, которые являются защитными (или могут быть обучены, чтобы быть), такие как немецкие овчарки или доберман клещи. Есть и другие собаки, которых меньше заботит защита кого-либо.

NoSql - это метка движения, а не конкретная технология. Существует несколько различных типов баз данных NoSql. Есть хранилища документов, такие как MongoDb. Есть графовые базы данных, такие как Neo4j. Есть магазины ключевых ценностей, такие как кассандра.

Каждый из них служит разным целям. Я работал с частной базой данных, которую можно классифицировать как базу данных NoSql, это не 100% ACID, но это не обязательно. Это запись один раз, прочитайте много базы данных. Я думаю, что он создается один раз в квартал (или раз в месяц?), А затем читается тысячи раз в день.

1 голос
/ 11 июля 2011

Это не значит, что транзакции будут повреждены.На самом деле, многие системы NoSQL вообще не используют транзакции!Некоторые системы NoSQL могут иногда терять записи (например, MongoDB, когда вы выполняете вставки «запускай и забывай», а не «безопасные»), но часто это выбор дизайна, а не то, с чем вы застряли.вам нужна настоящая транзакционная семантика (возможно, вы создаете приложение для банковского учета), используйте базу данных, которая их поддерживает.

0 голосов
/ 15 октября 2012

Вы правильно прочитали.Если у вас есть AP CAP, ваши данные будут противоречивыми.Чем больше пользователей, тем больше противоречий.Поскольку наличие большого количества пользователей является основной причиной масштабирования, не ожидайте, что несоответствия будут редкими.Вы уже видели, как данные появляются и выходят из Facebook.Представьте себе, что это могло бы сделать с данными по запасам на Amazon.com, если бы вы не указали ACID.Окончательная согласованность - это просто хороший способ сказать, что у вас нет согласованности, но вы должны написать и приложить ее там, где она вам не нужна.Некоторые типы игр и приложений для социальных сетей не нуждаются в согласованности.Есть даже бизнес-системы, которым это не нужно, но они встречаются довольно редко.Когда ваш клиент звонит, когда на счету неверное количество денег или когда злой игрок в покер не получил свой выигрыш, ответ не должен заключаться в том, что именно так было разработано ваше программное обеспечение.за правильную работу.Если у вас менее нескольких миллионов транзакций в секунду, вам следует использовать согласованную базу данных NewSQL или NoSQL, например VoltDb (непараллельные приложения Java) или Starcounter (параллельные приложения .NET).В наши дни не нужно отказываться от КИСЛОТЫ.

0 голосов
/ 11 июля 2011

NOSQL не о поврежденных данных. Речь идет о просмотре ваших данных с другой точки зрения. Он предоставляет некоторые интересные рычаги, которые позволяют значительно упростить историю масштабируемости и, зачастую, удобство использования. Однако вы должны по-разному смотреть на свои данные и соответствующим образом программировать свое приложение (например, учитывать последствия BASE вместо ACID). Большинство решений NOSQL не позволяют вам принимать решения, которые могут затруднить масштабирование вашей базы данных.

NOSQL - не для всех, но ACID - не самый важный фактор с точки зрения конечного пользователя. Только мы, разработчики, не можем представить мир без гарантий ACID.

0 голосов
/ 11 июля 2011

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

Где происходит сбой ACID, - это поиск данных..

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

И, скажем, владельцы сайта обновляют статью на сайте с некоторой новой информацией.

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

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

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

ФактическиЕсли вы считаете это таким, DNS-система может рассматриваться как специализированная база данных NoSQL.Если имя домена обновляется в DNS, новые данные могут распространяться по Интернету в течение нескольких дней (в зависимости от конфигурации TTL).

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

С другой стороны, это означает, чточто было бы очень плохой идеей использовать базу данных NoSQL для системы, которая требует согласованности и современной точности.Система обработки заказов или банковская система определенно не подойдут для вашей типичной системы баз данных NoSQL.

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