1: Ozadje
Kafko sem že uporabljal v Linux okolju in s samo Kafko ni bilo težav. Vendar pa mora biti projekt, na katerem trenutno delam, združljiv z Windows in Linuxom, in ko uporabljam Kafko v okolju Window, sem ugotovil, da Kafka sama po sebi ni tako združljiva z Windows kot Linux.
2: Problem
Ko sem testiral Kafko pod Windows, sem ugotovil, da je imela Kafka po določenem času napako:
Drug program uporablja datoteko in proces je ne more dostopati.
[2021-07-06 09:06:10,800] NAPAKA Ni uspelo očistiti dnevnika za __consumer_offsets-42 v dir C:\tmp\kafka-logs zaradi 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: 另一个程序正在使用此文件,进程无法访问。
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) na java.nio.file.Files.move(Files.java:1395) at org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) na kafka.log.AbstractIndex.renameTo(AbstractIndex.:210) at kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.:155) at kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.:79) at kafka.log.LazyIndex.renameTo(LazyIndex.:79) at kafka.log.LogSegment.changeFileSuffixes(LogSegment.:496) at kafka.log.Log.$anonfun$replaceSegments$4(Log.:2402) at kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.:2402) at.collection.immutable.List.foreach(List.:333) na kafka.log.Log.replaceSegments(Log.:2402) na kafka.log.Cleaner.cleanSegments(LogCleaner.:613) na kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.:538) na kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.:537) at.collection.immutable.List.foreach(List.:333) na kafka.log.Cleaner.doClean (LogCleaner.:537) na kafka.log.Cleaner.clean(LogCleaner.:511) na kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.:380) na kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.:352) na kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.:332) na kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.:321) at kafka.utils.ShutdownableThread.run(ShutdownableThread.:96) Suppressed: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000.timeindex.clean -> C:\tmp\kafka-logs\__consumer_offsets-42\ 00000000000000000000000000.timeindex.swap: Drug program uporablja to datoteko in postopek ni dostopen.
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) na java.nio.file.Files.move(Files.java:1395) at org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) ... Še 20
3: Vzrok
Kafka politika čiščenja dnevnikov sproži, da v okolju Windows ni dovoljeno preimenovati datoteke med odpiranjem dnevnika, ki ga je treba očistiti (kar je mogoče v Linux okolju), kar povzroči zrušitev Kafke.
Najpogostejša rešitev na internetu je "izprazniti dnevniške datoteke Kafke in ponovno zagnati Kafko", kar je očitno nerealno v produkcijskem okolju. Tako sem na začetku prišel do naslednjih dveh rešitev za to situacijo:
Rešitev 1: Spremenite politiko čiščenja dnevnikov, da se čas čiščenja dnevnika spremeni v neskončno (-1), da se Kafka podatkovni dnevniki trajno shranijo Slabosti: (1) Prostor na disku se bo še naprej povečeval Možnost 2: Zgradite virtualni stroj na Windows (docker je enak, a bolj problematičen) in nato namestite Kafko v virtualni stroj Slabosti: (1) Osebje O&M mora poznati nekaj znanja o Linux O&M (2) Povečati porabo pomnilnika
Očitno so bile pomanjkljivosti obeh možnosti zame neznosne, zato sem se obrnil na Kafka skupnost za pomoč.
Kliknite tukaj za razpravo o čaščenju bogov:Prijava do hiperpovezave je vidna.
Razumemo se, da problem Kafke pod oknom ni tako preprost, kot si predstavljamo.Zaenkrat ni uradne rešitve。 Z drugimi besedami (Ne uporabljajte kafke pod oknom! )
Rešitev 3: A kljub temu potreba po uporabi kafke pod oknom še vedno obstaja, zato je še vedno veliko bogov, ki pozorno poslušajo in predlagajo rešitve. Eden izmed velikih bogov je razvil kafkovo izvorno kodo za ta problem. Po testiranju je njegova rešitev res rešila problem pod oknom, saj je Kafka postala dostopna pod oknom. Vendar pa je Kafkin sodelavec za to rešitev dejal, da morda ni varna (torej popravka ni mogoče vključiti v uradno različico).
4: Reši (na koncu je povezava za prenos prevedenega Kafka paketa) Čeprav uradniki Kafke pravijo, da obliž ni zelo varen, uradnik do zdaj ni storil ničesar. In povpraševanje obstaja, zato po premisleku še vedno nameravam uporabiti metodo 3, da problem dokončno rešim, zato bomo vstavili popravek in ponovno prevedli kafko.
4.1: Prenos različice popravka Kafka
Prenesite različico Kafka popravka tega avtorja
Prijava do hiperpovezave je vidna.
4.2: Prevedi različico popravka Kafka Ker se Kafka prevajanje izvaja preko Gradle, morate najprej konfigurirati gradle
Za nastavitev gradle si lahko ogledate ta članek (ponovno natisnjen, kršitev bo izbrisana) Namestitev in konfiguracija gradle pod Windows:Prijava do hiperpovezave je vidna.
Za informacije o tem, kako prevesti Kafko, lahko pogledate github------ Kako prevesti Kafko z uporabo Gradle:Prijava do hiperpovezave je vidna.
Po prevajanju lahko dobiš Kafka paket, ki ga lahko uporabljaš v Windows.
V skladu s konceptom "kopiraj-prilepi" (navsezadnje je prevajanje izvorne kode še vedno precej časovno zahtevno), tukaj je povezava za prenos paketa Kafka, ki sem ga prevedel, in ga lahko prenesete ter uporabljate neposredno.
kafka_2.12-2.3.0_window Naslov za prenos različice proti izpadom:
Prijava do hiperpovezave je vidna.
Izvirna povezava:Prijava do hiperpovezave je vidna.
|