NoSQL: что означает, что MongoDB или BigTable не всегда являются «доступными» - PullRequest
17 голосов
/ 07 сентября 2011

Читая Визуальное руководство по системам NoSQL Натана Херста , он включает в себя треугольник CAP:

  • C onsistency
  • A vailibility
  • P Artition Tolerance

enter image description here

С SQL Server в качестве AC системы и MongoDB в виде CP системы.

Эти определения получены от профессора Калифорнийского университета в Беркли Эрика Брюера и его выступления на PODC 2000 (Принципы распределенных вычислений):

Наличие

Доступность означает только это - услуга доступна (работать полностью или не так, как указано выше). Когда вы покупаете книгу, которую хотите получить ответ, а не какое-либо сообщение браузера о том, что веб-сайт необщительный. Гилберт и Линч в своем доказательстве теоремы CAP делают хороший момент, что доступность чаще всего покидает вас, когда вам нужно это большинство - сайты имеют тенденцию выходить из строя в периоды занятости именно потому, что они заняты. Сервис, который доступен, но не доступен, не имеет кому угодно.

Что означает, что в контексте MongoDB или BigTable система не будет «доступна»?

Идете ли вы подключаться (например, через TCP / IP), а сервер не отвечает? Вы пытаетесь выполнить запрос, но запрос никогда не возвращается - или возвращает ошибку?

Что означает , что недоступно?

Ответы [ 2 ]

13 голосов
/ 07 сентября 2011

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

Предполагается, что в гипотетической распределенной системе имеется 3 узла A, B и C.A, B и C каждый работает в своей собственной стойке серверов с двумя коммутаторами между ними:

[Node A] <- Switch #1 -> [Node B] <- Switch #2 -> [ Node C ]

Теперь предположим, что указанная система настроена так, что ГАРАНТИРУЕТСЯ, что любая запись будет выполнятьсякак минимум 2 узла, прежде чем он будет считаться зафиксированным.Теперь давайте предположим, что коммутатор # 2 отключен, и какой-то клиент подключен к узлу C:

[Node A] <- Switch #1 -> [Node B]                 [ Node C ] <-- Some client

Этот клиент не сможет выдавать согласованные записи, поскольку распределенная система в настоящее время находится в состоянии секционирования.(а именно, узел C не может связаться с достаточным количеством других узлов, чтобы гарантировать требуемую согласованность с 2 узлами).

Я бы добавил к этому, что некоторые базы данных NoSQL позволяют очень динамично выбирать атрибуты CAP.Кассандра, например, позволяет клиентам указывать количество серверов, на которые должна быть сделана запись, прежде чем она будет зафиксирована для каждой записи.Запись на один сервер - это «AP», запись на кворум (или на все) - больше «CA».

EDIT - из комментариев ниже:

В MongoDB вы можетеиметь конфигурацию master / slave только внутри набора реплик.Это означает, что выбор AP против CP делается клиентом во время запроса.Клиент может указать slaveOk, который будет считывать данные с произвольно выбранного ведомого (который может иметь устаревшие данные): mongodb.org/display/DOCS/….Если клиент не в порядке с устаревшими данными, не указывайте slaveOk, и запрос будет передан мастеру.Если клиент не может связаться с мастером, вы получите ошибку.Я не уверен точно, что это за ошибка.

6 голосов
/ 02 февраля 2012

Теорема CAP применяется к распределенным компьютерным системам. MongoDB поддерживает две различные формы распределенных вычислений: шардинг для горизонтального масштабирования и наборы реплик для аварийного переключения / высокой доступности. Эти два могут использоваться вместе или независимо. Я думаю, что теорема CAP применяется немного по-разному к двум формам:

Уровень шардинга - MongoDB хранит данные не более чем на одном авторитетном шарде.

  • Сильная согласованность: часть данных существует не более чем на одном фрагменте. Неверные / устаревшие данные не существуют.
  • Высокая устойчивость к разделам: даже если сеть разделена, запросы никогда не возвращают неверные / устаревшие данные. Осколки продолжают работать независимо от других осколков.

  • Слабая доступность: чтение / запись данных на сбитый осколок не удастся.

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

  • Сильная согласованность: все операции чтения / записи обрабатываются первичным узлом.
  • Сильный допуск на раздел: если достаточное количество узлов становится недоступным, выбирается новый первичный. Процесс выборов гарантирует, что всегда есть не более одного первичного узла.

  • Слабая доступность: чтение / запись не удастся, если не существует первичного сервера, даже если к данным можно получить доступ через вторичные узлы.


Опция slaveOK / ReadPreference.SECONDARY жертвует некоторой согласованностью (можно прочитать устаревшие данные) для повышения производительности и доступности.

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