Большая часть ответа зависит от того, что вы хотите сделать с ним после его сбора. Хранение большого количества данных легко: просто вставьте его в файлы журналов, нет необходимости в базе данных. С другой стороны, если вы хотите выполнить сложный анализ и интеллектуальный анализ данных, тогда база данных будет полезна.
Следующий вопрос - какой анализ вы собираетесь делать. Будет ли он выполняться на подмножестве данных, имеющих конкретное свойство, только за последний час/день/неделю/месяц, могут ли данные агрегироваться или как-то предварительно вычисляться? Другими словами: вам нужен доступ ко всему набору данных в том виде, в котором он собирается? Можете ли вы архивировать данные, когда они становятся слишком старыми, чтобы быть интересными? Можете ли вы объединить данные и выполнить анализ агрегации?
В моем опыте работы с рекламной аналитикой (собирая миллиарды точек данных об экспозиции объявлений) является ключевым фактором. Вы собираете необработанные данные, дезактивируете их, а затем помещаете в базу данных, такую как 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 полностью). Самое главное - не ошибиться, думая, что вам нужно иметь данные в одной базе данных и сохранять их навсегда. Агрегация и выброс старых данных являются ключевыми.
Итак, каковы ваши критерии отбора? Как быстро db? Вы ищете какую-то особенность? Этот вопрос очень расплывчатый. –
Все дело в надежности, масштабируемости и скорости. Очень важно, чтобы решение масштабировалось легко (MongoDB autosharding?), Просто бросая больше узлов, и скорость также очень важна. – Juanda
Связанные? http://stackoverflow.com/questions/2892729/mongodb-vs-cassandra/2894665#2894665 –