2010-04-15 5 views
1

Я нахожусь на стеке LAMP для веб-сайта, которым я управляю. Необходимо сводить статистику использования (различные вещи, связанные с нашим настольным продуктом).Долгосрочная статистика - мысли о выборе языка?

Я изначально решил проблему с PHP (будучи тем, что у меня было множество классов для работы с данными уже). Все хорошо работало на моей dev-блоке, которая использовала 5.3.

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

Для разработки баз данных MySQL для свертывания статистики для разных периодов и разрешений, потенциально выполняющих процесс, который делает это все время в будущем (в отличие от графика cron), какой язык вы рекомендуете? Я смотрел на Python (я знаю это более или менее), Java (не знаю, что это хорошо), или придерживаться его с PHP (хорошо это знаю).


Edit: дизайн осветление для комментатора

разрешения: Пути сценарий Накопительного работает в настоящее время, у меня есть некоторые классы для определения разрешения и ведер. У меня есть год, месяц, неделя, день - с учетом «числа ведра» каждый класс дает начальную и конечную временную метку, которая определяет временной диапазон для этого ведра - это основано на произвольной дате эпохи. Система поддерживает «полные» записи, т. Е. Заполняет ее свернутый набор данных для каждого разрешения с момента последнего запуска.

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

ВСТАВИТЬ в rolled_up_stats (someval, someval, someval, ...) VALUES (SELECT SUM (somestat) из someschema, ВЫБРАТЬ AVG (somestat2) от someschema2)

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

Edit 2: Добавление некоторых встроенных ответов на вопрос

Язык был узким местом в случае 5.1 PHP - я был по существу сказал, что я сделал выбор неверного языка (хотя скрипты работали отлично на 5.3). Вы упомянули python, который я проверяю для этой задачи. Чтобы быть ясным, то, что я делаю, представляет собой инструмент управления для статистики использования настольного продукта (журналы фактически написаны сервером EJB для таблиц mysql). Я анализирую файл журнала Apache, а также пользовательскую веб-отчетность на веб-странице, но этот проект является отдельным. Подход, который я сделал до сих пор, представляет собой совокупные таблицы. Я не уверен, что эти продукты очереди сообщений могут сделать для меня, я посмотрю.

Чтобы идти немного дальше - данные используются для отображения активности с течением времени на сервисе и уровне клиента, чтобы позволить руководству понять, как используется продукт. Вы можете выбрать период времени (с 1 апреля по 10 апреля) и получить график общих минут использования определенной функции в разных деталях (часы, дни, месяцы и т. Д.) В зависимости от выбранного периода времени. Это, по сути, анализ факта использования.Однако, как представляется, потребность в режиме реального времени идет в сторону реального времени (см. Последний час использования)

+0

1. Почему вы хотите, чтобы он был долговременным? Почему периодическая работа через cron-job недостаточна? 2. Я предположил, что сценарии сворачивания запускают SQL как «INSERT INTO RolledUpTable SELECT SUM (что-то) из RawTable GROUPBY Element_id» или некоторые из них, но вы, похоже, подразумеваете, что свернутые скрипты считывают информацию в процессе , обрабатывать их, а затем вставлять их в БД. Это звучит как странный выбор дизайна. Просьба уточнить ваш вопрос :) – moshez

+0

Добавленные разъяснения ... вроде как нерестится отдельный вопрос, хотя ;-) – Josh

+0

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

ответ

1

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

Если вы хотите использовать эти данные для предоставления кнопок типа «X diggs» на вашем сайте или сводных графиков или чего-то подобного, которые должны быть доступны на какой-либо постоянной основе, вы можете фактически использовать memcache для это, и в вашем коде хранится ключ кэша для конкретной статистики, увеличивая его в соответствующие моменты времени.

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

Если у вас есть тонны и тонны данных, и вам нужны сводные таблицы, вы должны посмотреть на сбор статистики статистики (и, возможно, сами запросы базы данных) до очереди, такой как RabbitMQ или ActiveMQ. На другой стороне очереди помещается демон пользователя, который просто сидит и работает все время, обновляя вещи в базе данных (и, возможно, кеш) по мере необходимости.

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

Я сделал все эти вещи с помощью Python (я выпустил loghetti для работы с журналами с комбинированным форматом Apache, в частности), хотя я не думаю, что язык является ограничивающим фактором или узким местом здесь. Ruby, Perl, Java, Scala или даже awk (в некоторых случаях) будут работать.

+0

Язык был узким местом в случае 5.1 php - мне сказали, что я сделал неправильный выбор языка (хотя скрипты работали нормально на 5.3). Вы упомянули python, который я проверяю для этой задачи. Чтобы быть ясным, то, что я делаю, представляет собой инструмент управления для статистики использования настольного продукта (журналы фактически написаны сервером EJB для таблиц mysql). Я анализирую файл журнала Apache, а также пользовательскую веб-отчетность на веб-странице, но этот проект является отдельным. Подход, который я сделал до сих пор, представляет собой совокупные таблицы. Я не уверен, что делают эти продукты MQ, я посмотрю. – Josh

+0

Чтобы идти немного дальше - данные используются для организации активности с течением времени на службе и уровне клиента, чтобы позволить руководству понять, как используется продукт. Вы можете выбрать период времени (с 1 апреля по 10 апреля) и получить график общих минут использования определенной функции в разных деталях (часы, дни, месяцы и т. Д.) В зависимости от выбранного периода времени. Это, по сути, анализ факта использования. Однако, похоже, потребность в том, что у них есть тенденция к реальному времени (посмотрите на последний час использования) – Josh

0

Если вы используете в основном команды SQL, почему бы просто не использовать MySQL и т. Д. В командной строке? Вы можете создать простую таблицу, в которой перечислены агрегированные данные, а затем выполнить команду, например mysql -u[user] -p[pass] < commands.sql, чтобы передать SQL из файла.

Или разделите работу на более мелкие куски и выполните их последовательно (как файлы PHP, если это проще всего).

Если вам действительно нужно, чтобы это был непрерывный длительный процесс, тогда язык программирования, такой как python или java, был бы лучше, поскольку вы можете создать цикл и поддерживать его на неопределенный срок. PHP не подходит для такого рода вещей. Было бы довольно легко преобразовать любые классы PHP в Java.

+0

См. Пояснение в дизайне. Я добавил примечания о том, как решаются разрешения, чтобы сохранить некоторое подобие здравомыслия относительно того, какие записи соответствуют тем периодам времени, на которых распространяется все вычисления. Что-то вроде этого возможно в необработанных sql-запросах ... или, возможно, есть лучший способ управлять разрешениями? – Josh

1

Я работал над проектом, чтобы сделать подобное в прошлом, поэтому у меня есть реальный опыт работы. Вам будет трудно превзойти исполнение «INSERT ... SELECT» (не «INSERT ... VALUES (SELECT ...)». См. http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

Преимущество в том, что если вы это сделаете, особенно если вы сохраняете код свертки в процедурах MySQL, то все, что вам нужно извне, - это просто cron-задание, чтобы вытолкнуть БД на выполнение правильных свертываний в нужное время - так же просто, как shell-script с «» mysql <correct DB arguments etc.> "CALL RollupProcedure"

Таким образом, вы гарантируете себе ноль ошибок выделения памяти, а также иметь достойную производительность, когда MySQL DB находится на отдельной машине (без перемещения данных через границы машины ...)

EDIT: почасовое разрешение в порядке - просто выполняйте почасовое задание ...

+0

Жаль, что здесь немного дряхлый, я не ниндзя SQL. Я вижу преимущества хранимой процедуры. Однако существует ли решение для данных, охватывающих несколько таблиц? Или вы порекомендовали бы инструкцию INSERT ... SELECT для каждой интересующей нас таблицы? Кроме того, временные разрешения - использовали ли вы время выполнения вашего проекта? IE, последние 24 часа или на прошлой неделе? Я пытаюсь использовать фиксированные периоды (например, с понедельника по понедельник - неделя). Пользователи думали, что выбрать последний понедельник в прошлую среду с разрешением дня должны дать им именно это. Сложно ли хранить хранимые процедуры? – Josh

Смежные вопросы