1: Contesto
Ho usato kafka nell'ambiente Linux prima, e non c'era problema con kafka in sé. Tuttavia, un progetto su cui sto lavorando deve essere compatibile con Windows e Linux, e quando uso Kafka nell'ambiente Windows, ho scoperto che Kafka stesso non è compatibile con Windows come Linux.
2: Problema
Testando Kafka sotto Windows, ho scoperto che Kafka aveva un errore dopo il lancio per un certo periodo di tempo:
Un altro programma sta usando il file e il processo non può accedervi.
[2021-07-06 09:06:10,800] ERRORE Non è riuscito a pulire il log per __consumer_offsets-42 in dir C:\tmp\kafka-logs a causa di 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: 另一个程序正在使用此文件,进程无法访问。
su sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) su sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) su sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) a sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) su java.nio.file.Files.move(Files.java:1395) su org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) su kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210) at kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) a kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79) a kafka.log.LazyIndex.renameTo(LazyIndex.scala:79) a kafka.log.LogSegment.changeFileSuffiss(LogSegment.scala:496) a kafka.log.Log.$anonfun$replaceSegments$4(Log.scala:2402) a kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.scala:2402) su scala.collection.immutable.List.foreach(List.scala:333) a kafka.log.Log.replaceSegments(Log.scala:2402) a kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613) a kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538) a kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537) su scala.collection.immutable.List.foreach(List.scala:333) a kafka.log.Cleaner.doClean(LogCleaner.scala:537) a kafka.log.Cleaner.clean(LogCleaner.scala:511) su kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380) a kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352) a kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332) a kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321) at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) Soppresso: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000000.timeindex.cleaned -> C:\tmp\kafka-logs\__consumer_offsets-42\ 00000000000000000000000000.timeindex.swap: Un altro programma utilizza questo file e il processo è inaccessibile.
su sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) su sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) su sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) a sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) su java.nio.file.Files.move(Files.java:1395) su org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) ... Altri 20
3: Causa
La politica di pulizia dei log di Kafka attiva che nell'ambiente Windows non è permesso rinominare il file durante l'apertura del log che deve essere pulito (è possibile nell'ambiente Linux), causando il crash di Kafka.
La soluzione più comune su Internet è "svuotare i file di log di kafka e riavviare kafka", cosa ovviamente irrealistica in un ambiente di produzione. All'inizio, ho trovato le seguenti due soluzioni per la situazione:
Soluzione 1: Modificare la politica di pulizia dei log per modificare il tempo di pulizia dei log in infinito (-1) per memorizzare permanentemente i log di dati kafka Svantaggi: (1) Lo spazio su disco continuerà ad aumentare Opzione 2: Costruire una macchina virtuale su Windows (docker è lo stesso, ma più problematico), e poi distribuire Kafka nella macchina virtuale Svantaggi: (1) Il personale O&M deve conoscere alcune conoscenze di O&M Linux (2) Aumentare il consumo di memoria
Ovviamente, le carenze di entrambe le opzioni erano insopportabili per me, così ho rivolto la mia attenzione alla comunità di Kafka per chiedere aiuto.
Clicca qui per una discussione sul culto degli dèi:Il login del link ipertestuale è visibile.
Si capisce che il problema di Kafka sotto la finestra non è così semplice come si immagina.Finora non c'è una soluzione ufficiale。 In altre parole (Non usare kafka sotto la finestra! )
Soluzione 3: Ma anche così, la necessità di usare kafka sotto la finestra esiste ancora, quindi ci sono ancora molti dèi che prestano attenzione e propongono alcune soluzioni. Uno dei grandi dei ha sviluppato il codice sorgente kafka per questo problema. Dopo i test, la sua soluzione risolse il problema sotto la finestra, rendendo Kafka disponibile sotto la finestra. Tuttavia, per questa soluzione, il collaboratore di Kafka ha detto che potrebbe non essere sicura (cioè, la patch non può essere integrata nella versione ufficiale).
4: Solve (c'è un link per il download del pacchetto kafka compilato alla fine) Sebbene i funzionari di Kafka affermino che la toppa non è molto sicura, finora il funzionario non ha fatto nulla. E la domanda esiste, quindi dopo qualche riflessione, ho comunque intenzione di usare il metodo dell'opzione 3 per risolvere il problema una volta per tutte, quindi installeremo la patch e ricompileremo kafka.
4.1: Download versione della patch Kafka
Scarica la versione kafka patch di questo autore
Il login del link ipertestuale è visibile.
4.2: Compila la versione della patch Kafka Poiché la compilazione kafka avviene tramite gradle, devi configurare gradle prima
Per come configurare Gradle, puoi consultare questo articolo (ristampato, la violazione sarà eliminata) Installazione e configurazione di Gradle su Windows:Il login del link ipertestuale è visibile.
Per informazioni su come compilare Kafka, puoi consultare github------ Come compilare Kafka usando Gradle:Il login del link ipertestuale è visibile.
Dopo aver compilato, puoi ottenere un pacchetto Kafka che può essere usato sotto Windows.
In linea con il concetto di "copia-incolla" (dopotutto, compilare il codice sorgente richiede ancora molto tempo), ecco un link per il download del pacchetto kafka che ho compilato, e puoi scaricarlo e usarlo direttamente.
kafka_2.12-2.3.0_window Indirizzo di download per la versione anti-downtime:
Il login del link ipertestuale è visibile.
Link originale:Il login del link ipertestuale è visibile.
|