1: Hintergrund
Ich habe Kafka vorher in der Linux-Umgebung verwendet, und mit Kafka selbst gab es kein Problem. Ein Projekt, an dem ich derzeit arbeite, muss jedoch mit Windows und Linux kompatibel sein, und als ich Kafka in der Windows-Umgebung nutze, habe ich festgestellt, dass Kafka selbst nicht so kompatibel mit Windows ist wie Linux.
2: Problem
Beim Testen von Kafka unter Windows stellte ich fest, dass Kafka nach dem Start für eine gewisse Zeit einen Fehler hatte:
Ein anderes Programm verwendet die Datei und der Prozess kann nicht darauf zugreifen.
[2021-07-06 09:06:10,800] FEHLER: Logbuch für __consumer_offsets-42 im Verzeichnis C:\tmp\kafka-logs konnte aufgrund von IOException (kafka.server.LogDirFailureChannel) nicht bereinigen
java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000.timeindex.cleaned ->
C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000.timeindex.swap: 另一个程序正在使用此文件,进程无法访问。
bei sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) bei sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) bei sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) bei sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) bei java.nio.file.Files.move(Files.java:1395) bei org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) unter kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210) bei kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) bei kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79) unter kafka.log.LazyIndex.renameTo(LazyIndex.scala:79) at kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala:496) bei kafka.log.Log.$anonfun$replaceSegments$4(Log.scala:2402) bei kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.scala:2402) unter scala.collection.immutable.List.foreach(List.scala:333) bei kafka.log.Log.replaceSegments(Log.scala:2402) bei kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613) bei kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538) bei kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537) unter scala.collection.immutable.List.foreach(List.scala:333) bei kafka.log.Cleaner.doClean(LogCleaner.scala:537) bei kafka.log.Cleaner.clean(LogCleaner.scala:511) bei kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380) bei kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352) bei kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332) bei kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321) bei kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) Unterdrückt: java.nio.file.FileSystemAusnahme: C:\tmp\kafka-logs\__consumer_offsets-42\0000000000000000000000.timeindex.clean> C:\tmp\kafka-logs\__consumer_offsets-42\ 000000000000000000000000.timeindex.swap: Ein anderes Programm verwendet diese Datei und der Prozess ist nicht zugänglich.
bei sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) bei sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) bei sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) bei sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) bei java.nio.file.Files.move(Files.java:1395) at org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) ... 20 weitere
3: Ursache
Die Kafka-Protokollreinigungsrichtlinie löst aus, dass in der Windows-Umgebung die Datei beim Öffnen des zu reinigenden Protokolls nicht umbenannt werden darf (was in der Linux-Umgebung möglich ist), was zu einem Absturz von Kafka führt.
Die gängigste Lösung im Internet ist, "die Logdateien von Kafka zu leeren und Kafka neu zu starten", was in einer Produktionsumgebung offensichtlich unrealistisch ist. Also habe ich zu Beginn die folgenden zwei Lösungen für die Situation entwickelt:
Lösung 1: Ändern Sie die Log-Cleanup-Richtlinie, um die Log-Reinigungszeit auf unendlich (-1) zu ändern, um Kafka-Datenlogs dauerhaft zu speichern Nachteile: (1) Der Speicherplatz wird weiter zunehmen Option 2: Eine virtuelle Maschine unter Windows bauen (docker ist dasselbe, aber umständlicher) und dann Kafka in der virtuellen Maschine bereitstellen Nachteile: (1) O&M-Mitarbeiter müssen einige Linux-O&M-Kenntnisse haben (2) Speicherverbrauch erhöhen
Offensichtlich waren die Schwächen beider Optionen für mich unerträglich, also wandte ich mich der Kafka-Gemeinschaft zu, um Hilfe zu erhalten.
Klicken Sie hier für eine Diskussion über die Verehrung der Götter:Der Hyperlink-Login ist sichtbar.
Es wird verstanden, dass das Problem von Kafka unter dem Fenster nicht so einfach ist, wie man es sich vorgestellt hat.Es gibt bisher keine offizielle Lösung。 Mit anderen Worten (Benutze kein Kafka unter dem Fenster! )
Lösung 3: Aber selbst dann besteht die Notwendigkeit, Kafka unter dem Fenster zu verwenden, sodass viele Götter weiterhin aufmerksam sind und Lösungen vorschlagen. Einer der großen Götter hat den Kafka-Quellcode für dieses Problem entwickelt. Nach Tests löste seine Lösung das Problem unter dem Fenster, indem er Kafka unter dem Fenster verfügbar machte. Für diese Lösung sagte Kafkas Mitwirkender jedoch, dass sie möglicherweise nicht sicher sei (das heißt, der Patch kann nicht in die offizielle Version integriert werden).
4: Lösen (am Ende gibt es einen Download-Link für das kompilierte Kafka-Paket) Obwohl Kafka-Beamte sagen, dass das Pflaster nicht sehr sicher ist, hat der Beamte bisher nichts unternommen. Und die Nachfrage besteht tatsächlich, also plane ich nach einiger Überlegung weiterhin, die Methode der Option 3 zu verwenden, um das Problem ein für alle Mal zu lösen, also werden wir den Patch einbauen und Kafka neu kompilieren.
4.1: Kafka-Patch-Version Download
Laden Sie die Kafka-Patch-Version dieses Autors herunter
Der Hyperlink-Login ist sichtbar.
4.2: Kompiliere die Kafka-Patch-Version Da die Kafka-Kompilierung über Gradle erfolgt, musst du Gradle zuerst konfigurieren
Zur Konfiguration von Gradle können Sie in diesem Artikel (nachgedruckt, Infringement wird gelöscht) nachschlagen: Installation und Konfiguration von Gradle unter Windows:Der Hyperlink-Login ist sichtbar.
Informationen zur Kompilierung von Kafka finden Sie auf github------ Wie man Kafka mit Gradle kompiliert:Der Hyperlink-Login ist sichtbar.
Nach der Kompilierung kannst du ein Kafka-Paket erhalten, das unter Windows verwendet werden kann.
Im Einklang mit dem Konzept des "Copy-Paste" (schließlich ist das Kompilieren des Quellcodes immer noch ziemlich zeitaufwendig), hier ein Download-Link für das Kafka-Paket, das ich zusammengestellt habe, und Sie können es herunterladen und direkt verwenden.
kafka_2.12-2.3.0_window Download-Adresse für die Anti-Downtime-Version:
Der Hyperlink-Login ist sichtbar.
Originallink:Der Hyperlink-Login ist sichtbar.
|