usando o VFS para fazer montagem dinâmica

1

Eu tenho o que pode soar como uma situação estranha. Eu tenho um ponto de montagem para um diretório contendo uma variedade de arquivos de log. De tempos em tempos, é necessário desmontar este diretório e remontá-lo em um local diferente. (Você pode pensar nisso como outra maneira de fazer logrotate , embora essa não seja a intenção principal.)

O problema é que este é um sistema ativo, e há arquivos de log sempre abertos. Antes de desmontar e remontar, posso tentar primeiro parar todos os processos que estão sendo gravados e reiniciá-los após a remontagem, mas na minha situação nem sempre posso garantir isso. Os processos que podem ser registros não estão sob meu controle, e pode sempre haver um novo que minha rotina de comutação de montagem não tenha ouvido falar. Ou alguém pode ter logado interativamente e alterado para o diretório de registro. (Além disso, alguns processos não podem ser interrompidos sem potencialmente desestabilizar as coisas.) Mas qualquer processo que esteja gravando em um arquivo no diretório de criação de log ou tenha o diretório de log como seu diretório atual, impede a desmontagem e impede que minha alternância funcione. em tudo.

Então, o que estou pensando em fazer é tentar usar um "sistema de arquivos dinâmico de comutação de montagem" hipotético. Isso seria basicamente um simples sistema de arquivos virtual de passagem que mapeou todas as operações do sistema de arquivos até um sistema de arquivos real subjacente, mas com a capacidade de redirecionar dinamicamente o mapeamento para um sistema de arquivos real subjacente diferente em qualquer tempo , mesmo com arquivos abertos.

Naturalmente, haveria algumas implicações semânticas durante uma transição:

  • Um arquivo aberto para gravação teria que ser dividido, com a parte previamente gravada no antigo ponto de montagem virtual e qualquer coisa recém escrita indo para o novo. Isso funcionaria melhor para arquivos abertos no modo O_APPEND e, na verdade, as pesquisas em arquivos gravados talvez precisem ser desautorizadas. Mas todas essas consequências estariam perfeitamente bem para arquivos de log sequencialmente escritos (que são, é claro, precisamente o que meu aplicativo envolve).

  • Um arquivo aberto para leitura teria que retornar EOF ou talvez EIO.

  • Um processo com o diretório de log como seu diretório atual não deve ser afetado (embora ls antes e depois da alternância possa produzir resultados muito diferentes).

  • Subdiretórios do diretório de criação de log podem exigir mais reflexão, mas basicamente seguem as mesmas regras.

Espero que tudo isso faça sentido até agora (embora você possa achar que sou louco por contemplar isso).

Então, minhas perguntas são:

  1. Um módulo de sistema de arquivos virtual que fará isso já existe? (Eu sei sobre sistemas de arquivos "union" e autofs , que são semelhantes em alguns aspectos.)

  2. Se tal módulo não existe, eu negligenciei quaisquer dificuldades insuperáveis se eu tentasse escrever um?

  3. Existe uma maneira melhor de fazer o que estou tentando fazer? Lembre-se, minha exigência é fazer o equivalente a desmontar e remontar um sistema de arquivos, mas minha restrição é que pode haver arquivos abertos.

(Alguns de vocês ainda estão dizendo: "Isso é loucura. Você só precisa ter certeza de que não há arquivos abertos quando fizer a desmontagem". E o que estou dizendo é que simplesmente não posso garantir isso. Identificar todos os processos que pode estar escrevendo arquivos de log é um problema em aberto, qualquer solução que exija identificá-los com antecedência não é totalmente prova do futuro.É por isso que eu estou seriamente contemplando essa montagem dinâmica louca VFS - Eu acredito que seria realmente menos trabalho e mais estável.)

Adendo: foi sugerido que eu mude todo o meu registro para o syslog (ou algum outro serviço central único) que seria fácil e centralmente gerenciável. Mas, como eu disse, não tenho controle sobre todos os processos que estão ou podem estar fazendo o registro. Por exemplo, um deles é chrony , que registra coisas como suas informações de rastreamento usando fwrite, não syslog. (Eu não posso me dar ao luxo de parar e reiniciar o chrony, porque eu não quero interromper o tempo, então, por enquanto, estou tendo que abrir mão da maioria dos registros de log.)

    
por Steve Summit 09.09.2018 / 15:22

1 resposta

1

Uma possível solução pode estar enviando logs para um banco de dados não relacional.

Você também pode tentar hackear selecionando um sistema de arquivos que suporte gravações de várias fontes ao mesmo tempo.

Ambas as duas soluções têm seu próprio conjunto de problemas e não apelam para mim.

Outra solução possível ao descrever o problema é compartilhar um diretório / var / log / machine comum sobre o NFS. É também um hack desagradável que pode funcionar com um par de servidores, mas que não se adapta bem.

Eu criaria um servidor syslog central e, se possível, apontaria todos os logs para ele. Dessa forma, pelo menos nesses registros, o problema de ter o simultâneo é resolvido.

Quanto a outros aplicativos que não se prestam diretamente ao syslog, ou mesmo ao syslog, eu verifico o filebeat ou o graylog.

Por fim, eu tentaria fazer com que os logs não syslogable fossem processados em um syslog central (eu estava fazendo o último com logs do Apache e do Tomcat).

Você também pode dar uma olhada em outras ofertas comerciais, como o loggly, Scalyr. New Relic ou Splunk Enterprise. Como um bônus adicional, você pode ter estatísticas muito interessantes para mostrar ao gerenciamento e planejar a capacidade.

Depois de usar o outlaying e ter um processo bem definido, você estabelece regras internas para que qualquer pessoa que precise instalar uma nova solução envie os logs para o destino oficial com o método "oficial".

P.S. Você está tentando resolver um problema organizacional com uma solução técnica. Muitas vezes isso não vai muito bem. Você tem que envolver seus superiores.

    
por 09.09.2018 / 15:34

Tags