1: Pozadie
Predtým som používal Kafku v Linuxovom prostredí a s Kafkou samotnou som nemal žiadny problém. Avšak projekt, na ktorom momentálne pracujem, musí byť kompatibilný s Windows a Linuxom, a keď používam Kafku v prostredí Window, zistil som, že Kafka sama o sebe nie je taká kompatibilná s Windows ako Linux.
2: Problém
Pri testovaní Kafky pod Windows som zistil, že Kafka mala po určitom spustení chybu:
Iný program používa súbor a proces k nemu nemá prístup.
[2021-07-06 09:06:10,800] CHYBA Nepodarilo sa vyčistiť log pre __consumer_offsets-42 v smere C:\tmp\kafka-logs kvôli 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) at 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.scala:210) at kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) at kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79) at kafka.log.LazyIndex.renameTo(LazyIndex.scala:79) at kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala:496) at kafka.log.Log.$anonfun$replaceSegments$4(Log.scala:2402) at kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.scala:2402) at scala.collection.immutable.List.foreach(List.scala:333) at kafka.log.Log.replaceSegments(Log.scala:2402) na kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613) na kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538) na kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537) at scala.collection.immutable.List.foreach(List.scala:333) na kafka.log.Cleaner.doClean (LogCleaner.scala:537) na kafka.log.Cleaner.clean(LogCleaner.scala:511) na kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380) na kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352) na kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332) na kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321) at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) Potlačené: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\000000000000000000000.timeindex.clean -> C:\tmp\kafka-logs\__consumer_offsets-42\ 00000000000000000000000000.timeindex.swap: Iný program používa tento súbor a proces je neprístupný.
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) at java.nio.file.Files.move(Files.java:1395) at org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) ... Ďalších 20
3: Príčina
Politika čistenia logov Kafka spôsobuje, že v prostredí Windows nie je povolené premenovať súbor pri otváraní logu, ktorý je potrebné vyčistiť (čo je možné v prostredí Linuxu), čo spôsobuje pád Kafky.
Najbežnejšie riešenie na internete je "vyprázdniť logové súbory Kafky a reštartovať Kafku", čo je v produkčnom prostredí očividne nereálne. Takže na začiatku som prišiel s týmito dvoma riešeniami tejto situácie:
Riešenie 1: Upraviť politiku čistenia logov tak, aby sa čas čistenia logov zmenil na nekonečný (-1) a trvalo ukladal Kafka dátové logy Nevýhody: (1) Priestor na disku bude naďalej rásť Možnosť 2: Postaviť virtuálny stroj na Windows (docker je rovnaký, ale zložitejší) a potom nasadiť Kafku priamo do virtuálneho stroja Nevýhody: (1) Personál O&M musí ovládať nejaké znalosti Linuxu O&M (2) Zvýšiť spotrebu pamäte
Samozrejme, nedostatky oboch možností boli pre mňa neznesiteľné, preto som sa obrátil na komunitu Kafka s prosbou o pomoc.
Kliknite sem pre diskusiu o uctievaní bohov:Prihlásenie na hypertextový odkaz je viditeľné.
Je známe, že problém Kafku pod oknom nie je taký jednoduchý, ako sa predpokladá.Zatiaľ neexistuje žiadne oficiálne riešenie。 Inými slovami (Nepoužívajte kafku pod oknom! )
Riešenie 3: Aj tak však stále existuje potreba používať Kafku pod oknom, takže stále je veľa bohov, ktorí venujú pozornosť a navrhujú riešenia. Jeden z veľkých bohov vyvinul zdrojový kód Kafka pre tento problém. Po testovaní jeho riešenie vyriešilo problém pod oknom, čím sprístupnil Kafku pod oknom. Pre toto riešenie však prispievateľ Kafky uviedol, že nemusí byť bezpečné (teda patch nie je možné integrovať do oficiálnej verzie).
4: Solve (na konci je odkaz na stiahnutie skompilovaného balíka Kafka) Hoci predstavitelia Kafky tvrdia, že nášivka nie je veľmi bezpečná, úradník zatiaľ nič neurobil. A dopyt naozaj existuje, takže po zvážení plánujem použiť metódu možnosti 3 na vyriešenie problému raz a navždy, takže patch vložíme a prekompilujeme Kafku.
4.1: Stiahnutie verzie Kafka patchu
Stiahnite si verziu Kafka patchu tohto autora
Prihlásenie na hypertextový odkaz je viditeľné.
4.2: Skompilovať verziu Kafka patch Keďže Kafka kompilácia prebieha cez Gradle, je potrebné najskôr nastaviť Gradle
Pre konfiguráciu gradle sa môžete pozrieť na tento článok (pretlačený, porušenie bude vymazané) Inštalácia a konfigurácia gradle vo Windows:Prihlásenie na hypertextový odkaz je viditeľné.
Pre informácie o tom, ako skompilovať Kafku, môžete navštíviť github------ Ako kompilovať Kafku pomocou Gradle:Prihlásenie na hypertextový odkaz je viditeľné.
Po kompilácii môžete získať balík Kafka, ktorý sa dá použiť vo Windows.
V súlade s konceptom "kopírovať a vkladať" (napokon, kompilácia zdrojového kódu je stále dosť časovo náročná), tu je odkaz na stiahnutie balíka Kafka, ktorý som skompiloval, a môžete si ho stiahnuť a používať priamo.
kafka_2.12-2.3.0_window Adresa na stiahnutie verzie proti výpadkom:
Prihlásenie na hypertextový odkaz je viditeľné.
Pôvodný odkaz:Prihlásenie na hypertextový odkaz je viditeľné.
|