Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 14467|Odpowiedź: 1

System Windows Kafka zawiesza się po pewnym czasie pracy

[Skopiuj link]
Opublikowano 12.07.2021 10:57:01 | | | |
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.
Poniższe rozwiązania nie rozwiązują całkowicie problemu i nie są zalecane

Błąd Windows Kafka Nie udało się wyczyścić logu __consumer_offsets
https://www.itsvse.com/thread-9980-1-1.html




[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.







Poprzedni:MySQL zapytuje adnotacje tabeli bazodanowej
Następny:Podsumowanie tabel partycjonowanych w SQL Server
Opublikowano 12.07.2021 21:16:33 |
Boss forum, który jeszcze nie grał, jest tak głęboko czczony
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com