Arquitetura de dados para métricas de log de eventos?

17

Meu serviço tem um grande número contínuo de eventos do usuário e gostaríamos de fazer coisas como "contar a ocorrência do tipo de evento T desde a data D ".

Estamos tentando tomar duas decisões básicas:

  1. O que armazenar? Armazenando todos os eventos vs. armazenando apenas agregados

    • (Estilo do log de eventos) registra todos os eventos e os conta posteriormente, vs.
    • (Estilo de série temporal) armazena uma única "contagem de eventos E para a data D " agregada todos os dias
  2. Onde armazenar os dados

    • Em um banco de dados relacional (particularmente MySQL)
    • Em um banco de dados não relacional (NoSQL)
    • Em arquivos de log simples (coletados centralmente na rede via syslog-ng)

Qual é a prática padrão / onde posso ler mais sobre a comparação dos diferentes tipos de sistemas?


Detalhes adicionais:

  • O fluxo total de eventos é grande, potencialmente centenas de milhares de entradas por dia
  • Mas nossa necessidade atual é apenas contar certos tipos de eventos dentro dela
  • Não precisamos necessariamente de acesso em tempo real aos dados brutos ou resultados de agregação

IMHO, "registre todos os eventos em arquivos, rastreie-os posteriormente para filtrar e agregar o fluxo" é uma maneira UNIX bastante padrão, mas meus compatriotas do Rails-y parecem pensar que nada é real a menos que esteja no MySQL.

elliot42
fonte
1
Alguma sorte neste projeto?
hiwaylon
2
@hiwaylon Acabamos usando um sistema híbrido: 1) MySQL sempre que possível (baixo volume) (facilita a agregação SELECT...GROUP BY, pode armazenar facilmente os resultados de SELECTs), 2) usando o Graphite para agregação e visualização simples em larga escala, e 3) registrar eventos completos para referência e para assistir detalhes do fluxo de dados em tempo real. Cada um tem sido valioso de maneiras diferentes.
precisa saber é o seguinte
Parece uma ótima solução, bem parecida com o que estamos fazendo também.
hiwaylon
1
ATUALIZAÇÃO mais de um ano depois, construímos um sistema que registrava tudo e periodicamente iterava sobre os logs contando coisas, e então armazenávamos esses números contados em um banco de dados (poderia / deveria ser um banco de dados de séries temporais, mas o MySQL era suficiente). Foram algumas semanas de trabalho, mas acabaram sendo uma abordagem surpreendentemente poderosa / rápida - quando é apenas o seu código repetindo o JSON registrado, é fácil adicionar muitos metadados e o código ter regras flexíveis para exatamente o que quer contar.
precisa saber é o seguinte
1
Atualização 2016: Kafka pode fazer esse tipo de coisa hoje em dia, pelo menos para armazenamento bruto. Em seguida, você pode colocá-los em um grande trabalho do MapReduce ou Spark ou em um grande armazém como o Vertica etc., se desejar consultar / agregar sobre eles.
Elliot42

Respostas:

4

Depende sempre, darei meu conselho para oferecer uma nova perspectiva

O que armazenar? Armazenando todos os eventos vs. armazenando apenas agregados

(Estilo do log de eventos) registra todos os eventos e os conta posteriormente, vs.

Se você planeja não perder nenhum detalhe, mesmo que agora não seja relevante, aos meus olhos essa é a melhor abordagem, porque às vezes, conforme os resultados chegam, você encontra outros eventos que para X ou Y não eram relevantes , ou eles não trouxeram nenhuma informação extra, mas, após algumas análises, simplesmente o faz, e você também precisa acompanhar essa, porque, como está gravada, mas não contabilizada, levaria algum tempo para você adicioná-la à imagem .

(Estilo de série temporal) armazena uma única "contagem de eventos E para a data D" agregada todos os dias

Se você deseja implementá-lo e usá-lo amanhã, ele pode funcionar, mas se você tiver um novo requisito ou encontrar uma correlação com outro evento que você omitiu por algum motivo, será necessário adicionar esse novo evento e aguardar um pouco. muito tempo para ter bons níveis de agregação

Onde armazenar os dados

Em um banco de dados relacional (particularmente MySQL)

A primeira opção pode ser pesada para um banco de dados se você gravar todos os eventos, então, receio que o MySQL possa ficar muito pequeno e, se você quiser usar soluções RDBMS, poderá pensar em algo maior, como o PostgreSQL ou proprietário como Oracle ou DB2. .

Mas para a agregação seria uma boa opção, dependendo da carga gerada, você pode agregar no código e inserir essas agregações no banco de dados.

Em um banco de dados não relacional (NoSQL)

Se você optar por esta solução, precisará ver qual abordagem deseja seguir, a boa leitura na wikipedia pode ajudá-lo. Não posso ajudá-lo muito nesse tópico, porque simplesmente não tenho experiência suficiente, principalmente uso rdbms.

Em arquivos de log simples (coletados centralmente na rede via syslog-ng)

Pessoalmente, eu o desencorajaria a optar por essa opção. Se o arquivo crescer muito, seria mais difícil analisar, mas ainda não sei o objetivo principal, é acompanhar o sistema ou simplesmente verificar um log Arquivo ...

Espero que ajude!


fonte
1
Os arquivos de log devem ser girados em tamanho ou comprimento. Eu não acho que a última preocupação seria um problema então.
hiwaylon
1

Acho que sua ideia de analisar logs, contar e armazenar resultados em um banco de dados é válida. Não tenho certeza se você gostaria de todos os logs brutos no banco de dados (acho que foi o que você disse que seus compatriotas estão sugerindo). Você já tem os logs nos arquivos, correto? Você pode simplesmente arquivá-las. Suponho que esse bit realmente dependa dos seus casos de uso.

Também concordo com @ Thorbjørn Ravn Andersen sobre como mover sua "resposta de comentário" para a pergunta.

hiwaylon
fonte
1

Depende do uso pretendido. Se você tem um gráfico ou relatório padrão mostrando valores agregados, basta filtrar os eventos à medida que eles chegam e agregá-los no intervalo apropriado. Se você precisar se aprofundar em eventos específicos ou se achar que pode voltar e analisar novamente / categorizar eventos posteriormente, armazene os eventos individuais.

Se você tem tempo e espaço, o que eu normalmente gosto é agregar os dados, mas armazene os detalhes em um arquivo (compactado). Os detalhes não precisam ser facilmente acessíveis, pois quase nunca preciso deles, mas eles estão disponíveis para reprocessamento em massa se os critérios de classificação mudarem.

TMN
fonte
"agrega os dados, mas armazena os detalhes em um arquivo (compactado)". Grande pensamento em particular, obrigado!
precisa saber é o seguinte
Existem preocupações com o volume de registro do OP mencionado e a filtragem + agregação à medida que entram? Parece que pode ser um gargalo perigoso se o volume do log for alto e / ou a agregação não for trivial.
hiwaylon
O OP mencionou volumes de "centenas de milhares de eventos por dia". Um milhão de eventos por dia é inferior a setecentos por minuto, ou cerca de onze por segundo. A menos que a entrada seja um XML longo, seu servidor médio deve ser capaz de lidar com isso sem se preocupar. Definitivamente, é algo que deve ser considerado ao projetar (e implantar) a solução.
TMN
1

Qualquer decisão de arquitetura deve ser orientada pelas necessidades de negócios. No seu caso, você deve ter uma ideia mais clara de quais informações deseja obter do seu sistema de logs e para decidir como armazenar, com que freqüência precisará dessas informações e quanto tempo pode esperar para obter o resultado . É isso que impulsiona o design de coletores de logs, correlacionadores de eventos e aplicativos similares.

Em vez de dar minha opinião, sugiro que você analise alguns aplicativos semelhantes ao que você tenta desenvolver. Alguns deles podem ser muito mais poderosos do que aquilo que você pretende desenvolver, mas não será prejudicial se você observar as políticas de arquitetura e armazenamento seguidas. No lado profissional, você tem aplicativos SIEM, como RSA e Arcsight, e no lado de código aberto, iniciativas como Kiwi ou OSSIM (que também possui uma versão baseada em dispositivo profissional).

Outra coisa a considerar é que, quando você começar a usar os resultados obtidos pela ferramenta, começará a receber muito provavelmente muitas solicitações de sua gerência para obter mais informações e uma mais detalhada. Então ... use-o com cuidado e planeje com a sua visão no horizonte. Isso pode lhe dar mais trabalho, mas definitivamente você pode obter muito suporte e visibilidade (a pressão vem no pacote) ....

Picarus
fonte