Нужна консультация: это хороший вариант использования базы данных NoSQL? Если да, то какой? - PullRequest
10 голосов
/ 24 сентября 2010

Я недавно изучал варианты NoSql.Мой сценарий выглядит следующим образом:

Мы собираем и храним данные с нестандартного оборудования в удаленных местах по всему миру.Мы записываем данные с каждого сайта каждые 15 минут.В конечном итоге мы хотели бы перейти на каждую 1 минуту.Каждая запись имеет от 20 до 200 измерений.Однажды настройте аппаратные записи и сообщайте об одних и тех же измерениях каждый раз.

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

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

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

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

Подходит ли решение «NoSql» для этой работы?Если да, то какие?

Я исследовал MongoDB, и это кажется многообещающим ...

Пример для уточнения:

В проекте 1 записано 5 точек данных, таблица mysqlстолбцы выглядят так: метка времени, температура, скорость ветра, осадки, освещенность, направление ветра

В проекте 2 записаны 3 точки данных. Столбцы таблицы mysql: метка времени, температура, освещенность, температура2

Ответы [ 4 ]

4 голосов
/ 29 сентября 2010

Простой ответ заключается в том, что простого ответа на подобные проблемы не существует, единственный способ узнать, что работает для вашего сценария, - это потратить на него время НИОКР.

На этот вопрос сложно ответить, поскольку требования к производительности не прописаны в ОП.Похоже, это 75 миллионов записей в год для ряда клиентов со скоростью записи num_customers * 1 минута (что мало), но у меня нет данных о требуемой производительности чтения / запроса.

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

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

В зависимости от того, чего вы пытаетесь достичь, я посмотрю на MongoDB , Apache Cassandra , Apache HBase или Hibari .

Помните, что NoSQL - это неопределенный термин, обычно охватывающий

  • Приложения, которые требуют высокой производительности при чтении или записи.Часто жертвует производительностью чтения или записи за счет другого.
  • Распределение и масштабируемость
  • Различные методы сохранения (RAM / Disk)
  • Более структурированный / определенный шаблон доступаусложнение специальных запросов.

Итак, во-первых, я посмотрю, сможет ли традиционная СУБД достичь требуемой производительности, используя все доступные методы, получить копию High PerformanceMySQL и прочитайте MySQL Performance Blog .

Rev1:

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

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

Итак, посмотрите на Entity-attribute-Значение модели как мне кажется, это именно то, что вам нужно.

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

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

2 голосов
/ 27 сентября 2010

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

Прежде всего - отбросьте 1 таблицу для каждого клиента.Вместо этого я разработал бы схему «многие ко многим», в которой были бы следующие таблицы:

  • Клиенты
  • MeasurementTypes
  • Измерения

Таблица Customers будет содержать информацию о клиенте и уникальное поле CustomerID:

   CustomerID      | CustomerName  |   ..and other fields
 ---------------------------------------------------------------------

Таблица MeasurementTypes будет описывать каждый тип измерения, который вы поддерживаете, и назначать уникальное имя (поле MeasurementType) для ссылки.к нему:

   MeasurementType | Description   |  ..and other pertinent fields
 ---------------------------------------------------------------------

Таблица измерений - это место, где агрегируются все данные.У вас будет одна запись для каждой собранной точки данных с отметкой идентификатора клиента, типа измерения, отметки времени и уникального идентификатора «партии» (чтобы можно было группировать точки данных из каждого измерения) - и, конечно,значение измерения.Если вам нужны разные типы значений для ваших измерений, вам может потребоваться немного креативнее с дизайном, но, скорее всего, все значения измерений могут быть представлены одним типом данных.

  Customer  | MeasurementBatch |  MeasurementType  |  Timestamp  |     Value   |
--------------------------------------------------------------------------------
      1     |    {GUID}        |  'WIND_SPEED'     |      ...    |    ...
--------------------------------------------------------------------------------
            |                  |                   |             |             |

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

Если ваш движок SQL поддерживает эту функцию, вы можете даже разбить таблицу измерений по столбцу клиента.

Надеюсь, это поможет ..

РЕДАКТИРОВАТЬ

Я должен отметить, что я никоим образом не связан с Microsoft и не пытаюсь дать им бесплатную рекламу - так уж сложилось, что я больше всего знаком с ихSQL-сервер.

На основании комментария Алана - относительно того, может ли база данных SQL поддерживать объем данных в несколько тысяч миллионов записей в год с возможностью увеличения до миллиарда записей в год - есть хорошее резюмеограничений / спецификаций для сервера MS SQL можно найти здесь:

http://msdn.microsoft.com/en-us/library/ms143432.aspx

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

0 голосов
/ 24 апреля 2012

FWIW: После полутора лет работы и масштабирования схемы EAV в MySQL мы получили точку, в которой наш выбор был:

  1. Перевести БД на дорогостоящее железо.
  2. Повторное исследование решений NoSQL.

В итоге мы выбрали Cassandra и использовали схему, находящуюся под сильным влиянием проекта OpenTSDB.

Cassandra - очень сильный выбордля хранения данных временных рядов и полностью соответствует нашим требованиям.

0 голосов
/ 24 сентября 2010

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

С точки зрения NOSQL это зависит от вашей модели данных и шаблонов использования, но если у вас много клиентов и вы предпочитаете эту модель, то представления couchdb могут решить эту проблему, поскольку couchdb может поддерживать тысячи представлений. Вы можете хранить все данные в одной базе данных в couchdb, но иметь представление для каждого клиента. Я понятия не имею, как mongodb мог решить эту проблему.

...