1: Antecedentes
Antes usé kafka en el entorno Linux y no hubo ningún problema con kafka en sí. Sin embargo, un proyecto en el que estoy trabajando actualmente debe ser compatible con Windows y Linux, y cuando uso Kafka en el entorno Windows, descubrí que Kafka en sí no es tan compatible con Windows como Linux.
2: Problema
Al probar Kafka en Windows, descubrí que Kafka tenía un error después de que se lanzara durante un tiempo:
Otro programa está usando el archivo y el proceso no puede acceder a él.
Las siguientes soluciones no resuelven completamente el problema y no se recomiendan
ERROR de Kafka en Windows: No se ha conseguido limpiar el registro de __consumer_offsets
https://www.itsvse.com/thread-9980-1-1.html
[2021-07-06 09:06:10,800] ERROR No se ha conseguido limpiar el log para __consumer_offsets-42 en el dir: C:\tmp\kafka-logs debido a 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: 另一个程序正在使用此文件,进程无法访问。
en sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) en sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) en sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) en java.nio.file.Files.move(Files.java:1395) en org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) en kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210) at kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) en kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79) en kafka.log.LazyIndex.renameTo(LazyIndex.scala:79) en kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala:496) en kafka.log.Log.$anonfun$replaceSegments$4(Log.scala:2402) en kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.scala:2402) en scala.collection.immutable.List.foreach(List.scala:333) en kafka.log.Log.replaceSegments(Log.scala:2402) en kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613) en kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538) en kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537) en scala.collection.immutable.List.foreach(List.scala:333) en kafka.log.Cleaner.doClean(LogCleaner.scala:537) en kafka.log.Cleaner.clean(LogCleaner.scala:511) en kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380) en kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352) en kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332) en kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321) en kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) Suprimido: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\000000000000000000000000.timeindex.cleaned -> C:\tmp\kafka-logs\__consumer_offsets-42\ 00000000000000000000000.timeindex.swap: Otro programa está usando este archivo y el proceso es inaccesible.
en sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) en sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) en sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) en java.nio.file.Files.move(Files.java:1395) en org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) ... 20 más
3: Causa
La política de limpieza de registros de Kafka activa que en el entorno Windows no está permitido renombrar el archivo al abrir el registro que necesita limpieza (es posible en el entorno Linux), lo que provoca que Kafka se bloquee.
La solución más común en Internet es "vaciar los archivos de registro de kafka y reiniciar kafka", lo cual es obviamente poco realista en un entorno de producción. Así que al principio, propuse las siguientes dos soluciones para la situación:
Solución 1: Modificar la política de limpieza de registros para cambiar el tiempo de limpieza a infinito (-1) y así almacenar los registros de datos kafka de forma permanente Desventajas: (1) El espacio en disco seguirá aumentando Opción 2: Construir una máquina virtual en Windows (docker es igual, pero más problemático), y luego desplegar Kafka en la máquina virtual Desventajas: (1) El personal de O&M necesita conocer algunos conocimientos de O&M en Linux (2) Aumentar el consumo de memoria
Obviamente, las carencias de ambas opciones eran insoportables para mí, así que dirigí mi atención a la comunidad Kafka en busca de ayuda.
Haz clic aquí para una discusión sobre la adoración de los dioses:El inicio de sesión del hipervínculo es visible.
Se entiende que el problema de Kafka bajo la ventana no es tan sencillo como se imagina.Hasta ahora no hay una solución oficial。 En otras palabras (No uses kafka debajo de la ventana! )
Solución 3: Pero aun así, la necesidad de usar kafka bajo la ventana sigue existiendo, así que todavía hay muchos dioses que prestan atención y proponen algunas soluciones. Uno de los grandes dioses ha desarrollado el código fuente kafka para este problema. Tras las pruebas, su solución resolvió el problema bajo la ventana, haciendo que kafka estuviera disponible bajo la ventana. Sin embargo, para esta solución, el colaborador de Kafka dijo que puede no ser segura (es decir, el parche no puede integrarse en la versión oficial).
4: Resolver (hay un enlace de descarga para el paquete kafka compilado al final) Aunque los funcionarios de Kafka dicen que el parche no es muy seguro, el funcionario no ha hecho nada hasta ahora. Y la demanda existe, así que tras pensarlo un poco, sigo planeando usar el método de la opción 3 para resolver el problema de una vez por todas, así que pondremos el parche y recompilaremos kafka.
4.1: Descarga de la versión del parche de Kafka
Descarga la versión kafka patch de este autor
El inicio de sesión del hipervínculo es visible.
4.2: Compilar la versión del parche de Kafka Como la compilación de kafka se hace a través de gradle, necesitas configurar gradle primero
Para saber cómo configurar Gradle, puedes consultar este artículo (reimpreso, la infracción será eliminada) Instalación y configuración de Gradle en Windows:El inicio de sesión del hipervínculo es visible.
Para información sobre cómo compilar Kafka, puedes consultar github------ Cómo compilar Kafka usando Gradle:El inicio de sesión del hipervínculo es visible.
Después de compilar, puedes obtener un paquete Kafka que se puede usar bajo Windows.
En línea con el concepto de "copiar y pegar" (al fin y al cabo, compilar el código fuente sigue siendo bastante laborioso), aquí tienes un enlace de descarga para el paquete kafka que he compilado, y puedes descargarlo y usarlo directamente.
kafka_2.12-2.3.0_window Dirección de descarga para la versión anti-inactividad:
El inicio de sesión del hipervínculo es visible.
Enlace original:El inicio de sesión del hipervínculo es visible.
|