Por que o sistema de arquivos é preferido para logs em vez de RDBMS?


44

A pergunta deve ficar clara em seu título. Por exemplo, o Apache salva seus logs de acesso e de erro nos arquivos, em vez do RDBMS, independentemente de quão grande ou pequena escala está sendo utilizada.

Para o RDMS, apenas precisamos escrever consultas SQL e ele fará o trabalho, enquanto que para os arquivos, devemos decidir um formato específico e, em seguida, escrever regex ou podem ser analisadores para manipulá-las. E esses podem até falhar em circunstâncias particulares, se um grande cuidado não for pago.

No entanto, todo mundo parece preferir o sistema de arquivos para manter os logs. Não sou tendencioso contra nenhum desses métodos, mas gostaria de saber por que é praticado dessa maneira. É velocidade ou manutenção ou algo mais?


10
Então, como você registraria erros no banco de dados (db indisponível por exemplo) se o seu sistema de log registrasse em um banco de dados?
Marjan Venema

17
@Marjan Como eu registraria erros no sistema de arquivos se falhar ?!
Yasir

5
É verdade, mas se isso falhar, é provável que o seu banco de dados também esteja inacessível ... Afinal, onde / como ele gravaria em suas tabelas sem o sistema de arquivos?
Marjan Venema

2
@Yasir: Enviar todas as mensagens de log para um servidor syslog antes de entrar para o sistema de arquivos :)
Brian

1
@MarjanVenema o que se o jogo é inútil. E se o disco local estiver cheio, seu registro falhará, mas o aplicativo e o SO podem continuar. Se você estiver efetuando logon em um servidor de banco de dados remoto, ainda poderá fazer logon. Existem prós e contras para armazenar mensagens de log, e o que é melhor depende do que você está tentando obter do log. Desculpe, vou deixar o rebanho voltar ao registro de arquivos é a única maneira verdadeira.
21715 Andy

Respostas:


37
  1. Muitas coisas podem falhar com o banco de dados e o registro dessas falhas também é importante.

  2. A menos que você tenha um sistema de banco de dados que permita transações autônomas (ou nenhuma transação), o registro exigiria uma conexão separada para que uma reversão ou confirmação no registro não interfira na reversão ou confirmação no aplicativo.

  3. Muitas coisas que valem a pena registrar acontecem durante a inicialização, ou seja, possivelmente antes que a conexão com o banco de dados seja estabelecida.

  4. No que poderia ser uma configuração típica, um novo arquivo de log é criado todos os dias, os arquivos de log antigos são compactados e mantidos por 2 semanas, antes de serem excluídos. Não é fácil fazer o mesmo em um RDBMS.


1
Eu tentei esse experimento e não correu bem. O RDBMS foi desenvolvido com base na ideia de que os dados são gravados com pouca frequência em relação ao número de vezes que são lidos. O registro é basicamente o oposto. Você escreve o tempo todo e lê raramente. Essa é uma ótima maneira de irritar seu DBA.
JimmyJames

1
Pode-se considerar o uso de um sistema de banco de dados de séries temporais como o InfluxDB para manter registros; parece-me que é um pouco mais adequado para a tarefa do que, por exemplo, o PostgreSQL. Ainda assim, a vantagem sobre os arquivos de log antiquados quase não existe.
user281377

Usar um banco de dados não relacional com indexação de tokens etc. é definitivamente útil e, se você escolher com sabedoria, eles podem lidar com a mangueira de incêndio. Isso faz parte de como coisas como splunk e flume funcionam.
JimmyJames

# 4 não é realmente um problema. DELETE FROM dbo.Log WHERE LogDate < today minus 2 weeks
Robert Harvey

@RobertHarvey Isso funciona bem até você tentar em um ambiente de carga pesada, onde essas operações em massa podem causar problemas sérios sem precauções extras. Refazer logs preenchendo seu espaço em disco, desfazer espaço para tabelas ficando muito cheio, replicação se tornando muito ocupada em replicar a exclusão etc.
user281377

16

Eu já vi logs gravados no banco de dados antes (e às vezes você obtém opções configuráveis ​​para o log, onde o rastreamento vai para o arquivo, erros no banco de dados, fatais no log de eventos do Windows).

As principais razões são velocidade e tamanho, permitindo que alguns rastreamentos possam produzir vastas e vastas qualidades de registro - eu vasculhei arquivos de log em gigabytes de tamanho. A outra razão principal é que a leitura dos logs precisa ser seqüencial, não há necessidade real de consultar o log, exceto para encontrar um determinado erro ou entrada - e o find-in-file funciona perfeitamente bem para isso.


Mas eu tenho uma confusão por isso. Meu bloco de notas, wordpad, gedit ou bloco de notas ++ ou qualquer navegador da web não ficará satisfeito ao abrir um arquivo com 4 GB de tamanho. O mesmo navegador, no entanto, poderá me mostrar uma lista de mil páginas, cada uma contendo 500 registros impressos. Direito?
Yasir

7
@Yasir porque você está usando editores que tentam carregar o arquivo inteiro na memória. Tente usar um editor mais inteligente capaz de 'transmitir' o arquivo grande. Vim é um bom exemplo.
Nakhli

6
@Yasir: Isso é verdade, mas você está tentando otimizar a coisa errada. Na grande maioria das vezes, os logs são gravados e nunca lidos. Então você torna a criação de logs muito rápida, porque é o caso comum.
Unholysampler

5
Eh, eu já fiz o logon no banco de dados antes e poder consultar facilmente as mensagens de log foi imensamente benéfico, especialmente quando ativamos o log no nível de depuração para rastrear um bug difícil de replicar.
217 Andy

2
@gbjbaanb Eu não achei superestimado, e sinceramente você sugerir o uso de linhas de marca e recortar e colar para consultar é uma piada. A sua não apenas a busca, foram analisadas as tendências para encontrar servidores que tiveram mais problemas do que outros, que tipo de usuários erros estavam vendo na maioria das vezes, etc.
Andy

15

A velocidade é uma razão; outros são:

  • Eliminando pontos de falha. Um sistema de arquivos raramente falha sob condições onde um DBMS não falharia, mas existem muitas e muitas condições de erro nos bancos de dados que simplesmente não existem nos sistemas de arquivos.
  • Acessibilidade de baixa tecnologia. Se tudo der errado, você poderá inicializar em um shell de resgate ou montar o disco em um sistema diferente e ainda ter as ferramentas adequadas disponíveis para inspecionar os arquivos de log. Se for um banco de dados, você não estará em nenhum lugar sem um servidor de banco de dados em execução.

3

Primeiramente.

E esses podem até falhar em circunstâncias particulares, se um grande cuidado não for pago.

As transações do banco de dados não podem falhar quando você não é cuidadoso?

Gravar em um arquivo de texto tem vários benefícios, sendo o mais importante

  • O texto é legível por humanos. Qualquer pessoa pode abrir um arquivo de log com um editor de texto básico e ver quais são as mensagens. Você não precisa entender como o banco de dados está organizado.
  • Rapidez. Gravar texto em disco é muito mais rápido que um serviço de banco de dados descobrindo para onde o texto vai em um banco de dados, gravando-o e garantindo a conclusão da transação.

Obviamente, tudo e qualquer coisa pode falhar se não tomarmos cuidado. Mas para esta pergunta eu estava me referindo ao programador de alto nível. Como um exemplo simples, o programador pode querer separar valores usando um caractere específico. Portanto, sua regex funcionará como um encanto, mas falhará quando o mesmo caractere estiver contido em um bloco de valor. Dessa forma, ele precisa cuidar de casos semelhantes possíveis e não precisa pensar neles se estiver salvando no DB. Além disso, você pode ver meu comentário sobre a resposta de gbjbaanb?
Yasir

1
E se você estiver escrevendo seu SQL manualmente, terá o mesmo problema. A diferença é que a gravação falhará (ou corromperá os seus dados) em vez de incomodar um pouco um desenvolvedor, porque sua sequência de pesquisa trouxe alguns resultados ruins. Sim, existem estruturas que significam que você não precisa escrever SQL, mas cada camada extra atrasa o processo. E lembre-se de que isso é apenas log. Todo ciclo que você usa para registrar é um ciclo que você não está usando para realizar um trabalho real.
Unholysampler

@unholysampler Seu argumento de desempenho é fraco, o log pode ser feito muito rápido e em um encadeamento de segundo plano em um banco de dados, e o log nos f enquanto potencialmente mais rápido também não é gratuito, especialmente se não for feito em segundo plano.
21415 Andy

2

Você criou o Apache especificamente, então discutirei isso em detalhes.

O Apache pode ser configurado para efetuar logon em um banco de dados, embora exija um plug - in externo para fazer isso. O uso desse plug-in pode facilitar a análise de logs, mas apenas se você deseja escrever seu próprio software de análise de logs. Os analisadores de log padrão prontos para uso assumem que seus logs estão em arquivos, portanto você não poderá usá-los.

Quando estava fazendo isso, também tive problemas de confiabilidade: se o buffer de gravação do servidor de banco de dados estiver cheio (o que pode acontecer com o mysql se você usar a cota do sistema de arquivos para o usuário sob o qual ele é executado), ele começará a enfileirar as consultas até conseguir para prosseguir, quando o Apache começa a aguardar a conclusão, resultando em solicitações interrompidas para o seu site.

(Este problema agora pode ser corrigido, é claro - foi há muitos anos que eu fiz isso)


1

Um sistema de arquivos é um banco de dados. É realmente um banco de dados hierárquico mais simples, em vez de um DBMS relacional, mas é um banco de dados.

A razão pela qual o logon em um sistema de arquivos é popular é porque os logs de texto se encaixam bem com a filosofia do Unix: "O texto é a interface universal".

O Unix se desenvolveu com muitas ferramentas de uso geral que podem funcionar bem com logs de texto. Não importa se os logs de texto são produzidos pelo mysql, apache, seu aplicativo personalizado, software de terceiros com muito tempo sem suporte, o sysadmin pode usar ferramentas padrão do Unix, como grep, sed, awk, sort, uniq, cut, tail , etc, para percorrer os logs da mesma forma.

Se cada aplicativo fizer logon em seu próprio banco de dados, um no MySQL, outro no Postgres, outro no Elasticsearch, outro quiser efetuar logon no ELK, outro só puder efetuar logon no MongoDB, você precisará aprender vinte ferramentas diferentes para rastrear os logs de cada inscrição. O texto é um meio universal no qual todos podem fazer logon.

Mesmo quando você consegue fazer com que todos os logs cheguem a um único banco de dados, por exemplo, MySQL, você pode achar que cada aplicativo deseja registrar com esquemas de tabela diferentes, portanto, você ainda precisará escrever uma ferramenta personalizada para consultar os logs para cada inscrição. E se você de alguma forma amontoou todos os aplicativos para efetuar logon em um único esquema, provavelmente descobrirá que esse esquema genérico não pode realmente contar a história completa de cada aplicativo, portanto, você ainda precisará analisar os textos de log de qualquer maneira.

O registro em um banco de dados geralmente não facilita muito as coisas na prática.

O registro em um banco de dados pode ser útil quando você tiver uma análise específica em mente ou para um requisito específico de retenção de auditoria, para o qual é possível projetar um esquema de banco de dados específico para coletar apenas os dados para esses fins específicos. Mas para análise forense e depuração e quando você coleta logs sem objetivo específico em mente, os logs de texto geralmente são bons o suficiente para que o custo de aprender ou criar ferramentas especializadas não valha a pena.


0

Vejamos isso em algumas camadas:

  1. Camada da máquina
  2. Camada do sistema operacional
  3. Camada de serviço
  4. Camada de aplicação

Em resumo:

  • Na camada da máquina, você realmente não pode fazer o registro além de algum tipo de despejo.
  • Na camada do sistema operacional, você pode fazer o registro, mas realmente só tem o sistema de arquivos disponível.
  • Os serviços podem efetuar logon no sistema de arquivos, mas não podem confiar na execução de outros serviços, portanto, não podem fazer logon nesse local.
  • Os aplicativos podem efetuar logon nos serviços e no sistema de arquivos.

Em seguida, temos a abordagem baseada em casos de uso:

Deseja registrar erros específicos do nó em um RDBMS dimensionado horizontalmente, onde você precisa realizar um trabalho extra para encontrar o erro de um nó específico, quando você pode simplesmente abrir o capô do nó e vê-lo lá? Por outro lado, é possível que seu aplicativo faça logon em um RDBMS para coletar avisos e erros no nível do aplicativo.

O que acontece quando o RDBMS precisa fazer o log para si porque o banco de dados não pode ser gravado?


-2

Complexidade. Adicionar RDBMS aumentará a complexidade de todo o sistema astronomicamente. E a capacidade de gerenciar a complexidade é a principal coisa que distingue programadores de produtores de código-fonte.


1
Você poderia expandir o que você quer dizer com complexidade no que se refere ao log em um banco de dados versus um sistema de arquivos? Pela minha experiência, não houve uma diferença significativa na complexidade em um ambiente de negócios.
Adam Zuckerman 24/07

Realmente? SqlLite aumenta a complexidade astronomicamente? E enquanto um servidor Web normalmente não precisaria de um banco de dados, muitos aplicativos LOB já estão usando um, portanto, não há nenhum custo adicional.
217 Andy

@AdamZuckerman, é claro, qualquer RDBMS requer manutenção, propenso a corrupção, pode precisar de ajustes especiais, pode ser afetado por uma configuração ruim, pode precisar de recuperação especial, traz limitações próprias, possui dependências próprias, plataformas suportadas, problemas de atualização, bugs, licenciamento e assim por diante .
noonex 25/07/2015

@ Antes de mais nada, o SQLite não é RDBMS na sessão clássica - é "RDBMS incorporado". E sim - exigir SQLite para registro aumentará muito a complexidade.
25915

1
@noonex Você é arbitrário fazendo uma distinção entre servidor incorporado e servidor completo, quando o RDBMS não. O SqlLite fornece conformidade com ACID, que é realmente o objetivo do RDBMS. E aumenta muito a complexidade? Só posso imaginar que você não trabalhou em nada além da mais trivial das aplicações. Finalmente, um bom trabalho ignorando completamente meu argumento sobre muitos aplicativos LOB já precisava de um banco de dados de qualquer maneira.
217 Andy

-4

É velocidade ou manutenção ou algo mais?

Rapidez.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.