Использование базы данных NoSQL по MySQL

У меня есть веб-приложение, работающее на стеке Java (Struts 2 + Spring + Hibernate) и сохраняется в MySQL. Я смотрел базы данных NoSQL, и они, безусловно, легко рассуждать и работать с ними, чем с РСУБД. Это музыкальное потоковое приложение, которое хранит информацию о художнике и позволяет пользователям сохранять плейлисты.

Мне интересно, есть ли какие-либо преимущества (производительность?, стоимость оборудования?, упрощенный код?, масштабируемость?) перехода на NoSQL DB (CouchDB?, MongoDB?, Cassandra?). Что я потеряю/получаю, перейдя в базу данных NoSQL?

Просьба сообщить.

Ответ 1

Вежливая интерпретация "NoSQL" стала Not Only SQL. Если у вас есть данные, которые действительно действительно реляционные, или если ваша функциональность зависит от таких вещей, как объединения и ACIDity, то вы должны хранить эти данные реляционным способом. В этом посте я объясню, как я использую MySQL вместе с двумя хранилищами данных NoSQL. Современное хранилище данных на веб-уровне предназначено для понимания того, как выбрать лучший инструмент для работы (-ов).

Тем не менее, NoSQL действительно является реакцией на то, что реляционный метод и способ мышления были применены к проблемам, где это на самом деле не очень хорошо подходит (как правило, огромные таблицы с десятками миллионов строк и более). После того, как таблицы становятся такими большими, типичная "наилучшая практика" SQL заключается в том, чтобы вручную обмануть данные, то есть положить записи от 1 до 10 000 000 в таблицу A, от 10 000 001 до 20 000,001 в таблице B и т.д. Затем, как правило, на уровне модели приложения, поиск выполняется в соответствии с этой схемой. Это называется масштабированием application-aware. Это требует много времени и ошибок, но чтобы масштабировать что-то при сохранении MySQL для хранилища больших таблиц, оно становится более или менее стандартным MO. NoSQL представляет для меня альтернативу application-unaware.


Key-Value

Когда у меня был прототип MySQL, который стал слишком большим для собственного блага, я лично переместил как можно больше данных на молниеносный Membase, который превосходит Memcached и добавляет устойчивость. Membase - это распределенное хранилище ключей, которое масштабируется более или менее линейно (например, Zynga использует его для обработки полумиллиона операций в секунду), добавляя в кластер больше товарных серверов - поэтому он отлично подходит для эпохи облаков Amazon EC2, Joyent и т.д.

Хорошо известно, что распределенные хранилища ключевых значений - лучший способ получить огромный линейный масштаб. Слабость ключевого значения - это вопросность и индексирование. Но даже в реляционном мире наилучшей практикой для масштабируемости является выгрузка как можно больших усилий на серверы приложений, что делает объединение в памяти на серверах товарных приложений вместо того, чтобы просить центральный RDB-кластер обрабатывать всю эту логику. Поскольку simple select plus application logic действительно лучший способ добиться масштабного масштаба даже в MySQL, переход к чему-то вроде Membase (или его конкурентов, например Riak) не очень-то плохо.


Хранилища документов

Иногда - хотя я бы сказал, что реже, чем многие думают, дизайн приложения по своей сути требует вторичных индексов, запросов к диапазонам и т.д. Подход NoSQL к этому - через document store, как MongoDB. Как и Membase, Mongo очень хорош в некоторых областях, где реляционные базы данных особенно слабы, например application-unaware масштабирование, auto-sharding и maintaining flat response times even as dataset size balloons. Это значительно медленнее, чем Membase, и немного сложнее делать чистую горизонтальную шкалу, но преимущество в том, что оно очень доступно для запросов. Вы можете запрашивать параметры и диапазоны в режиме реального времени или использовать Map/Reduce для выполнения сложных пакетных операций на действительно огромных наборах данных.

В том же проекте, о котором я упоминал выше, который использует Membase для обслуживания тонны данных в реальном времени, мы используем MongoDB для хранения данных аналитики/показателей, которые действительно там, где сияет MongoDB.


Зачем хранить данные в SQL

Я кратко коснулся того факта, что "действительно реляционная" информация должна оставаться в реляционных базах данных. Как отмечает комментатор Дэн К., я пропустил ту часть, где я обсуждаю недостатки выхода из РСУБД, или, по крайней мере, оставить его полностью.

Во-первых, сам SQL. SQL хорошо известен и уже давно является отраслевым стандартом. Некоторые базы данных "NoSQL", такие как Google App Engine Datastore (построенный на Big Table) реализует собственный SQL-подобный язык (Google вызывается, GQL для Google Query Language). MongoDB использует новый подход к проблеме запросов с его восхитительными объектами запроса JSON. Тем не менее, SQL сам по себе является мощным инструментом для получения информации из данных, что часто начинается с базы данных.

Самая важная причина остаться в RDBMS - ACID, или Atomicity, Consistency, Isolation, Durability. Я не буду повторно указывать состояние Acid-NoSQL, так как он хорошо рассмотрен в этом сообщении на SO. Достаточно сказать, существует рациональная причина Oracle RDBMS имеет такой огромный рынок, который никуда не денется: некоторым данным требуется чистое соответствие ACID. Если ваши данные (и если да, то вы, вероятно, хорошо знаете об этом факте), то и ваша база данных. Храните pH low!

Изменить: Отправляйте сообщение Aaronaught здесь. Он представляет перспективу "бизнес-бизнес" гораздо лучше, чем я мог, отчасти потому, что Я всю свою карьеру провел в потребительском пространстве.

Ответ 2

Я думаю, что это очень зависит от того, что вы хотите сохранить в базе данных. У меня нет опыта работы с CouchDB или Cassandra, поэтому я позволю кому-то говорить за них, но я часто использую MongoDB и MySQL.

Если вы разрабатывали приложение, требующее транзакций, например. приложение биллинга, которое вы, безусловно, захотите использовать MySQL из-за его поддержки транзакций. MySQL ACIDic - это Atomic, Consistent, Isolated и Durable. Это, по сути, означает, что при обновлении строки в MySQL это ГАРАНТИРОВАНО. Однако проблема с MySQL заключается в том, что она не масштабируется горизонтально (добавляя все больше и больше серверов) очень легко. Серверы MySQL, как правило, масштабируются вертикально, добавляя больше памяти, место на жестком диске и т.д., Но в конечном итоге они достигают потолка, и это может достигать огромных затрат.

MongoDB - это база данных документов. Он хранит JSON-подобные документы внутри коллекций и не имеет схемы, поэтому каждый документ может быть другим. Это отлично подходит для гибкости вашего приложения. Многие разработчики говорят, что решения noSql разрабатываются больше для программистов, и с ними, как мне кажется, гораздо проще строить (по моему опыту). Кроме того, MongoDB масштабируется горизонтально, разбивая базу данных на куски. На самом деле это может быть даже автоматизировано.

Но есть недостатки в использовании MongoDB. Если вы используете его в производстве, вы действительно ДОЛЖНЫ включить в него репликацию. Это связано с тем, что MongoDB не обладает полной стойкостью к одному серверу. Поэтому, если вы страдаете от сбоя питания, вам, вероятно, придется отремонтировать всю базу данных MongoDB, которая может занять несколько часов. Это, вероятно, не очень дорого, если вы хорошо финансируетесь, но если вы новая организация с небольшими деньгами, это может быть сложно (использовать облачные вычисления?). Кроме того, MongoDB не поддерживает транзакции, которые необходимы для гарантии Atomicity и Isolation. Наконец MongoDB только в конечном итоге последователен (хотя я видел несколько сторон этого аргумента), а это значит, что при записи все остальные процессы НЕ ГАРАНТИРОВАНЫ, чтобы сразу увидеть информацию - только в конце концов.

На мой взгляд, если вы сохраняете информацию о художнике и метаданные о дорожках, то MongoDB будет хорошим решением. Если вы сохраняете данные пользователя, биллинговые данные и т.д., Сохраните их в MySQL.

Ответ 3

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

В противном случае - нет необходимости даже оценивать альтернативы.

Ответ 4

Для чего это стоит, мне нравится ответить Aaronaught на очень похожий вопрос, заданный здесь.

Ответ 5

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

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

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

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

Ответ 6

Поскольку нескольким людям понравился ответ Aaronaught, но соответствующий вопрос был удален тем временем, я скопировал его ответ из Архив хранилищ

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

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

Продукты и технологии, подгоняемые под зонтиком NoSQL, ориентированы к следующей проблемной области:

  • Вы планируете развертывать крупномасштабную, высоко concurrency базу данных (сотни ГБ, тысячи пользователей);
  • Кому не нужны гарантии ACID;
  • Или отношения или ограничения;
  • Сохраняет довольно узкий набор данных (эквивалент 5-10 таблиц в SQL);
  • Будет работать на товарном оборудовании (т.е. Amazon EC2);
  • Требуется выполнить в очень низком бюджете и" масштабироваться ".

Это на самом деле описывает многие веб-сайты сегодня. Google и Twitter очень аккуратно вписываются в эти требования. Действительно ли имеет значение, если несколько твитов теряются или задерживаются? С другой стороны, эти спецификации применяются до почти 0% бизнес-систем, что является очень большим числом мы работаем над развитием. У большинства предприятий очень разные Требования:

  • Базы данных среднего и крупного масштаба (10-100 ГБ) с довольно низким concurrency (не более сотни пользователей);
  • ACID (особенно A и C - Atomicity и Consistency) - сложное требование;
  • Данные сильно коррелированы (иерархии, мастер-детали, истории);
  • Необходимо хранить широкий ассортимент данных - сотни или тысячи таблиц не являются редкостью в нормализованной схеме (больше для таблицы денормализации, хранилища данных и т.д.);
  • Запуск на аппаратном обеспечении высокого класса;
  • Достаточно большой объем капитала (если ваш бизнес имеет миллионы клиентов, то вы, вероятно, можете найти $25 000 или около того за кушетка).

Высококачественные базы данных SQL (SQL Server, Oracle, Teradata, Vertica и т.д.) предназначены для вертикального масштабирования, им нравится находиться на машинах с много-много памяти, быстрый ввод-вывод через SAN и SSD, а также случайное горизонтальное масштабирование посредством кластеризации (НА) и разбиение (НС).

"NoSQL" часто сравнивается с "SQL" в условиях производительности. Но полностью удаленный, сервер или кластер базы данных высокого класса SQL масштаб почти бесконечно. Вот как они должны были быть развертывается. Остерегайтесь сомнительных тестов, сравнивающих плохо нормализованные, слабо индексированные базы данных SQL, на которых запущены mysql на серверах начального уровня (или хуже, облачные серверы, такие как Amazon EC2) для аналогично развернутого NoSQL базы данных. Яблоки и апельсины. Если вы работаете с SQL, не бойтесь тем, что реклама.

SQL никуда не денется. Менее вероятно, что администраторы баз данных будут результат NoSQL, чем PHP-программисты, были результатом Java и XML.

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

Итак, как разработчик, вы обязаны сделать это ради себя, по крайней мере, узнать, что такое NoSQL это то, на что он ссылается (Cassandra, BigTable, Voldemort, db4o, и т.д.), а также как создавать и кодировать простую созданную базу данных с одним из них. Но не начинайте бросать все ваши SQL базы данных или думать, что ваша карьера будет сделана устаревший - это шумиха, а не реальность.