1 : Contexte
J’ai utilisé kafka dans l’environnement Linux auparavant, et il n’y avait aucun problème avec kafka lui-même. Cependant, un projet sur lequel je travaille actuellement doit être compatible avec Windows et Linux, et lorsque j’utilise Kafka dans l’environnement Windows, j’ai constaté que Kafka lui-même n’est pas aussi compatible avec Windows que Linux.
2 : Problème
En testant Kafka sous Windows, j’ai constaté que Kafka avait une erreur après son lancement pendant un certain temps :
Un autre programme utilise le fichier et le processus ne peut pas y accéder.
[2021-07-06 09:06:10,800] ERREUR : Échec de nettoyer le journal pour __consumer_offsets-42 dans le dir : C :\tmp\kafka-logs à cause de 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) sur sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java :97) sur sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java :387) at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java :287) sur java.nio.file.Files.move(Files.java :1395) sur org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java :904) à 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) à kafka.log.LazyIndex.renameTo(LazyIndex.scala :79) à kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala :496) à kafka.log.Log.$anonfun$replaceSegments$4(Log.scala :2402) à kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.scala :2402) sur scala.collection.immutable.List.foreach(List.scala :333) à kafka.log.Log.replaceSegments(Log.scala :2402) à kafka.log.Cleaner.cleanSegments(LogCleaner.scala :613) à kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala :538) à kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala :537) sur scala.collection.immutable.List.foreach(List.scala :333) à kafka.log.Cleaner.doClean(LogCleaner.scala :537) à kafka.log.Cleaner.clean(LogCleaner.scala :511) sur kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala :380) à kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala :352) à kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala :332) à kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala :321) at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala :96) Supprimé : java.nio.file.FileSystemException : C :\tmp\kafka-logs\__consumer_offsets-42\0000000000000000000000000.timeindex.cleaned -> C :\tmp\kafka-logs\__consumer_offsets-42\ 0000000000000000000000000.timeindex.swap : Un autre programme utilise ce fichier et le processus est inaccessible.
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java :86) sur sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java :97) sur sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java :301) at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java :287) sur java.nio.file.Files.move(Files.java :1395) sur org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java :901) ... 20 de plus
3 : Cause
La politique de nettoyage de journal de Kafka déclenche que, dans l’environnement Windows, il est interdit de renommer le fichier lors de l’ouverture du journal à nettoyer (ce qui est possible dans l’environnement Linux), ce qui provoque le plantage de Kafka.
La solution la plus courante sur Internet est de « vider les fichiers journaux de kafka et de redémarrer kafka », ce qui est évidemment irréaliste en production. Au début, j’ai donc proposé les deux solutions suivantes à la situation :
Solution 1 : Modifier la politique de nettoyage des journaux pour modifier le temps de nettoyage des journaux à infini (-1) afin de stocker de façon permanente les journaux de données kafka Inconvénients : (1) L’espace disque continuera d’augmenter Option 2 : Construire une machine virtuelle sous Windows (docker est le même, mais plus problématique), puis déployer Kafka dans la machine virtuelle Inconvénients : (1) Le personnel O&M doit connaître certaines connaissances en O&M Linux (2) Augmentation de la consommation de mémoire
Évidemment, les défauts des deux options étaient insupportables pour moi, alors j’ai tourné mon attention vers la communauté Kafka pour obtenir de l’aide.
Cliquez ici pour une discussion sur le culte des dieux :La connexion hyperlientérée est visible.
Il est compris que le problème de Kafka sous la fenêtre n’est pas aussi simple qu’on l’imagine.Il n’existe pas encore de solution officielle。 En d’autres termes (N’utilisez pas de kafka sous la fenêtre! )
Solution 3 : Mais même ainsi, le besoin d’utiliser kafka sous la fenêtre persiste, donc de nombreux dieux y prêtent attention et proposent des solutions. L’un des grands dieux a développé le code source kafka pour ce problème. Après test, sa solution a résolu le problème sous la fenêtre, rendant kafka disponible sous la fenêtre. Cependant, pour cette solution, le contributeur de Kafka a indiqué qu’elle pourrait ne pas être sûre (c’est-à-dire que le correctif ne peut pas être intégré à la version officielle).
4 : Résoudre (il y a un lien de téléchargement pour le package kafka compilé à la fin) Bien que les responsables de Kafka affirment que le patch n’est pas très sûr, le responsable n’a rien fait jusqu’à présent. Et la demande existe, donc après réflexion, je prévois toujours d’utiliser la méthode de l’option 3 pour résoudre le problème une bonne fois pour toutes, donc nous allons mettre le patch et recompiler kafka.
4.1 : téléchargement de la version du patch Kafka
Téléchargez la version kafka patch de cet auteur
La connexion hyperlientérée est visible.
4.2 : Compiler la version du correctif Kafka Puisque la compilation kafka se fait via Gradle, vous devez configurer Gradle First
Pour savoir comment configurer Gradle, vous pouvez vous référer à cet article (réimprimé, la contrefaçon sera supprimée) Installation et configuration de Gradle sous Windows :La connexion hyperlientérée est visible.
Pour des informations sur la façon de compiler Kafka, vous pouvez vous référer à github------ Comment compiler Kafka avec Gradle :La connexion hyperlientérée est visible.
Après compilation, vous pouvez obtenir un paquet Kafka qui peut être utilisé sous Windows.
Conformément au concept de « copier-coller » (après tout, compiler le code source reste assez chronophage), voici un lien de téléchargement pour le paquet kafka que j’ai compilé, et vous pouvez le télécharger et l’utiliser directement.
kafka_2.12-2.3.0_window Adresse de téléchargement pour la version anti-arrêt :
La connexion hyperlientérée est visible.
Lien original :La connexion hyperlientérée est visible.
|