Подтвердить что ты не робот

NoSQL и возможная последовательность - примеры реального мира

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

EDIT:

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Итак, каково решение вашего вопроса? Вероятно, чтобы ослабить некоторые ограничения и пойти на компромисс с другими.

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

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

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

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

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

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

[Продолжение...]

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

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

То же самое можно сказать и для большинства SQL-решений: все они реализуют индексы (которые используют b-деревья под капотом), имеют относительно интеллектуальные оптимизаторы запросов, которые основаны на известных алгоритмах CS, все используют кэширование в памяти для уменьшения количества дисков IO. Различия в основном связаны с реализацией, опытом управления, поддержкой набора инструментов и т.д.

К сожалению, я не могу указать на какое-то центральное хранилище мудрости, которое содержит все, что вам нужно знать. В общем, начните с того, чтобы спросить себя, какие характеристики NoSQL вам действительно нужны. Это поможет вам выбрать между хранилищем ключевого значения, хранилищем документов или хранилищем столбцов. (это 3 основные категории предложений NoSQL). И оттуда вы можете начать сравнивать различные реализации.

[Обновлено 4/14/2011]

Хорошо, вот часть, которая на самом деле оправдывает щедрость. Я только что нашел следующий 120-страничный технический документ о NoSQL-системах. Это очень близко к тому, что "Библия NoSQL", о которой я вам говорил раньше, не существует. Прочтите и радуйтесь: -)

Базы данных NoSQL, Christof Strauch

Ответ 2

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

Ответ 3

Существует много приложений, где возможная согласованность в порядке. Рассмотрите Twitter как довольно известный пример. Нет причин, чтобы ваши "твиты" приходили ко всем вашим "последователям" мгновенно. Если вам потребуется несколько секунд (или даже минут?) Для вашего "твита", кто бы даже заметил?

Если вам нужны примеры, отличные от веб-сайтов, любая служба хранения и пересылки (например, электронная почта и USENET) потребует постоянной согласованности.