1: Bakgrund
Jag använde Kafka i Linux-miljön tidigare, och det fanns inga problem med Kafka själv. Dock måste ett projekt jag arbetar med just nu vara kompatibelt med Windows och Linux, och när jag använder Kafka i Windows-miljön upptäckte jag att Kafka i sig inte är lika kompatibel med Windows som Linux.
2: Problem
När jag testade Kafka under Windows upptäckte jag att Kafka hade ett fel efter att den startats under en period:
Ett annat program använder filen och processen kan inte komma åt den.
[2021-07-06 09:06:10,800] FEL: Misslyckades med att rensa loggen för __consumer_offsets-42 i diret C:\tmp\kafka-logs på grund av 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: 另一个程序正在使用此文件,进程无法访问。
på sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) på sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) på sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) på sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) på java.nio.file.Files.move(Files.java:1395) på org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) på kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210) på kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) på kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79) på kafka.log.LazyIndex.renameTo(LazyIndex.scala:79) på kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala:496) på kafka.log.Log.$anonfun$replaceSegments$4(Log.scala:2402) på kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.scala:2402) på scala.collection.immutable.List.foreach(List.scala:333) på kafka.log.Log.replaceSegments(Log.scala:2402) på kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613) på kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538) på kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537) på scala.collection.immutable.List.foreach(List.scala:333) på kafka.log.Cleaner.doClean(LogCleaner.scala:537) på kafka.log.Cleaner.clean(LogCleaner.scala:511) på kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380) på kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352) på kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332) på kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321) på kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) Undertryckt: java.nio.file.FileSystemUndantag: C:\tmp\kafka-logs\__consumer_offsets-42\000000000000000000000.timeindex.> C:\tmp\kafka-logs\__consumer_offsets-42\ 000000000000000000000000.timeindex.swap: Ett annat program använder denna fil och processen är otillgänglig.
på sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) på sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) på sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) på sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) på java.nio.file.Files.move(Files.java:1395) på org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) ... 20 till
3: Orsak
Kafkas loggrensningspolicy utlöser att i Windows-miljön är det inte tillåtet att byta namn på filen när loggen öppnas som behöver rensas (det är möjligt i Linux-miljön), vilket gör att Kafka kraschar.
Den vanligaste lösningen på Internet är att "tömma loggfilerna från kafka och starta om kafka", vilket uppenbarligen är orealistiskt i en produktionsmiljö. Så i början kom jag på följande två lösningar för situationen:
Lösning 1: Ändra loggrensningspolicyn för att ändra loggrensningstiden till oändlig (-1) för att permanent lagra kafka-dataloggar Nackdelar: (1) Diskutrymmet kommer att fortsätta öka Alternativ 2: Bygg en virtuell maskin på Windows (docker är likadant, men mer besvärlig), och distribuera sedan Kafka i den virtuella maskinen Nackdelar: (1) O&M-personal behöver kunna viss kunskap om Linux O&M. (2) Öka minnesförbrukningen
Uppenbarligen var bristerna i båda alternativen outhärdliga för mig, så jag vände min uppmärksamhet mot Kafka-gemenskapen för hjälp.
Klicka här för en diskussion om gudadyrkan:Inloggningen med hyperlänken är synlig.
Det är förstått att problemet med Kafka under fönstret inte är så enkelt som man föreställt sig.Det finns ännu ingen officiell lösning。 Med andra ord (Använd inte kafka under fönstret! )
Lösning 3: Men ändå finns behovet av att använda kafka under fönstret, så det finns fortfarande många gudar som uppmärksammar och föreslår lösningar. En av de stora gudarna har utvecklat Kafka-källkoden för detta problem. Efter tester löste hans lösning problemet under fönstret och gjorde Kafka tillgänglig under fönstret. För denna lösning sade dock Kafkas bidragsgivare att det kanske inte är säkert (det vill säga patchen kan inte integreras i den officiella versionen).
4: Lös (det finns en nedladdningslänk för det kompilerade Kafka-paketet i slutet) Även om Kafka-tjänstemän säger att lappen inte är särskilt säker, har tjänstemannen hittills inte gjort något. Och efterfrågan finns, så efter lite övervägande planerar jag fortfarande att använda metoden alternativ 3 för att lösa problemet en gång för alla, så vi kommer att lägga in patchen och kompilera om Kafka.
4.1: Kafka patch version nedladdning
Ladda ner kafkapatch-versionen av denna författare
Inloggningen med hyperlänken är synlig.
4.2: Kompylera Kafka-patchversionen Eftersom kafka-kompilering görs via Gradle måste du konfigurera Gradle först
För hur man konfigurerar gradle kan du hänvisa till denna artikel (återutgiven, överträdelsen kommer att tas bort) Installation och konfiguration av gradle under Windows:Inloggningen med hyperlänken är synlig.
För information om hur man kompilerar Kafka kan du hänvisa till github------ Hur man kompilerar Kafka med Gradle:Inloggningen med hyperlänken är synlig.
Efter kompilering kan du få ett Kafka-paket som kan användas under Windows.
I linje med konceptet "kopiera-klistra" (det är trots allt fortfarande ganska tidskrävande att kompilera källkoden), här är en nedladdningslänk för kafka-paketet som jag kompilerade, och du kan ladda ner det och använda det direkt.
kafka_2.12-2.3.0_window Nedladdningsadress för anti-drifttid-versionen:
Inloggningen med hyperlänken är synlig.
Originallänk:Inloggningen med hyperlänken är synlig.
|