1: Tausta
Käytin kafkaa aiemmin Linux-ympäristössä, eikä kafkassa itsessään ollut mitään ongelmaa. Kuitenkin projekti, jota parhaillaan teen, täytyy olla yhteensopiva Windowsin ja Linuxin kanssa, ja kun käytän Kafkaa Windows-ympäristössä, huomasin, että Kafka itsessään ei ole yhtä yhteensopiva Windowsin kanssa kuin Linux.
2: Ongelma
Kun testasin Kafkaa Windows-alla, huomasin, että Kafkassa oli virhe käynnistyksen jälkeen tietyn ajan:
Toinen ohjelma käyttää tiedostoa, mutta prosessi ei pääse siihen käsiksi.
[2021-07-06 09:06:10,800] VIRHE Epäonnistui puhdistamaan lokia __consumer_offsets-42:lle dir:\tmp\kafka-logs IOExceptionin (kafka.server.LogDirFailureChannel) vuoksi
java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000.timeindex.cleaned ->
C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000.timeindex.swap: 另一个程序正在使用此文件,进程无法访问。
osoitteessa sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) osoitteessa sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) osoitteessa sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) osoitteessa sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) osoitteessa java.nio.file.Files.move(Files.java:1395) osoitteessa org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) osoitteessa kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210) osoitteessa kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) osoitteessa kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79) osoitteessa kafka.log.LazyIndex.renameTo(LazyIndex.scala:79) osoitteessa kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala:496) osoitteessa kafka.log.Log.$anonfun$replaceSegments$4(Log.scala:2402) osoitteessa kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.scala:2402) osoitteessa scala.collection.immutable.List.foreach(List.scala:333) osoitteessa kafka.log.Log.replaceSegments(Log.scala:2402) osoitteessa kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613) osoitteessa kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538) at kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537) osoitteessa scala.collection.immutable.List.foreach(List.scala:333) osoitteessa kafka.log.Cleaner.doClean(LogCleaner.scala:537) osoitteessa kafka.log.Cleaner.clean(LogCleaner.scala:511) osoitteessa kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380) osoitteessa kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352) osoitteessa kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332) osoitteessa kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321) osoitteessa kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) Suljettu: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\000000000000000000000000000000.timeindex.cleaned -> C:\tmp\kafka-logs\__consumer_offsets-42\ 000000000000000000000000000.timeindex.swap: Toinen ohjelma käyttää tätä tiedostoa, eikä prosessi ole käytettävissä.
osoitteessa sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) osoitteessa sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) osoitteessa sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) osoitteessa sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) osoitteessa java.nio.file.Files.move(Files.java:1395) osoitteessa org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) ... 20 lisää
3: Syy
Kafka-lokin puhdistuspolitiikka käynnistää, että Windows-ympäristössä tiedostoa ei saa nimetä uudelleen, kun auki pitää puhdistaa (mikä on mahdollista Linux-ympäristössä), mikä aiheuttaa Kafkan kaatumisen.
Yleisin ratkaisu internetissä on "tyhjentää kafkan lokitiedostot ja käynnistää kafka uudelleen", mikä on selvästi epärealistista tuotantoympäristössä. Aluksi keksin seuraavat kaksi ratkaisua tilanteeseen:
Ratkaisu 1: Muokkaa lokin puhdistuskäytäntöä niin, että lokin puhdistusaika muuttuu äärettömiksi (-1), jotta kafka-datalokit säilytetään pysyvästi Haitat: (1) Levyn tila kasvaa jatkuvasti Vaihtoehto 2: Rakenna virtuaalikone Windowsilla (docker on sama, mutta hankalampi), ja sitten Kafka otetaan käyttöön virtuaalikoneessa Haitat: (1) O&M-henkilöstön tulee osata Linux-O&M-osaamista (2) Lisätä muistinkulutusta
Ilmiselvästi molempien vaihtoehtojen puutteet olivat minulle sietämättömiä, joten käänsin huomioni Kafka-yhteisöön avun toivossa.
Klikkaa tästä keskusteluun jumalten palvonnasta:Hyperlinkin kirjautuminen on näkyvissä.
Ymmärretään, että Kafkan ongelma ikkunan alla ei ole niin helppo kuin on kuviteltu.Virallista ratkaisua ei ole toistaiseksi。 Toisin sanoen (Älä käytä kafkaa ikkunan alla! )
Ratkaisu 3: Mutta siitä huolimatta tarve käyttää kafkaa ikkunan alla on yhä olemassa, joten monet jumalat kiinnittävät huomiota ja ehdottavat ratkaisuja. Yksi suurista jumalista on kehittänyt kafka-lähdekoodin tähän ongelmaan. Testauksen jälkeen hänen ratkaisunsa ratkaisi ongelman ikkunan alla, jolloin kafka saataisiin ikkunan alle. Kuitenkin tämän ratkaisun osalta Kafkan avustaja sanoi, ettei se välttämättä ole turvallinen (eli päivitystä ei voi integroida viralliseen versioon).
4: Ratkaise (lopussa on latauslinkki käännetystä kafka-paketista) Vaikka Kafkan viranomaiset sanovat, ettei paikka ole kovin turvallinen, viranomainen ei ole toistaiseksi tehnyt mitään. Ja kysyntää on kyllä, joten jonkin harkinnan jälkeen aion silti käyttää vaihtoehto 3:n menetelmää ratkaistakseni ongelman lopullisesti, joten lisäämme päivityksen ja käännämme kafkan uudelleen.
4.1: Kafka-päivitysversion lataus
Lataa tämän tekijän kafka-päivitysversio
Hyperlinkin kirjautuminen on näkyvissä.
4.2: Käännä Kafka-päivitysversio Koska kafka-kääntäminen tehdään gradlen kautta, sinun täytyy ensin konfiguroida gradle
Gradlen konfigurointia varten voit katsoa tästä artikkelista (uudelleenpainettu, rikkomus poistetaan) Gradlen asennus ja konfigurointi Windowsissa:Hyperlinkin kirjautuminen on näkyvissä.
Lisätietoja Kafkan kääntämisestä löydät githubista------ Kuinka kääntää Kafka Gradlella:Hyperlinkin kirjautuminen on näkyvissä.
Kääntämisen jälkeen voit hankkia Kafka-paketin, jota voi käyttää Windowsissa.
Kopioi-liitä -käsitteen mukaisesti (lähdekoodin kääntäminen vie edelleen melko paljon aikaa), tässä on latauslinkki kafka-paketille, jonka käännin, ja voit ladata sen ja käyttää sitä suoraan.
kafka_2.12-2.3.0_window Latausosoite anti-downtime-versiolle:
Hyperlinkin kirjautuminen on näkyvissä.
Alkuperäinen linkki:Hyperlinkin kirjautuminen on näkyvissä.
|