В моем сервисе постоянно присутствует большое количество пользовательских событий, и мы хотели бы сделать что-то вроде «подсчитать вхождение события типа T с даты D ».
Мы пытаемся принять два основных решения:
Что хранить? Хранение каждого события против хранения только агрегатов
- (Стиль журнала событий) регистрировать каждое событие и считать их позже, по сравнению с
- (Стиль временного ряда) хранит единое агрегированное «количество событий E на дату D » за каждый день
Где хранить данные
- В реляционной базе данных (в частности, MySQL)
- В нереляционной (NoSQL) базе данных
- В плоских лог-файлах (собираются централизованно по сети через
syslog-ng
)
Что такое стандартная практика / где я могу прочитать больше о сравнении различных типов систем?
Дополнительные детали:
- Общий поток событий большой, потенциально сотни тысяч записей в день
- Но наша текущая потребность состоит только в том, чтобы считать определенные типы событий в нем
- Нам не обязательно нужен доступ в реальном времени к необработанным данным или результатам агрегации
ИМХО, «записывать все события в файлы, сканировать их позднее для фильтрации и агрегирования потока» - это довольно стандартный способ UNIX, но мои соотечественники Rails-y, похоже, думают, что ничего не реально, если только оно не в MySQL.
SELECT...GROUP BY
, может легко сохранять результаты SELECT
s), 2) использование Graphite для простой крупномасштабной агрегации и визуализации, и 3) регистрация полных событий для справки и для просмотра деталей потока данных в режиме реального времени. Каждый на самом деле был ценным по-разному.