2011-01-28 3 views
11

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

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

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

ответ

37

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

Тем не менее, NoSQL действительно является реакцией на то, что реляционный метод и способ мышления были применены к проблемам, где это на самом деле не очень хорошо подходит (как правило, огромные таблицы с десятками миллионов строк и более). После того, как таблицы становятся такими большими, типичной «лучшей практикой» SQL было вручную shard данные, то есть размещение записей от 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 плюс application logic действительно лучший способ достичь массового масштаба даже на MySQL, переход на что-то вроде Membase (или его конкурентов вроде Riak) на самом деле не так уж плох.


документов Магазины

Иногда - хотя я бы поспорил реже, чем многие думают - разработать приложения по своей сути требует вторичных индексов, диапазон queryability и т.д. 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 (построено на Big Table), реализуют собственный SQL-подобный язык (Google зовут, аккуратно, GQL для Google Query Language). MongoDB использует новый подход к проблеме запросов с его восхитительным JSON query objects. Тем не менее, SQL сам по себе является мощным инструментом для получения информации из данных, что часто начинается с баз данных.

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

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

+1

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

+0

@ Dan K. +1 Спасибо, я отредактирую с этим как можно скорее –

+0

Это фантастика – Dlongnecker

1

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

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

+2

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

+0

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

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.

1

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

+0

Вау, ответ Аароноуина - это потрясающе. Я чувствую, что удаляю мой, но вместо этого я просто обновляю его ссылкой. –

+0

Этот вопрос был удален в то же время, но я нашел ответ в архиве Stackoverflow и скопировал его здесь: http://stackoverflow.com/questions/4832911/using-a-nosql-database-over-mysql/18315669# 18315669 – str

0

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

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

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

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

+1

Как только я лучше познакомился с базами данных NoSQL, я нашел их намного лучше для прототипирования в том, что я делаю (разработка игрового сервера) одним важным способом: скоростью. Работа схемы замедляет меня, особенно на этапе прототипа, в ходе которого дизайн изменяется быстро и часто резко. Это реальное перетащить, чтобы тратить время на обновление слоя модели и выполнять инструкции ALTER для таблиц, когда база данных schemaless определяется чисто декларативным образом. –

+0

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

+0

Миграция и изменения являются soooo smooth с nosql ... Изменения схемы сосут так плохо. где, если я хочу, чтобы я мог хранить данные в nosql и переносить при необходимости. на самом деле такая практика поощряется. Мне трудно понять, как прототипирование может быть плохим с этой способностью. – hpavc

0

Как несколько человек понравился ответ Aaronaught но соответствующий вопрос был удален в то же время, я скопировал его ответ от Stackoverflow archive:

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

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

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

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

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

  • средне-крупномасштабные базы данных (10-100 ГБ) с достаточно низким параллелизмом (сотни пользователей на большинстве);
  • КИСЛОТА (особенно А и С - Атомность и Консистенция) - это сложное требование;
  • Данные сильно коррелированы (иерархии, мастер-детали, истории);
  • Необходимо хранить широкий ассортимент данных - сотни или тысячи таблиц не являются обычным явлением в нормализованной схеме (больше для таблиц денормализации , хранилищ данных и т. Д.);
  • Запуск на высококачественном оборудовании;
  • Достаточно большой объем капитала (если ваш бизнес имеет миллионы клиентов, то вы, вероятно, можете найти $ 25k или около того behind the couch).

Лидирующих базы данные SQL (SQL Server, Oracle, Teradata, Vertica и т.д.) предназначены для вертикального масштабирования, они любят быть на машинах с большими и большим количеством памяти, быстро ввод/вывод через SANs и SSD и случайное горизонтальное масштабирование посредством кластеризации (HA) и разбиение (HC).

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

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

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

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

Смежные вопросы