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.
[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.
|