Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 14467|Resposta: 1

O sistema Kafka Windows trava após rodar por um período de tempo

[Copiar link]
Publicado em 12/07/2021 10:57:01 | | | |
1: Contexto

Eu usei kafka no ambiente Linux antes, e não havia problema com o kafka em si. No entanto, um projeto em que estou trabalhando atualmente precisa ser compatível com Windows e Linux, e quando uso Kafka no ambiente Windows, percebi que Kafka em si não é tão compatível com Windows quanto Linux.

2: Problema

Ao testar Kafka no Windows, descobri que Kafka apresentou um erro após o lançamento por um período de tempo:

Outro programa está usando o arquivo e o processo não consegue acessá-lo.
As soluções a seguir não resolvem completamente o problema e não são recomendadas

ERRO do Windows Kafka Falhou em limpar o log para __consumer_offsets
https://www.itsvse.com/thread-9980-1-1.html




[2021-07-06 09:06:10,800] ERRO Falhou em limpar o log para __consumer_offsets-42 no diretor C:\tmp\kafka-logs devido ao IOException (kafka.server.LogDirFailureChannel)
java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000.timeindex.cleaned ->
C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000.timeindex.swap: 另一个程序正在使用此文件,进程无法访问。

        em sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
        em sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
        em sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387)
        at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287)
        em java.nio.file.Files.move(Files.java:1395)
        em org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904)
        em kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210)
        at kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155)
        at kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79)
        at kafka.log.LazyIndex.renameTo(LazyIndex.scala:79)
        em kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala:496)
        at kafka.log.Log.$anonfun$replaceSegments$4(Log.scala:2402)
        em kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.scala:2402)
        em scala.collection.immutable.List.foreach(List.scala:333)
        em kafka.log.Log.replaceSegments(Log.scala:2402)
        em kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613)
        em kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538)
        em kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537)
        em scala.collection.immutable.List.foreach(List.scala:333)
        em kafka.log.Cleaner.doClean(LogCleaner.scala:537)
        em kafka.log.Cleaner.clean(LogCleaner.scala:511)
        em kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380)
        em kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352)
        em kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332)
        em kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321)
        at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96)
        Suprimido: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000000.timeindex.cleaned -> C:\tmp\kafka-logs\__consumer_offsets-42\ 000000000000000000000000.timeindex.swap: Outro programa está usando esse arquivo e o processo está inacessível.

                em sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
                em sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
                em sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301)
                at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287)
                em java.nio.file.Files.move(Files.java:1395)
                em org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901)
                ... Mais 20

3: Causa

A política de limpeza de logs do Kafka dispara que, no ambiente Windows, não é permitido renomear o arquivo ao abrir o log que precisa ser limpo (isso é possível no ambiente Linux), causando o travamento do Kafka.

A solução mais comum na Internet é "esvaziar os arquivos de log do kafka e reiniciar o kafka", o que é obviamente irrealista em um ambiente de produção. Então, no começo, cheguei às seguintes duas soluções para a situação:

Solução 1: Modificar a política de limpeza de logs para alterar o tempo de limpeza para infinito (-1) para armazenar permanentemente os logs de dados kafka
Desvantagens: (1) O espaço em disco continuará a aumentar
Opção 2: Construir uma máquina virtual no Windows (docker é o mesmo, mas mais problemático) e então implantar o Kafka na máquina virtual
Desvantagens: (1) O pessoal de O&M precisa conhecer algum conhecimento de O&M Linux (2) Aumentar o consumo de memória

Obviamente, as limitações de ambas as opções eram insuportáveis para mim, então voltei minha atenção para a comunidade Kafka em busca de ajuda.

Clique aqui para uma discussão sobre adoração aos deuses:O login do hiperlink está visível.

Entende-se que o problema de Kafka sob a janela não é tão fácil quanto se imagina.Até agora não há uma solução oficial。 Em outras palavras (Não use kafka embaixo da janela! )

Solução 3: Mas mesmo assim, a necessidade de usar kafka sob a janela ainda existe, então ainda há muitos deuses prestando atenção e propondo algumas soluções. Um dos grandes deuses desenvolveu o código-fonte kafka para esse problema. Após os testes, sua solução resolveu o problema sob a janela, tornando kafka disponível sob a janela. No entanto, para essa solução, o colaborador do Kafka disse que ela pode não ser segura (ou seja, o patch não pode ser integrado à versão oficial).

4: Resolver (há um link para download do pacote kafka compilado no final)
Embora os oficiais da Kafka digam que o patch não é muito seguro, o oficial ainda não fez nada. E a demanda existe, então, após alguma consideração, ainda pretendo usar o método da opção 3 para resolver o problema de uma vez por todas, então vamos colocar o patch e recompilar o kafka.

4.1: Versão do patch Kafka para download

Baixe a versão do patch kafka deste autor

O login do hiperlink está visível.

4.2: Compilar a versão do patch Kafka
Como a compilação Kafka é feita pelo Gradle, você precisa configurar o Gradle primeiro

Para saber como configurar o Gradle, você pode consultar este artigo (reimpresso, a infração será deletada) Instalação e configuração do Gradle no Windows:O login do hiperlink está visível.

Para informações sobre como compilar Kafka, você pode consultar o github------ Como compilar Kafka usando o Gradle:O login do hiperlink está visível.

Depois de compilar, você pode obter um pacote Kafka que pode ser usado no Windows.

Em linha com o conceito de "copiar e colar" (afinal, compilar o código-fonte ainda é bastante demorado), aqui está um link para download do pacote kafka que eu compilei, e você pode baixá-lo e usá-lo diretamente.

kafka_2.12-2.3.0_window Endereço de download para a versão anti-downtime:

O login do hiperlink está visível.

Link original:O login do hiperlink está visível.







Anterior:O MySQL consulta as anotações de uma tabela de banco de dados
Próximo:Resumo de Tabelas Particionadas no SQL Server
Publicado em 12/07/2021 21:16:33 |
O chefe do fórum que ainda não jogou é profundamente idolatrado
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com