1. Pagrindiniai faktai
Anksčiau naudojau kafką Linux aplinkoje, o su pačia kafka problemų nebuvo. Tačiau projektas, prie kurio šiuo metu dirbu, turi būti suderinamas su "Windows" ir "Linux", o kai naudoju "Kafka" "Windows" aplinkoje, pastebėjau, kad pati "Kafka" nėra tokia suderinama su "Windows" kaip "Linux".
2: Problema
Bandydamas "Kafka" sistemoje "Windows", pastebėjau, kad "Kafka" turėjo klaidą po to, kai jis buvo paleistas tam tikrą laiką:
Failą naudoja kita programa ir procesas negali jo pasiekti.
[2021-07-06 09:06:10,800] KLAIDA Nepavyko išvalyti __consumer_offsets-42 žurnalo kataloge C:\tmp\kafka-logs dėl 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: 另一个程序正在使用此文件,进程无法访问。
adresu sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) adresu sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) adresu sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) adresu sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) java.nio.file.Files.move(Files.java:1395) adresu org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) adresu kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210) adresu kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) adresu kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79) adresu kafka.log.LazyIndex.renameTo(LazyIndex.scala:79) adresu kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala:496) adresu kafka.log.Log.$anonfun$replaceSegments$4(Log.scala:2402) kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.scala:2402) adresu scala.collection.immutable.List.foreach(List.scala:333) adresu kafka.log.Log.replaceSegments(Log.scala:2402) adresu kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613) adresu kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538) adresu kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537) adresu scala.collection.immutable.List.foreach(List.scala:333) adresu kafka.log.Cleaner.doClean(LogCleaner.scala:537) adresu kafka.log.Cleaner.clean(LogCleaner.scala:511) adresu kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380) adresu kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352) adresu kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332) adresu kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321) adresu kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) Slopinta: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\0000000000000000000000.timeindex.cleaned -> C:\tmp\kafka-logs\__consumer_offsets-42\ 0000000000000000000000000000.timeindex.swap: Šį failą naudoja kita programa ir procesas nepasiekiamas.
adresu sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) adresu sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) adresu sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) adresu sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) java.nio.file.Files.move(Files.java:1395) adresu org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) ... Dar 20
3: Priežastis
"Kafka" žurnalo valymo politika suaktyvina, kad "Windows" aplinkoje neleidžiama pervardyti failo atidarant žurnalą, kurį reikia išvalyti (tai įmanoma "Linux" aplinkoje), todėl "Kafka" sugenda.
Dažniausias sprendimas internete yra "ištuštinti kafkos žurnalo failus ir iš naujo paleisti kafką", o tai akivaizdžiai nerealu gamybos aplinkoje. Taigi pradžioje sugalvojau šiuos du situacijos sprendimus:
1 sprendimas: pakeiskite žurnalo valymo strategiją, kad pakeistumėte žurnalo valymo laiką į begalinį (-1), kad kafkos duomenų žurnalai būtų saugomi visam laikui Trūkumai: (1) Vieta diske ir toliau didės 2 variantas: sukurkite virtualią mašiną sistemoje "Windows" (docker yra tas pats, bet varginantis), tada įdiekite Kafką virtualioje mašinoje Trūkumai: (1) O&M personalas turi žinoti kai kurias Linux O&M žinias (2) Padidinkite atminties sunaudojimą
Akivaizdu, kad abiejų variantų trūkumai man buvo nepakeliami, todėl kreipiausi pagalbos į Kafkos bendruomenę.
Spauskite čia diskusijai apie dievų garbinimą:Hipersaito prisijungimas matomas.
Suprantama, kad Kafkos problema po langu nėra tokia lengva, kaip įsivaizduojama.Kol kas nėra oficialaus sprendimo。 Kitaip tariant (Nenaudokite kafkos po langu! )
3 sprendimas: Tačiau net ir tokiu atveju poreikis naudoti kafką po langu vis dar egzistuoja, todėl vis dar yra daug dievų, kurie atkreipia dėmesį ir siūlo kai kuriuos sprendimus. Vienas iš didžiųjų dievų sukūrė kafkos šaltinio kodą šiai problemai. Po bandymų jo sprendimas išsprendė problemą po langu, todėl kafka buvo prieinama po langu. Tačiau šiam sprendimui Kafkos bendraautorius teigė, kad jis gali būti nesaugus (tai yra, pataisos negalima integruoti į oficialią versiją).
4: Išspręskite (pabaigoje yra sukompiliuoto kafkos paketo atsisiuntimo nuoroda) Nors Kafkos pareigūnai teigia, kad pleistras nėra labai saugus, pareigūnas iki šiol nieko nepadarė. Ir paklausa egzistuoja, todėl po tam tikrų svarstymų, aš vis dar planuoju naudoti 3 varianto metodą, kad išspręstume problemą kartą ir visiems laikams, todėl mes įdėsime pleistrą ir iš naujo kompiliuosime kafką.
4.1: Kafka pataisos versijos atsisiuntimas
Atsisiųskite šio autoriaus kafkos pleistro versiją
Hipersaito prisijungimas matomas.
4.2: Kompiliuokite Kafkos pataisos versiją Kadangi kafkos kompiliavimas atliekamas per gradle, pirmiausia turite sukonfigūruoti gradle
Norėdami sužinoti, kaip sukonfigūruoti gradle, galite peržiūrėti šį straipsnį (perspausdintas, pažeidimas bus ištrintas) Gradle diegimas ir konfigūravimas sistemoje Windows:Hipersaito prisijungimas matomas.
Norėdami gauti informacijos apie tai, kaip kompiliuoti Kafką, galite kreiptis į github------ Kaip kompiliuoti Kafką naudojant Gradle:Hipersaito prisijungimas matomas.
Sukompiliavę galite gauti "Kafka" paketą, kurį galima naudoti sistemoje "Windows".
Pagal "kopijavimo-įklijavimo" koncepciją (juk šaltinio kodo sudarymas vis dar užima gana daug laiko), čia yra mano sudaryto kafkos paketo atsisiuntimo nuoroda, kurią galite atsisiųsti ir naudoti tiesiogiai.
kafka_2.12-2.3.0_window Anti-prastovos versijos atsisiuntimo adresas:
Hipersaito prisijungimas matomas.
Originali nuoroda:Hipersaito prisijungimas matomas.
|