2010-08-13 2 views
70

Мы разрабатываем действительно большой проект, и мне было интересно, может ли кто-нибудь дать мне несколько советов о том, какие базы данных БД следует выбрать.Что мне выбрать: MongoDB/Cassandra/Redis/CouchDB?

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

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

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

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

+2

Итак, каковы ваши критерии отбора? Как быстро db? Вы ищете какую-то особенность? Этот вопрос очень расплывчатый. –

+0

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

+1

Связанные? http://stackoverflow.com/questions/2892729/mongodb-vs-cassandra/2894665#2894665 –

ответ

2

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

+1

Clojure имеет встроенную поддержку * транзакционной памяти * транзакций *, а не * базы данных * транзакций (не говоря уже о распределенных транзакциях базы данных). – user359996

4

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

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

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

+0

Спасибо за ответ, мне не нужна онлайн-обработка транзакций только для хранения данных. Я проведу информацию об информатике и дам вам знать. – Juanda

2

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

+0

Я не знал о Риаке. Я дам вам попытку и дам вам знать. Спасибо за ваш ответ! – Juanda

9

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

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

+0

Спасибо за ваш ответ, я проведу Hadoop более глубоко, потому что правда в том, что я не знаком с ним. Большое спасибо! – Juanda

4

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

В этом случае, почему бы не взглянуть на Редиса.

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

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

13

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

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

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

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

Give CouchDB a try.

Заканчивать Why Large Hadron Collider Scientists are Using CouchDB и CouchDB at the BBC as a fault tolerant, scalable, multi-data center key-value store

100

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

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

«Это все о надежности, масштабируемости и скорости Это очень важно, что решение легко масштабируется (MongoDB autosharding?) Просто бросали в более узлов, а скорость. также очень важно

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

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

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

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

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

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

Удачи в вашем проекте.

+0

Хотя вопрос не включал Riak, что вы думаете об этом в этом сценарии? – Mark

+0

+1 для «MongoDB торгует доступностью для согласованности, тогда как CouchDB поддерживает согласованность для доступности». –

27

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

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

В моем опыте работы с рекламной аналитикой (собирая миллиарды точек данных об экспозиции объявлений) является ключевым фактором. Вы собираете необработанные данные, дезактивируете их, а затем помещаете в базу данных, такую ​​как 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 полностью). Самое главное - не ошибиться, думая, что вам нужно иметь данные в одной базе данных и сохранять их навсегда. Агрегация и выброс старых данных являются ключевыми.