Архітектура даних для показників журналу подій?


17

У моїй службі є велика кількість постійних подій користувачів, і ми хотіли б зробити такі дії, як "рахувати виникнення події типу T з дати D ".

Ми намагаємось прийняти два основні рішення:

  1. Що зберігати? Зберігання кожної події проти зберігання агрегатів

    • (Стиль журналу подій) реєструйте кожну подію та підраховуйте їх пізніше,
    • (Стиль часових рядів) зберігає одну зведену "кількість подій Е на дату D " на кожен день
  2. Де зберігати дані

    • У реляційній базі даних (зокрема, MySQL)
    • У нереляційній (NoSQL) базі даних
    • У файлах плоских журналів (збираються централізовано по мережі через syslog-ng)

Що таке стандартна практика / де я можу прочитати більше про порівняння різних типів систем?


Додаткові дані:

  • Загальний потік подій великий, потенційно - сотні тисяч записів на день
  • Але наша сьогоднішня потреба полягає лише в підрахунку певних типів подій всередині нього
  • Нам не обов’язково потрібен доступ у режимі реального часу до вихідних даних або результатів агрегації

IMHO, "записуйте всі події у файли, скануйте їх пізніше, щоб фільтрувати та агрегувати потік" - це досить стандартний шлях UNIX, але мої співвітчизники Rails-y, здається, вважають, що нічого не є реальним, якщо це не в MySQL.


1
Будь-яка удача в цьому проекті?
hiwaylon

2
@hiwaylon Ми закінчили використання гібридної системи: 1) MySQL, де це можливо (низький об'єм) (сукупність дозволяє легко використовувати SELECT...GROUP BY, можна легко зберігати результати SELECT), 2) за допомогою Graphite для простого масштабного агрегування та візуалізації, і 3) реєстрація повних подій для довідки та для перегляду деталей потоку даних у режимі реального часу. Кожен насправді був цінним по-різному.
elliot42

Це звучить як чудове рішення, досить схоже на те, що ми робимо також.
hiwaylon

1
ОНОВЛЕННЯ через рік ми побудували систему, яка реєструвала все, і періодично повторювала журнали підрахунку речей, а потім зберігала ці відлічені числа в базі даних (могла / повинна була бути база даних часових рядів, але MySQL вистачило). Це було кілька тижнів роботи, але в кінцевому підсумку виявився напрочуд потужним / швидким підходом - коли лише ваш код повторюється через зареєстрований JSON, легко додати багато метаданих, а у вашому коді легко бути гнучкими правила для того, що саме воно хоче порахувати.
elliot42

1
Оновлення 2016: Кафка може робити ці речі сьогодні, принаймні для зберігання в сирому середовищі. Тоді ви можете або вставити їх у велику роботу MapReduce або Spark, або у великий склад, наприклад, Vertica тощо.
elliot42

Відповіді:


4

Це завжди залежить, я дам вам поради, щоб запропонувати вам нову перспективу

Що зберігати? Зберігання кожної події проти зберігання агрегатів

(Стиль журналу подій) реєструйте кожну подію та підраховуйте їх пізніше,

Якщо ви плануєте не пропустити жодної деталі, хоча зараз вони не актуальні, на моїх очах це найкращий підхід, тому що іноді, коли результати приходять, то ви виявляєте деякі інші події, які для X чи Y вони не були актуальними або вони не принесли ніякої додаткової інформації, але після деякого аналізу це просто так, і вам потрібно також відстежити цю, тому що її записана, але не врахована, потребує певного часу, перш ніж ви зможете додати її до зображення .

(Стиль часових рядів) зберігає одну зведену "кількість подій Е на дату D" на кожен день

Якщо ви хочете реалізувати та використати його завтра, він може спрацювати, але тоді, якщо у вас є нові вимоги або ви виявите кореляцію з іншою подією, яку ви пропустили з будь-якої причини, тоді вам потрібно додати цю нову подію, а потім зачекати деякі довго мати приємні рівні агрегації

Де зберігати дані

У реляційній базі даних (зокрема, MySQL)

Перший варіант може бути важким для БД, якщо ви збираєтеся записувати всі події, тому MySQL, я боюся, може стати занадто маленьким, і якщо ви хочете перейти на рішення RDBMS, ви можете здатися більшими, як PostgreSQL або патентованими як Oracle або DB2 .

Але для агрегування буде хорошим вибором, залежно від сформованого навантаження ви можете об'єднати в код і вставити ці агрегації в БД.

У нереляційній (NoSQL) базі даних

Якщо ви вирішите скористатися цим рішенням, вам слід побачити, який підхід ви хочете дотримуватися приємного прочитання у Вікіпедії, можливо, вам допоможе, я не можу допомогти вам на цю тему, тому що у мене просто недостатньо досвіду, я в основному використовую rdbms.

У файлах плоских журналів (збираються централізовано по мережі через syslog-ng)

Я особисто заважав би вам скористатися цим варіантом. Якщо файл зростає занадто сильно, було б складніше розібратися, але все одно я не знаю основної мети - це слідкувати за системою або просто перевірити журнал файл ...

Сподіваюся, це допомагає!


1
Файли журналу слід обертати за розміром або довжиною. Я не думаю, що тоді остання проблема буде проблемою.
hiwaylon

1

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

Також погоджуйтеся з @ Thorbjørn Ravn Andersen щодо переміщення вашої "коментарної відповіді" на питання.


1

Залежить від призначеного використання. Якщо у вас є стандартний графік або звіт із сукупними значеннями, вам потрібно просто відфільтрувати події під час їх надходження та об'єднати їх у відповідне відро. Якщо вам потрібно детальніше ознайомитись з конкретними подіями або якщо ви думаєте, що ви хочете повернутися назад і переаналізувати / перекласифікувати події пізніше, то вам слід зберегти окремі події.

Якщо у вас є час і простір, я зазвичай люблю це збирати дані, але зберігати дані у (стисненому) файлі. Деталі не повинні бути легкодоступними, оскільки я майже ніколи не потребую їх, але вони доступні для масової повторної обробки, якщо зміниться критерії класифікації.


"агрегувати дані, але зберігати дані у (стисненому) файлі". Велика думка зокрема, дякую!
elliot42

Чи є проблеми з обсягом реєстрації згаданих ОП та фільтруванням + агрегуванням, коли вони надходять? Здається, що це може бути небезпечним вузьким місцем, якщо об'єм журналу великий та / або агрегація нетривіальна.
hiwaylon

ОП згадувало обсяги "сотень тисяч подій на день". Мільйон подій на день - це менше семисот на хвилину, або приблизно одинадцять секунди. Якщо введення не є тривалим XML, ваш середній сервер повинен мати можливість це впоратися, не порушуючи поту. Це, безумовно, щось, що слід враховувати при розробці (і розгортанні) рішення.
TMN

1

Будь-яке рішення архітектури повинно визначатися потребами бізнесу. У вашому випадку ви повинні мати більш чітке уявлення про те, яку інформацію ви хочете отримати з вашої системи журналів, і щоб вирішити, як зберігати, як часто вам буде потрібно ця інформація та скільки часу ви можете чекати, щоб отримати результат . Саме це визначає дизайн колекторів журналів, кореляторів подій та подібних програм.

Замість того, щоб дати вам свою думку, я пропоную вам переглянути деякі програми, схожі на те, що ви намагаєтеся розробити. Деякі з них можуть бути набагато потужнішими, ніж те, що ви робите вигляд, що розвиваєтесь, але це не зашкодить, якщо ви подивитесь на політику архітектури та зберігання, яку слід. З боку професіоналів у вас є такі програми SIEM, як RSA та Arcsight, а на відкритій стороні у вас є такі ініціативи, як Kiwi або OSSIM (що також має професійну версію для приладів).

Ще слід врахувати, що коли ви почнете використовувати результати, отримані інструментом, ви почнете отримувати дуже багато запитів від вашого керівництва для отримання додаткової інформації та більш детального. Отже ... використовуйте це обережно і плануйте своїм поглядом на горизонті. Це може дати вам більше роботи, але, безумовно, ви можете отримати багато підтримки та наочності (тиск приходить в комплекті) ....

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.