1: Bakgrunn
Jeg brukte Kafka i Linux-miljøet før, og det var ikke noe problem med Kafka i seg selv. Men et prosjekt jeg jobber med nå må være kompatibelt med Windows og Linux, og når jeg bruker Kafka i Windows-miljøet, oppdaget jeg at Kafka i seg selv ikke er like kompatibel med Windows som Linux.
2: Problem
Da jeg testet Kafka under Window, fant jeg ut at Kafka hadde en feil etter at den var startet i en periode:
Et annet program bruker filen, men prosessen får ikke tilgang til den.
[2021-07-06 09:06:10,800] FEIL: Klarte ikke å rydde loggen for __consumer_offsets-42 i dir: C:\tmp\kafka-logs på grunn 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) 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$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) Undertrykt: java.nio.file.FileSystemUnntak: C:\tmp\kafka-logs\__consumer_offsets-42\0000000000000000000000.timeindex.clean> C:\tmp\kafka-logs\__consumer_offsets-42\ 000000000000000000000000.timeindex.swap: Et annet program bruker denne filen, og prosessen er utilgjengelig.
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 til
3: Årsak
Kafka-loggrensingspolicyen utløser at i Windows-miljøet er det ikke tillatt å omdøpe filen mens loggen som må renses åpnes (det er mulig i Linux-miljøet), noe som får Kafka til å krasje.
Den vanligste løsningen på Internett er å «tømme loggfilene til kafka og starte kafka på nytt», noe som åpenbart er urealistisk i et produksjonsmiljø. Så i begynnelsen kom jeg opp med følgende to løsninger for situasjonen:
Løsning 1: Endre loggryddingspolicyen for å endre loggryddingstiden til uendelig (-1) for å lagre kafka-datalogger permanent Ulemper: (1) Diskplassen vil fortsette å øke Alternativ 2: Bygg en virtuell maskin på Windows (docker er det samme, men mer plagsomt), og deployer deretter Kafka i den virtuelle maskinen Ulemper: (1) O&M-personell må kunne noe Linux-O&M-kunnskap (2) Øke minneforbruket
Selvfølgelig var svakhetene ved begge alternativene uutholdelige for meg, så jeg vendte oppmerksomheten mot Kafka-samfunnet for hjelp.
Klikk her for en diskusjon om å tilbe gudene:Innloggingen med hyperkoblingen er synlig.
Det er forstått at problemet med Kafka under vinduet ikke er så lett som man trodde.Det finnes foreløpig ingen offisiell løsning。 Med andre ord (Ikke bruk kafka under vinduet! )
Løsning 3: Men selv da eksisterer behovet for å bruke kafka under vinduet fortsatt, så det er fortsatt mange guder som følger med og foreslår noen løsninger. En av de store gudene har utviklet kafka-kildekoden for dette problemet. Etter testing løste løsningen hans problemet under vinduet, og gjorde Kafka tilgjengelig under vinduet. For denne løsningen sa imidlertid Kafkas bidragsyter at den kanskje ikke er trygg (det vil si at patchen ikke kan integreres i den offisielle versjonen).
4: Løs (det finnes en nedlastingslenke til den kompilerte Kafka-pakken på slutten) Selv om Kafka-tjenestemenn sier at patchen ikke er særlig trygg, har tjenestemannen ikke gjort noe så langt. Og etterspørselen finnes, så etter litt overveielse planlegger jeg fortsatt å bruke metode fra alternativ 3 for å løse problemet en gang for alle, så vi legger inn patchen og kompilerer Kafka på nytt.
4.1: Kafka patch-versjon nedlasting
Last ned kafka-patch-versjonen av denne forfatteren
Innloggingen med hyperkoblingen er synlig.
4.2: Kompil Kafka-patchversjonen Siden kafka-kompilering gjøres via Gradle, må du konfigurere Gradle først
For hvordan du konfigurerer gradle, kan du se denne artikkelen (gjenuttrykt, brudd vil bli slettet) Installasjon og konfigurasjon av gradle under Windows:Innloggingen med hyperkoblingen er synlig.
For informasjon om hvordan du kompilerer Kafka, kan du se github------ Hvordan kompilere Kafka med Gradle:Innloggingen med hyperkoblingen er synlig.
Etter kompilering kan du få en Kafka-pakke som kan brukes under Windows.
I tråd med konseptet «kopier-lim» (tross alt er det fortsatt ganske tidkrevende å kompilere kildekoden), her er en nedlastingslenke til kafka-pakken jeg kompilerte, og du kan laste den ned og bruke den direkte.
kafka_2.12-2.3.0_window Nedlastingsadresse for anti-nedetid-versjonen:
Innloggingen med hyperkoblingen er synlig.
Original lenke:Innloggingen med hyperkoblingen er synlig.
|