1: Baggrund
Jeg brugte Kafka i Linux-miljøet før, og der var ikke noget problem med Kafka selv. Dog skal et projekt, jeg arbejder på i øjeblikket, være kompatibelt med Windows og Linux, og når jeg bruger Kafka i Windows-miljøet, har jeg fundet ud af, at Kafka i sig selv ikke er lige så kompatibel med Windows som Linux.
2: Problem
Da jeg testede Kafka under Window, fandt jeg, at Kafka havde en fejl efter at være blevet startet i en periode:
Et andet program bruger filen, og processen kan ikke få adgang til den.
[2021-07-06 09:06:10,800] FEJL Fejlede i at rydde op i logbogen for __consumer_offsets-42 i diret C:\tmp\kafka-logs på grund af 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) at 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$adaptered(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) Undertrykt: java.nio.file.FileSystemUndtagelse: C:\tmp\kafka-logs\__consumer_offsets-42\0000000000000000000000.timeindex.clean> C:\tmp\kafka-logs\__consumer_offsets-42\ 00000000000000000000000.timeindex.swap: Et andet program bruger denne fil, og processen er utilgængelig.
på sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) at 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 mere
3: Årsag
Kafka-logrensningspolitikken udløser, at det i Windows-miljøet ikke er tilladt at omdøbe filen, mens den log, der skal renses, åbnes (det er muligt i Linux-miljøet), hvilket får Kafka til at crashe.
Den mest almindelige løsning på internettet er at "tømme logfilerne i kafka og genstarte kafka", hvilket åbenlyst er urealistisk i et produktionsmiljø. Så i begyndelsen fandt jeg på følgende to løsninger på situationen:
Løsning 1: Ændr logoprydningspolitikken for at ændre logoprydningstiden til uendelig (-1) for permanent lagring af kafka-datalogs Ulemper: (1) Diskpladsen vil fortsætte med at øges Mulighed 2: Byg en virtuel maskine på Windows (docker er det samme, men mere besværligt), og deploy derefter Kafka i den virtuelle maskine Ulemper: (1) O&M-personale skal kende noget til Linux O&M-viden (2) Øge hukommelsesforbruget
Selvfølgelig var begge muligheders mangler uudholdelige for mig, så jeg vendte min opmærksomhed mod Kafka-fællesskabet for hjælp.
Klik her for en diskussion om tilbedelse af guderne:Hyperlink-login er synlig.
Det forstås, at problemet med Kafka under vinduet ikke er så let, som man forestiller sig.Der er endnu ingen officiel løsning。 Med andre ord (Brug ikke kafka under vinduet! )
Løsning 3: Men selv da eksisterer behovet for at bruge kafka under vinduet, så der er stadig mange guder, der følger med og foreslår nogle løsninger. En af de store guder har udviklet kafka-kildekoden til dette problem. Efter testning løste hans løsning problemet under vinduet og gjorde kafka tilgængelig under vinduet. For denne løsning sagde Kafkas bidragyder, at den måske ikke er sikker (det vil sige, at patchen ikke kan integreres i den officielle version).
4: Løs (der er et downloadlink til den kompilerede kafka-pakke til sidst) Selvom Kafka-embedsmænd siger, at patchen ikke er særlig sikker, har embedsmanden indtil videre ikke gjort noget. Og efterspørgslen er der, så efter lidt overvejelse planlægger jeg stadig at bruge metode 3 til at løse problemet én gang for alle, så vi vil sætte patchen i og genkompilere Kafka.
4.1: Kafka patch version download
Download Kafka-patch-versionen af denne forfatter
Hyperlink-login er synlig.
4.2: Kompil Kafka-patch-versionen Da kafka-kompilering foregår via Gradle, skal du først konfigurere Gradle
For hvordan man konfigurerer gradle, kan du henvise til denne artikel (genoptrykt, overtrædelse vil blive slettet) Installation og konfiguration af gradle under Windows:Hyperlink-login er synlig.
For information om, hvordan man kompilerer Kafka, kan du henvise til github------ Sådan kompilerer du Kafka med Gradle:Hyperlink-login er synlig.
Efter kompilering kan du få en Kafka-pakke, der kan bruges under Windows.
I tråd med konceptet "copy-paste" (det er trods alt stadig ret tidskrævende at kompilere kildekoden), er her et downloadlink til den kafka-pakke, jeg har kompileret, og du kan downloade den og bruge den direkte.
kafka_2.12-2.3.0_window Downloadadresse for anti-nedetid-versionen:
Hyperlink-login er synlig.
Originalt link:Hyperlink-login er synlig.
|