Статистика в реальном времени: MySQL (/Drizzle) или MongoDB?

#mysql #mongodb #statistics #drizzle

#mysql #mongodb #Статистика #морось

Вопрос:

Мы работаем над проектом, который будет отображать статистику некоторых действий (например, кликов) в реальном времени. При каждом нажатии мы будем регистрировать такую информацию, как дата, возраст и пол (они поступают с Facebook), Местоположение и т.д.

Мы обсуждаем, где лучше хранить эту информацию и использовать ее для статистики в реальном времени. Мы будем отображать совокупную статистику: например, количество кликов, количество кликов, сделанных мужчинами / женщинами, количество кликов, разделенных по возрастным группам (например, 18-24, 24-30 …).

Поскольку на сайте мы повсеместно используем MongoDB, мой коллега подумал, что нам следует хранить статистику и внутри него. Я, однако, предпочел бы базу данных на основе SQL для этой задачи, такую как MySQL (или, возможно, Drizzle), потому что я считаю, что SQL лучше при выполнении операций, таких как агрегирование данных. Хотя разбор SQL сопряжен с накладными расходами, я думаю, что MySQL / Drizzle на самом деле может быть быстрее, чем базы данных без SQL. И вставки тоже не замедляются при использовании запросов С ЗАДЕРЖКОЙ ВСТАВКИ.

Пожалуйста, обратите внимание, что нам не нужно выполнять ОБЪЕДИНЕНИЯ или собирать данные из нескольких таблиц / коллекций. Таким образом, нам все равно, отличается ли база данных. Тем не менее, мы заботимся о масштабируемости и надежности. Мы создаем что-то, что (надеюсь) станет очень большим, и мы разработали каждую строку кода с учетом масштабируемости.

Что вы думаете по этому поводу? Есть ли какая-либо причина предпочесть MongoDB вместо MySQL / Drizzle для этого? Или это безразлично? Какую из них вы бы использовали на нашем месте?

Спасибо, Алессандро

Комментарии:

1. Просто как предложение -> взгляните на RddTool mrtg.org/rrdtool это может быть полезно

2. Спасибо, но это не тот вид статистики, который мы ищем! У нас будет что-то больше похожее на статистику видео на YouTube… Что-то вроде: reelseo.com/wp-content/uploads/2010/06/youtube-video-stats.png

Ответ №1:

Итак, BuddyMedia использует что-то из этого. Группа Gilt сделала кое-что довольно крутое с Hummingbird (node.js MongoDB).

Работая на крупного онлайн-рекламодателя в пространстве социальных сетей, я могу подтвердить, что отчетность в реальном времени — это действительно боль. Попытка «накапливать» 500 МИЛЛИОНОВ показов в день уже является сложной задачей, но попытка сделать это в режиме реального времени сработала, но имела некоторые существенные ограничения. (как будто это действительно было отложено на 5 минут 🙂

Честно говоря, такого рода проблемы — одна из причин, по которой я начал использовать MongoDB. И я не единственный. Люди используют MongoDB для всех видов аналитики в реальном времени: мониторинга сервера, централизованного ведения журнала, а также отчетов на панели мониторинга.

Главное при создании отчетов такого типа — понимать, что структура данных в MongoDB совершенно иная, вы собираетесь избегать запросов «агрегации», поэтому запросы и выходные диаграммы будут другими. На стороне клиента выполняется дополнительная работа по кодированию.

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

 {
  date: "20110430",
  gender: "M",
  age: 1, // 1 is probably a bucket
  impression_hour: [ 100, 50, ...], // 24 of these
  impression_minute: [ 2, 5, 19, 8, ... ], // 1440 of these
  clicks_hour: [ 10, 2, ... ],
  ...
}
  

Очевидно, что здесь есть некоторые настройки, соответствующие индексы, возможно, объединение данных пол возраст в _id . Но это своего рода базовая структура аналитики кликов с MongoDB. Действительно легко обновлять показы и клики { $inc : { clicks_hour.0 : 1 } } . Вы можете обновлять весь документ атомарно. И это на самом деле довольно естественно для отчетов. У вас уже есть массив an, содержащий ваши данные на уровне часов или минут.

Надеюсь, это указывает вам правильное направление.

Комментарии:

1. как бы вы тогда суммировали это для статистики?

2. Лучший способ агрегировать большой объем данных — использовать некоторую форму Map / Reduce framework (думаю, Hadoop). Если вы отслеживаете что-то вроде клика, вы бы сначала проверили клик, затем вы бы проверили счетчики в реальном времени, затем вы бы передали данные о кликах в M / R систему для полной агрегации. Этот материал в реальном времени работает, только если вы заранее знаете, чего хотите.

Ответ №2:

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

Взгляните на презентацию Патрика Стокса из BuddyMedia о том, как они использовали MongoDB для своей аналитической системы.

http://www.slideshare.net/pstokes2/social-analytics-with-mongodb

Комментарии:

1. На самом деле, я тот, кто был на «стороне MySQL» 🙂 Мой коллега был тем, кто проголосовал за MongoDB… В любом случае, спасибо за эти слайды. В итоге я понял, что мы делаем это неправильно! Нам нужно будет переосмыслить структуру нашей коллекции.