1: Achtergrond
Ik gebruikte eerder Kafka in de Linux-omgeving, en er was geen probleem met Kafka zelf. Echter, een project waar ik momenteel aan werk moet compatibel zijn met Windows en Linux, en wanneer ik Kafka gebruik in de Windows-omgeving, ontdekte ik dat Kafka zelf niet zo compatibel is met Windows als Linux.
2: Probleem
Toen ik Kafka onder Windows testte, ontdekte ik dat Kafka een fout had nadat het een bepaalde tijd was gestart:
Een ander programma gebruikt het bestand en het proces kan er geen toegang toe krijgen.
[2021-07-06 09:06:10,800] FOUT Logboek voor __consumer_offsets-42 in dir C:\tmp\kafka-logs niet kunnen opschonen vanwege 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: 另一个程序正在使用此文件,进程无法访问。
op sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) op sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) op sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) op sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) op java.nio.file.Files.move(Files.java:1395) op org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) op kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210) op kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) op kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79) op kafka.log.LazyIndex.renameTo(LazyIndex.scala:79) op kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala:496) op kafka.log.Log.$anonfun$replaceSegments$4(Log.scala:2402) op kafka.log.Log.$anonfun$vervangenSegmenten$4$aangepast(Log.scala:2402) op scala.collection.immutable.List.foreach(List.scala:333) op kafka.log.Log.replaceSegments(Log.scala:2402) op kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613) bij kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538) bij kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537) op scala.collection.immutable.List.foreach(List.scala:333) op kafka.log.Cleaner.doClean(LogCleaner.scala:537) op kafka.log.Cleaner.clean(LogCleaner.scala:511) op kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380) op kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352) op kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332) op kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321) op kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) Onderdold: java.nio.file.FileSystemUitzondering: C:\tmp\kafka-logs\__consumer_offsets-42\000000000000000000000.timeindex.clean> C:\tmp\kafka-logs\__consumer_offsets-42\ 00000000000000000000000.timeindex.swap: Een ander programma gebruikt dit bestand en het proces is ontoegankelijk.
op sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) op sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) op sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) op sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) op java.nio.file.Files.move(Files.java:1395) op org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) ... Nog 20
3: Oorzaak
Het Kafka-logreinigingsbeleid zorgt ervoor dat het in de Windows-omgeving niet is toegestaan het bestand te hernoemen terwijl het logboek dat moet worden opgeschoond wordt geopend (dit is mogelijk in de Linux-omgeving), waardoor Kafka crasht.
De meest voorkomende oplossing op het internet is om "de logbestanden van Kafka leeg te maken en Kafka opnieuw te starten", wat uiteraard onrealistisch is in een productieomgeving. Dus aan het begin bedacht ik de volgende twee oplossingen voor de situatie:
Oplossing 1: Pas het logopruimbeleid aan om de logopruimtijd te veranderen naar oneindig (-1) om Kafka-datalogs permanent op te slaan Nadelen: (1) De schijfruimte blijft toenemen Optie 2: Bouw een virtuele machine op Windows (docker is hetzelfde, maar lastiger), en deploy Kafka vervolgens in de virtuele machine Nadelen: (1) O&M-personeel moet enige kennis van Linux O&M-ervaring hebben (2) Verhoog het geheugenverbruik
Natuurlijk waren de tekortkomingen van beide opties ondraaglijk voor mij, dus richtte ik mijn aandacht op de Kafka-gemeenschap voor hulp.
Klik hier voor een discussie over het aanbidden van de goden:De hyperlink-login is zichtbaar.
Het is duidelijk dat het probleem van Kafka onder het raam niet zo eenvoudig is als gedacht.Er is tot nu toe geen officiële oplossing。 Met andere woorden (Gebruik geen kafka onder het raam! )
Oplossing 3: Maar zelfs dan blijft de noodzaak om kafka onder het raam te gebruiken, dus zijn er nog steeds veel goden die opletten en oplossingen voorstellen. Een van de grote goden heeft de Kafka-broncode voor dit probleem ontwikkeld. Na testen loste zijn oplossing het probleem onder het raam op, waardoor kafka onder het raam beschikbaar werd. Voor deze oplossing zei Kafka's bijdrager echter dat het mogelijk niet veilig is (dat wil zeggen, de patch kan niet in de officiële versie worden geïntegreerd).
4: Oplossen (er is een downloadlink voor het gecompileerde kafka-pakket aan het einde) Hoewel Kafka-functionarissen zeggen dat de patch niet erg veilig is, heeft de official tot nu toe niets gedaan. En de vraag is er wel, dus na wat overweging ben ik nog steeds van plan om de methode van optie 3 te gebruiken om het probleem voorgoed op te lossen, dus we zullen de patch erin zetten en Kafka opnieuw compileren maken.
4.1: Kafka patch versie download
Download de Kafka Patch-versie van deze auteur
De hyperlink-login is zichtbaar.
4.2: Compileer de Kafka-patchversie Omdat kafka-compilatie via gradle gebeurt, moet je gradle eerst configureren
Voor hoe je gradle configureert, kun je dit artikel raadplegen (herdrukt, inbreuk wordt verwijderd) Installatie en configuratie van gradle onder Windows:De hyperlink-login is zichtbaar.
Voor informatie over hoe je Kafka compileert, kun je github raadplegen------ Hoe je Kafka compileert met Gradle:De hyperlink-login is zichtbaar.
Na het compileren kun je een Kafka-pakket krijgen dat onder Windows gebruikt kan worden.
In lijn met het concept van "kopiëren-plakken" (het compileren van de broncode kost immers nog steeds veel tijd), hier is een downloadlink voor het kafka-pakket dat ik heb samengesteld, en je kunt het direct downloaden en gebruiken.
kafka_2.12-2.3.0_window Downloadadres voor de anti-downtime versie:
De hyperlink-login is zichtbaar.
Originele link:De hyperlink-login is zichtbaar.
|