1: Pozadí
Dříve jsem používal Kafku v linuxovém prostředí a s Kafkou samotnou jsem neměl žádný problém. Nicméně projekt, na kterém právě pracuji, musí být kompatibilní s Windows a Linuxem, a když používám Kafku v prostředí Window, zjistil jsem, že Kafka sama o sobě není tak kompatibilní s Windows jako s Linuxem.
2: Problém
Při testování Kafky pod Windows jsem zjistil, že Kafka měla po určitou dobu chybu:
Jiný program soubor používá a proces k němu nemá přístup.
[2021-07-06 09:06:10,800] CHYBA Nepodařilo se vyčistit log pro __consumer_offsets-42 v směru 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čeno: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\0000000000000000000000.timeindex.clean -> C:\tmp\kafka-logs\__consumer_offsets-42\ 000000000000000000000000000000000000.timeindex.swap: Jiný program používá tento soubor a proces je nepří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) ... Dalších 20
3: Příčina
Politika čištění logů Kafka spouští, že ve Windows prostředí není možné soubor přejmenovat při otevírání logu, který je třeba vyčistit (což je možné v prostředí Linuxu), což způsobuje pád Kafky.
Nejčastějším řešením na internetu je "vyprázdnit logovací soubory Kafky a restartovat Kafku", což je v produkčním prostředí samozřejmě nereálné. Takže na začátku jsem přišel s těmito dvěma řešeními situace:
Řešení 1: Upravte politiku čištění logů tak, aby se doba čištění logů změnila na nekonečnou (-1), aby se data Kafka uchovávala trvale Nevýhody: (1) Prostor na disku bude nadále narůstat Možnost 2: Postavit virtuální stroj na Windows (docker je stejný, ale složitější) a pak nasadit Kafku přímo do virtuálního stroje Nevýhody: (1) Personál O&M musí znát nějaké znalosti Linuxu O&M (2) Zvýšit spotřebu paměti
Samozřejmě, nedostatky obou možností pro mě byly nesnesitelné, takže jsem se obrátil na komunitu Kafka s žádostí o pomoc.
Klikněte zde pro diskusi o uctívání bohů:Přihlášení k hypertextovému odkazu je viditelné.
Je známo, že problém Kafky pod oknem není tak jednoduchý, jak se domnívá.Zatím neexistuje žádné oficiální řešení。 Jinými slovy (Nepoužívejte Kafku pod oknem! )
Řešení 3: I tak však stále existuje potřeba používat kafku pod oknem, takže stále existuje mnoho bohů, kteří věnují pozornost a navrhují nějaká řešení. Jeden z velkých bohů vytvořil kafkův zdrojový kód pro tento problém. Po testování jeho řešení skutečně vyřešilo problém pod oknem, díky čemuž byl Kafka dostupná pod oknem. Nicméně pro toto řešení přispěvatel Kafky uvedl, že nemusí být bezpečné (tedy že záplatu nelze integrovat do oficiální verze).
4: Vyřešit (na konci je odkaz ke stažení zkompilovaného balíčku Kafka) Ačkoliv představitelé Kafky tvrdí, že nášivka není příliš bezpečná, zatím nic neudělal. A poptávka skutečně existuje, takže po zvážení stále plánuji použít metodu třetí možnosti k vyřešení problému jednou provždy, takže patch vložíme a Kafku překompilujeme.
4.1: Stažení verze Kafka patch
Stáhněte si verzi tohoto autora s Kafka patchem
Přihlášení k hypertextovému odkazu je viditelné.
4.2: Zkompilujte verzi Kafka patch Protože Kafka kompilace probíhá přes Gradle, je potřeba Gradle nejdřív nakonfigurovat
Pro nastavení gradle se můžete podívat na tento článek (přetištěn, porušení bude smazáno) Instalace a konfigurace gradle ve Windows:Přihlášení k hypertextovému odkazu je viditelné.
Pro informace o tom, jak zkompilovat Kafku, můžete se podívat na github------ Jak zkompilovat Kafku pomocí Gradle:Přihlášení k hypertextovému odkazu je viditelné.
Po kompilaci si můžete stáhnout balíček Kafka, který lze použít ve Windows.
V souladu s konceptem "kopírovat a vkládat" (koneckonců, kompilace zdrojového kódu je stále časově náročná), zde je odkaz ke stažení balíčku Kafka, který jsem zkompiloval, a můžete si ho stáhnout a používat přímo.
kafka_2.12-2.3.0_window Adresa ke stažení verze proti výpadku:
Přihlášení k hypertextovému odkazu je viditelné.
Původní odkaz:Přihlášení k hypertextovému odkazu je viditelné.
|