1: Taust
Kasutasin Kafkat varem Linuxi keskkonnas ja kafkaga endaga probleeme ei olnud. Kuid projekt, millega praegu tegelen, peab olema ühilduv Windowsi ja Linuxiga ning kui kasutan Kafkat Windowsi keskkonnas, avastasin, et Kafka ise ei ühildu Windowsiga nii hästi kui Linux.
2: Probleem
Kui testisin Kafkat Windowsi all, leidsin, et Kafkal oli pärast selle käivitamist teatud aja jooksul viga:
Teine programm kasutab faili ja protsess ei saa sellele ligi.
[2021-07-06 09:06:10,800] ERROR Ei õnnestunud puhastada logi __consumer_offsets-42 kohta diris C:\tmp\kafka-logs IOException (kafka.server.LogDirFailureChannel) tõttu
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) aadressil sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) aadressil sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) aadressil sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) aadressil java.nio.file.Files.move(Files.java:1395) aadressil org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) aadressil kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210) at kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) aadressil kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79) aadressil kafka.log.LazyIndex.renameTo(LazyIndex.scala:79) aadressil 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) aadressil scala.collection.immutable.List.foreach(List.scala:333) aadressil kafka.log.Log.replaceSegments(Log.scala:2402) aadressil kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613) aadressil kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538) aadressil kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537) aadressil scala.collection.immutable.List.foreach(List.scala:333) aadressil kafka.log.Cleaner.doClean(LogCleaner.scala:537) aadressil kafka.log.Cleaner.clean(LogCleaner.scala:511) aadressil kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380) aadressil kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352) aadressil kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332) aadressil kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321) aadressil kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) Summutatud: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\000000000000000000000000000.timeindex.cleaned -> C:\tmp\kafka-logs\__consumer_offsets-42\ 0000000000000000000000000000.timeindex.swap: Teine programm kasutab seda faili ja protsess on ligipääsmatu.
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) aadressil sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) aadressil sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) aadressil sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) aadressil java.nio.file.Files.move(Files.java:1395) aadressil org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) ... Veel 20
3: Põhjus
Kafka logide puhastamise poliitika käivitab, et Windowsi keskkonnas ei tohi faili ümber nimetada, kui avatakse puhastamist vajav logi (see on võimalik Linuxi keskkonnas), mis põhjustab Kafka krahhi.
Kõige tavalisem lahendus internetis on "tühjendada kafka logifailid ja taaskäivitada kafka", mis on tootmiskeskkonnas ilmselgelt ebarealistlik. Nii et alguses mõtlesin välja järgmised kaks lahendust sellele olukorrale:
Lahendus 1: Muuda logide puhastamise poliitikat nii, et logide puhastamise aeg muutuks lõpmatuks (-1), et salvestada kafka andmelogid püsivalt Puudused: (1) Ketta ruum kasvab jätkuvalt Variant 2: Ehita virtuaalmasin Windowsis (docker on sama, aga keerulisem) ja seejärel paigalda Kafka virtuaalmasinasse Puudused: (1) O&M töötajad peavad teadma Linuxi O&M teadmisi (2) Suurendada mälutarbimist
Ilmselgelt olid mõlema variandi puudused minu jaoks talumatud, nii et pöörasin tähelepanu Kafka kogukonnale abi saamiseks.
Klõpsake siia, et arutada jumalate kummardamist:Hüperlingi sisselogimine on nähtav.
On arusaadav, et Kafka akna all olemise probleem ei ole nii lihtne, kui arvatakse.Ametlikku lahendust pole seni。 Teisisõnu (Ära kasuta kafkat akna all! )
Lahendus 3: Kuid isegi nii on vajadus kasutada kafkat akna all endiselt, nii et paljud jumalad pööravad tähelepanu ja pakuvad lahendusi. Üks suurtest jumalatest on selle probleemi jaoks välja töötanud kafka lähtekoodi. Pärast testimist lahendas tema lahendus akna all oleva probleemi, muutes kafka akna all kättesaadavaks. Kuid selle lahenduse puhul ütles Kafka kaastööline, et see ei pruugi olla turvaline (st plaastrit ei saa ametlikku versiooni integreerida).
4: Lahenda (lõpus on allalaadimislink kompileeritud kafka paketile) Kuigi Kafka ametnikud ütlevad, et plaaster pole väga ohutu, pole ametnik seni midagi ette võtnud. Ja nõudlus on olemas, nii et pärast mõningast kaalumist plaanin ikkagi kasutada variandi 3 meetodit, et probleem lõplikult lahendada, nii et paneme plaastri sisse ja kompileerime kafka uuesti.
4.1: Kafka plaastri versiooni allalaadimine
Laadi alla selle autori kafka patch versioon
Hüperlingi sisselogimine on nähtav.
4.2: Kafka patchi versiooni kompileerimine Kuna kafka kompileerimine toimub gradle'i kaudu, tuleb esmalt gradle'i seadistada
Gradle'i seadistamise kohta võid vaadata seda artiklit (trükitud uuesti, rikkumine kustutatakse) Gradle'i paigaldamine ja seadistamine Windowsi all:Hüperlingi sisselogimine on nähtav.
Kafka kompileerimise kohta leiad infot githubist------ Kuidas kompileerida Kafkat Gradle'i abil:Hüperlingi sisselogimine on nähtav.
Pärast kompileerimist saad Kafka paketi, mida saab kasutada Windowsi all.
Kooskõlas "copy-paste" kontseptsiooniga (lõppude lõpuks on lähtekoodi kompileerimine endiselt üsna aeganõudev), siin on allalaadimislink minu kompileeritud kafka paketile, mida saad otse alla laadida ja kasutada.
kafka_2.12-2.3.0_window Allalaadimisaadress seisakuvastase versiooni jaoks:
Hüperlingi sisselogimine on nähtav.
Originaallink:Hüperlingi sisselogimine on nähtav.
|