1: Tło
Wcześniej używałem Kafki w środowisku Linuksa i sama Kafka nie miała problemu. Jednak projekt, nad którym obecnie pracuję, musi być kompatybilny z Windows i Linuksem, a gdy używam Kafki w środowisku Windows, zauważyłem, że sama Kafka nie jest tak kompatybilna z Windows jak z Linuksem.
2: Problem
Podczas testowania Kafki w Windows zauważyłem, że po pewnym czasie pojawił się błąd w Kafce:
Inny program korzysta z pliku, ale proces nie może do niego uzyskać dostępu.
[2021-07-06 09:06:10,800] BŁĄD Nie udało się oczyścić logu dla __consumer_offsets-42 w kierunku C:\tmp\kafka-logs z powodu 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.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) Suppressed: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\000000000000000000000000.timeindex.clean -> C:\tmp\kafka-logs\__consumer_offsets-42\ 000000000000000000000000000000000000000000000000000000000000000000000000000000000000.timeindex.swap: Inny program korzysta z tego pliku i jest niedostępny.
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) ... Jeszcze 20
3: Przyczyna
Polityka czyszczenia logów Kafki powoduje, że w środowisku Windows nie można zmienić nazwy pliku podczas otwierania logu, który wymaga czyszczenia (jest to możliwe w środowisku Linux), co powoduje awarię Kafki.
Najczęstszym rozwiązaniem w Internecie jest "opróżnienie plików logów Kafki i ponowne uruchomienie Kafki", co oczywiście jest nierealistyczne w środowisku produkcyjnym. Na początku wymyśliłem następujące dwa rozwiązania tej sytuacji:
Rozwiązanie 1: Zmodyfikuj politykę czyszczenia logów, aby zmienić czas czyszczenia logów na nieskończony (-1), aby na stałe przechowywać logi danych Kafka Wady: (1) Przestrzeń na dysku będzie nadal rosła Opcja 2: Zbuduj maszynę wirtualną na Windows (docker jest podobny, ale bardziej kłopotliwy), a następnie wdroż Kafkę w maszynie wirtualnej Wady: (1) Pracownicy O&M muszą znać trochę Linuxa O&M (2) Zwiększone zużycie pamięci
Oczywiście braki obu opcji były dla mnie nie do zniesienia, więc zwróciłem się do społeczności Kafki po pomoc.
Kliknij tutaj, aby omówić temat czczenia bogów:Logowanie do linku jest widoczne.
Rozumie się, że problem Kafki pod oknem nie jest tak prosty, jak się wydaje.Jak dotąd nie ma oficjalnego rozwiązania。 Innymi słowy (Nie używaj Kafki pod oknem! )
Rozwiązanie 3: Mimo to potrzeba używania Kafki pod oknem nadal istnieje, więc wciąż jest wielu bogów, którzy zwracają uwagę i proponują rozwiązania. Jeden z wielkich bogów opracował kod źródłowy Kafki dla tego problemu. Po testach jego rozwiązanie rozwiązało problem pod oknem, udostępniając Kafkę pod oknem. Jednak w przypadku tego rozwiązania współautor Kafki stwierdził, że może ono nie być bezpieczne (czyli patch nie może być zintegrowany z oficjalną wersją).
4: Solve (na końcu znajduje się link do pobrania skompilowanego pakietu Kafka) Chociaż urzędnicy Kafki twierdzą, że naszywka nie jest zbyt bezpieczna, jak dotąd nie zrobił nic konkretnego. A zapotrzebowanie na to istnieje, więc po przemyśleniu planuję nadal użyć metody opcji 3, by rozwiązać problem raz na zawsze, więc włożymy łatkę i przekompilujemy Kafkę.
4.1: Pobranie wersji patcha Kafka
Pobierz wersję Kafka patch tego autora
Logowanie do linku jest widoczne.
4.2: Skompiluj wersję patcha Kafka Ponieważ kompilacja Kafki odbywa się przez Gradle, musisz najpierw skonfigurować Gradle
Aby dowiedzieć się, jak skonfigurować Gradle, możesz zapoznać się z tym artykułem (przedrukowanym, naruszenie zostanie usunięte) Instalacja i konfiguracja Gradle w Windows:Logowanie do linku jest widoczne.
Aby dowiedzieć się o tym, jak skompilować Kafkę, możesz zajrzeć do githuba------ Jak kompilować Kafkę za pomocą Gradle:Logowanie do linku jest widoczne.
Po kompilacji możesz pobrać pakiet Kafka, który można używać na Windowsie.
Zgodnie z koncepcją "kopi-wklej" (w końcu kompilacja kodu źródłowego jest wciąż dość czasochłonna), oto link do pobrania pakietu kafka, który skompilowałem, i możesz go pobrać i używać bezpośrednio.
kafka_2.12-2.3.0_window Adres pobrania wersji anty-downtime:
Logowanie do linku jest widoczne.
Oryginalny link:Logowanie do linku jest widoczne.
|