Подтвердить что ты не робот

Что мне выбрать: MongoDB/Cassandra/Redis/CouchDB?

Мы разрабатываем действительно большой проект, и мне было интересно, может ли кто-нибудь дать мне несколько советов о том, какие базы данных БД следует выбрать.

Наша система соединена 1100 электронными устройствами, которые отправляют сигнал на центральный сервер, а затем сервер сохраняет информацию о сигнале (длина сигнала около 35 байтов). Как бы эти устройства не посылали по 3 сигнала в минуту каждый, поэтому, если мы будем делать цифры, это будет 4.752.000 новых записей/день в базе данных и в общей сложности 142.560.000 новых записей/месяц.

Нам нужен Бэкэк БД, который быстро и надежно работает. Конечно, нам нужно сделать сложный анализ данных в этой БД. Мы проводим исследования MongoDB/Cassandra/Redis/CouchDB, однако веб-сайты документации все еще находятся на ранних стадиях.

Любая помощь? Идеи?

Спасибо большое!

4b9b3361

Ответ 1

Не позволяйте пространственному масштабу (1000+ устройств) вводить вас в заблуждение относительно вычислительной и/или шкалы хранения. Несколько дюжин 35-байтовых вставок в секунду - это тривиальная рабочая нагрузка для любой СУБД основного уровня, даже работающая на аппаратных средствах младшего класса. Точно так же 142 миллиона записей в месяц составляют порядка 1 ~ 10 гигабайт памяти в месяц без сжатия, включая индексы.

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

"Все дело в надежности, масштабируемости и скорости. Очень важно, чтобы решение масштабировалось легко (автообновление MongoDB?) просто бросало больше узлов, а скорость также очень важна

Надежность? Любая основная СУБД может гарантировать это (предполагая, что вы имеете в виду, что это не приведет к повреждению ваших данных, и это не приведет к сбою - см. Мое обсуждение теоремы CAP в нижней части этого ответа). Скорость? Даже с одной машиной, 10 ~ 100 раз эта рабочая нагрузка не должна быть проблемой. Масштабируемость? При нынешнем курсе данные за полный год, несжатые, даже полностью индексированные, легко вписывались бы в 100 гигабайт дискового пространства (аналогично, мы уже установили скорость вставки, это не проблема).

Таким образом, я не вижу явной потребности в экзотическом решении, таком как NoSQL, или даже в распределенной базе данных - простая, реляционная база данных, такая как MySQL, будет прекрасной. Если вы беспокоитесь об отказе, просто настройте резервный сервер в конфигурации "ведущий-ведомый". Если мы говорим 100 или 1000 раз от текущего масштаба, просто горизонтально разделяем несколько экземпляров на основе идентификатора устройства сбора данных (т.е. {Индекс раздела} = {идентификатор устройства} по модулю {количество разделов}).

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

Все сказанное, MongoDB и CouchDB необычайно просты в развертывании и работе. Они также очень забавны и сделают вас более привлекательными для любого количества людей (а не только для программистов - руководителей тоже!).

Общая мудрость заключается в том, что из трех предложенных NoSQL решений Cassandra является лучшим для большого объема вставки (конечно, относительно говоря, я не думаю, что у вас высокий объем вставки - это было предназначено для использования Facebook); этому препятствует трудность работы. Поэтому, если у вас нет каких-то странных требований, о которых вы не упомянули, я бы рекомендовал против этого, для вашего случая использования.

Если вы положительно настроены на развертывание NoSQL, вам может потребоваться рассмотреть теорему CAP. Это поможет вам решить между MongoDB и CouchDB. Здесь хорошая ссылка: http://blog.nahurst.com/visual-guide-to-nosql-systems. Все сводится к тому, что вы подразумеваете под "надежностью": MongoDB торгует доступностью для согласованности, тогда как CouchDB поддерживает согласованность для доступности. (Cassandra позволяет вам усовершенствовать этот компромисс в каждом запросе, указав, сколько серверов должно быть записано/прочитано для записи/чтения для успеха, UPDATE: теперь CouchDB, с BigCouch! Очень интересно...)

Желаем удачи в вашем проекте.

Ответ 2

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

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

В моем опыте работы с рекламной аналитикой (сбор миллиардов точек данных об экспозиции объявлений) ключевой является агрегация. Вы собираете необработанные данные, дезактивируете их, а затем помещаете в базу данных, такую ​​как MongoDB, Cassandra или даже MySQL, которые позволяют выполнять обновления и запросы. Затем вы периодически агрегируете данные и удаляете их из базы данных (но архивируете необработанные данные, возможно, вам понадобится это позже).

Агрегация по существу задает все вопросы, которые вы хотите задать о данных, и сохраняет их в форме, которая упрощает получение ответа для определенного вопроса. Скажите, что вы хотите знать, в какой день недели больше всего X. Наивная реализация этого будет заключаться в том, чтобы сохранить все записанные сигналы в огромной таблице и сделать запрос, который суммирует все строки, которые имеют X. Поскольку количество собранных сигналы растут, этот запрос займет больше времени и дольше. Никакое количество индексирования, ошпаривания или оптимизации не поможет. Вместо этого каждый день/час/минута (в зависимости от конкретного варианта использования и насколько актуальна ваша отчетность должна быть) вы смотрите на новые сигналы, которые вы записали, и для каждого X вы увеличиваете счетчик, который отслеживает, сколько X там было по понедельникам, если это понедельник, вторник, если это вторник и так далее. Таким образом, вы можете позже получить счет за каждый день недели и сравнить их. Вы делаете это по всем вопросам, на которые хотите ответить, а затем удаляете сигналы из базы данных (но опять же, сохраняйте необработанные данные).

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

В старой школе хранилище данных говорит, что база данных, в которой хранятся входящие сигналы, называется OLTP (для транзакционной обработки в режиме on-line), а база данных, в которой хранятся агрегаты, называется OLAP (для оперативной аналитической обработки). OLTP оптимизирован для вставки, а OLAP оптимизирован для запросов. Термины старые, и когда люди их слышат, они склонны сразу думать о SQL и звездах и тому подобное. Возможно, я не должен их использовать, но они удобны.

Во всяком случае, для OLTP вы хотите что-то быстро вставлять данные, но также и то, что поддерживает индексирование данных и поиск вещей. Агрегации в значительной степени помогает база данных, которая выполняет половину работы по суммированию и нахождению максимумов и минимумов. Мне очень нравится MongoDB, потому что он так легко настраивается и работает. Данные, с которыми я работаю, имеют тенденцию быть грязными, и не все элементы имеют один и тот же набор свойств, поэтому прощающая схематичность Монго - благо. С другой стороны, ваши данные звучат гораздо более однородно, поэтому Mongo, возможно, не даст вам столько преимуществ. Не упускайте из виду старые старые реляционные базы данных. Если вы собираетесь делать много суммирования и т.д., То SQL отлично, для чего он создан.

Для OLAP что-то гораздо более простое, хранилище значений ключей - это все, что вам нужно. Я использую Redis, потому что с ним тоже очень легко работать и настраиваться. Он также позволяет хранить больше скалярных значений, что удобно. Иногда ваше значение на самом деле является списком или хешем, в большинстве хранилищ для ключей, вы должны кодировать такие значения, но Redis обрабатывает его изначально. Недостатком Redis является то, что вы не можете делать запросы ( "как и для всех строк, которые имеют это значение для Y" ), вы должны сами хранить индексы к своим данным. С другой стороны, вам не нужны индексы очень сильно, так как ответы на все ваши вопросы были предварительно вычислены, все, что вам нужно сделать, это найти ответ на ключ, который задан вопросом. Для вопроса выше, в какой день недели больше всего Х, вы просматриваете количество X работы в понедельник, вторник и т.д., Возможно, вы сохранили их как X: понедельник, X: вторник и т.д.

В заключение: MongoDB и Redis отлично подходят для меня. Я не думаю, что MongoDB очень хорош для вашего случая использования, вместо этого я думаю, что на самом деле вам может пригодиться больше из традиционной базы данных SQL (но это зависит, если ваши данные действительно просты, вы, возможно, можете использовать Redis полностью). Самое главное - не ошибиться, думая, что вам нужно иметь данные в одной базе данных и сохранять их навсегда. Агрегация и удаление старых данных являются ключевыми.

Ответ 3

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

Благодаря своим возможностям репликации и RESTful API (он использует HTTP для своего API), вы можете масштабировать горизонтально довольно легко, используя зрелые инструменты. (Nginx или Apache для обратного проксирования, балансировщики нагрузки HTTP и т.д.)

Вы пишете функции отображения/сокращения в JavaScript для предкомпрометирования запросов. Результаты создаются постепенно на диске, что означает, что они только подсчитываются один раз для каждого сигнала. Другими словами, запросы могут быть очень быстрыми, потому что они должны выполнять вычисления только по данным сигнала, записанным с момента последнего запроса запроса.

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

Дайте CouchDB попробовать.

Отъезд Почему больший адронный коллайдер Ученые используют CouchDB и CouchDB на BBC как отказоустойчивое, масштабируемое хранилище ключей для центров данных с несколькими данными

Ответ 4

~ 3000 сигналов/мин = 50 записей/с, с которыми любая из этих систем будет легко справляться.

Cassandra, вероятно, будет работать лучше всего, так как ваш набор данных будет больше, чем память, и интеграция Hadoop поможет вам в добыче данных.

Ответ 5

Итак, вы храните данные в центральном db для сбора данных? Нет обработки онлайн-транзакций?

Я не думаю, что MongoDB делает хорошую работу, когда дело доходит до долговечности. См. http://nosql.mypopescu.com/post/392868405/mongodb-durability-a-tradeoff-to-be-aware-of.

Возможно, вы можете использовать аналитику db Infobright, у нее есть версия сообщества: http://www.infobright.org/?

Ответ 6

Вы ищете хранилище данных, которое позволяет записывать "молниеносно" (данные сохраняются на диске), а обработка данных будет происходить на более позднем этапе (это цикл READ). Кроме того, учитывая цифры, которые вы заявляете, выясняется, что вы будете собирать всю 159 МБ информации в день, или около 5 ГБ в месяц.

В этом случае, почему бы не посмотреть на Redis.

Вы всегда можете архивировать ежедневный файл данных Redis и ссылаться на него позже (если у вас есть проблемы с загрузкой 5 ГБ или большего объема оперативной памяти, тогда вы можете сделать это архивирование)

Redis довольно быстро, на основе номеров, опубликованных на этом сайте. Надеюсь это поможет. Киран

Ответ 7

Я использовал MongoDB от Incanter и ему понравилось. Хотя я не могу говорить со скоростью с такими большими наборами данных, Clojure (на котором основан Incanter) очень надежна с точки зрения управления транзакциями. Incanter также предоставляет отличные инструменты анализа, поэтому, если вы планируете анализировать все эти данные, MongoDB + Incanter может быть мощной комбинацией.

Ответ 8

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