Насколько БД Mongo или любая БД nosql (Hbase, Cassandra) масштабируема и имеет преимущество перед традиционными СУБД? - PullRequest
0 голосов
/ 17 мая 2018

Я до сих пор не могу понять, насколько полезен nosql, тогда как у нас есть индексы и в традиционных СУБД. Если кто-то может предложить преимущества колоночных баз данных в реальном приложении, особенно с точки зрения использования структурных, полуструктурированных или неструктурированных данных.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

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

Все сводится к как вы можете масштабировать для удовлетворения спроса. СУБД действительно может масштабировать по вертикали . То есть добавьте больше оперативной памяти, добавьте больше дисков и т. Д. Распределенная (NoSQL) база данных упрощает масштабирование, позволяя добавлять больше экземпляров компьютера. Это известно как масштабирование по горизонтали .

Вот пример использования Кассандры:

Допустим, у меня есть кластер из 3 узлов, и мое пространство ключей (база данных) также настроено с коэффициентом репликации (RF), равным 3. Это означает, что каждый узел отвечает за 100% данных. Я загружаю свои данные, и это занимает 100 ГБ дискового пространства (на каждом узле). Теперь, когда в моем кластере может быть 300 ГБ данных, одна копия моих данных составляет 100 ГБ.

Итак, моя команда разработчиков приходит ко мне и говорит, что им нужно удвоить объем данных, которые они имеют. Я знаю, что я построил их кластер из 3 узлов с дисками 200 ГБ. Если бы я ничего не делал, эти диски были бы в значительной степени заполнены (и если бы они этого не сделали, они бы не оставили места для чего-то еще).

Теперь я должен масштабировать кластер для удовлетворения их потребностей в пространстве. Я начну с добавления 3 новых узлов в кластер (всего 6), но оставлю свой RF на 3. Это делает каждый узел ответственным за 50% данных или 50 ГБ. Когда моя команда разработчиков загружает больше данных, чтобы удовлетворить свои требования к «удвоению», каждый узел должен набрать примерно 100 ГБ. Одна копия данных теперь 200 ГБ. Но если каждый узел отвечает за 50%, каждый диск емкостью 200 ГБ все еще имеет только 100 ГБ.

Пример № 2:

Предположим, что кластер с 6 узлами выше способен поддерживать рабочую нагрузку в 10 000 операций в секунду (ops). Моя команда по продукту снова приходит ко мне, говоря, что в праздничный сезон они планируют поддержать 20 000 операций. Поскольку текущий кластер может поддерживать только половину этого, он будет задыхаться при высокой пропускной способности, и один или несколько узлов могут выйти из строя.

Поскольку Кассандра масштабируется линейно, способ достижения этого состоит в том, чтобы (опять же) удвоить размер кластера. Таким образом, я увеличил его с 6 до 12 узлов, сохранив при этом свой RF на 3. После выполнения некоторого тестирования производительности они подтверждают, что он действительно может поддерживать 20 000 операций. Поскольку одна копия моих данных составляет 200 ГБ, общий объем данных остается 600 ГБ. С 12 узлами каждый узел теперь отвечает только за 25% данных или 50 ГБ.

Так что масштабируемость является преимуществом. Но как насчет моделирования данных? Основная идея моделирования распределенной базы данных, состоит из двух частей:

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

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

Обычно это означает использование натуральных ключей, так как они более соответствуют тому, что вы запрашиваете у ваших данных. Суррогатные ключи (буквенные, числовые или оба) хорошо распределяются, но не очень полезны для запросов. Пользователь "Боб Джонс" может иметь идентификатор "3582346556230" в моей системе. Но когда я хочу запросить данные Боба, я, вероятно, никогда не захочу запрашивать их по «3582346556230», потому что это ничего не значит для приложения или контекста, в котором используются данные.

Кроме того, вы хотите, чтобы ваши данные имели структуру. Неструктурированные данные - это незапрашиваемые данные. Просто как тот. Если вы хотите, чтобы неструктурированные данные можно было запрашивать, вам необходимо проанализировать их идентифицирующие аспекты, которые будут использоваться в качестве ключей. Вы не хотите «искать» или запускать SELECT * FROM запросов. Полное сканирование таблиц в базах данных NoSQL требует даже больше ресурсов, чем их аналоги из СУБД, поскольку им приходится проверять каждый узел, сортировать реплики и, таким образом, тратить дополнительное сетевое время.

Базы данных NoSQL дают вам возможность масштабирования (для увеличения данных или спроса). Но важно отметить, что их масштабируемость может сделать некоторые вещи (которые могут быть хорошими в СУБД) более сложными, чем вы привыкли.

0 голосов
/ 17 мая 2018

R в RDBMS, r эляционный , является самой большой вещью, отсутствующей в Mongo.Существует очень мало способов заставить базу данных понять, как записи в различных таблицах коллекциях связаны друг с другом.Одна из сильных сторон СУБД - это возможность определять ограничения, которые будет применять база данных, чаще всего ограничения внешнего ключа, которые гарантируют, что идентификатор в одной таблице ссылается на существующий идентификатор в другой таблице.

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

В Mongo каждый большой двоичный объект данных в значительной степени независим.Он не ссылается на другие записи каким-либо образом, обеспечиваемым базой данных.Mongo также имеет слабые или ACID гарантии , что означает, что есть небольшая защита от гонки условия вставки или обновления.Одним словом: Mongo дает мало гарантий в отношении согласованности данных и в основном переносит подобные проблемы на уровень приложений.Это позволяет ему работать более децентрализованно.

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

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

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

Я бы не рекомендовал Mongo дляхранение таких вещей, как финансовая книга, которая в значительной степени опирается на транзакционные гарантии согласованности.Тем не менее, такие вещи, как Twitter, являются идеальным примером для этого: множество независимых фрагментов данных, которые должны быть прочитаны огромным количеством клиентов.

...