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:
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
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.
SELECT...GROUP BY
, pode armazenar facilmente os resultados de SELECT
s), 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.