Need Advice: Является ли это хорошим вариантом для базы данных "NoSQL"? Если да, то какой?

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

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

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

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

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

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

Является ли решение "NoSql" правильным для этой работы? Если да, то какие?

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

Пример для разъяснения:

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

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

Ответ 1

Простой ответ заключается в том, что нет простого ответа на подобные проблемы, единственный способ узнать, что работает для вашего сценария, - это инвестировать R & D время в него.

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

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

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

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

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

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

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

Rev1:

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

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

Итак, посмотрите модель объекта-атрибута, поскольку я думаю, что это точно подходит для того, что вам нужно.

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

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

Ответ 2

Хорошо, я мог бы заплакать за то, что не ответил на ваш вопрос напрямую, но я все равно скажу это, потому что я думаю, это то, что вы должны рассмотреть. У меня нет опыта работы с базами данных 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 поддерживает эту функцию, вы можете даже разбить таблицу Measurements на столбец клиента.

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

ИЗМЕНИТЬ

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

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

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

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

Ответ 3

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

  • Переместите БД на дорогой голый металл.
  • Пересмотреть решения NoSQL.

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

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

Ответ 4

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

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