1: Предыстория
Раньше я использовал Kafka в среде Linux, и с самой Kafka проблем не было. Однако проект, над которым я сейчас работаю, должен быть совместим с Windows и Linux, и когда я использую Kafka в среде Windows, я обнаружил, что сама Kafka не так совместима с Windows, как Linux.
2: Проблема
При тестировании Kafka в Windows я обнаружил, что после запуска Kafka появилась ошибка в течение определённого времени:
Другая программа использует файл, и процесс не может к нему получить доступ.
[2021-07-06 09:06:10,800] ОШИБКА Не удалось очистить журнал для __consumer_offsets-42 в dir C:\tmp\kafka-logs из-за 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: 另一个程序正在使用此文件,进程无法访问。
на sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) на sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) на sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) на sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) на java.nio.file.Files.move(Files.java:1395) на org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) на kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210) kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) на 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) at 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) at scala.collection.immutable.List.foreach(List.scala:333) на kafka.log.Cleaner.doClean(LogCleaner.scala:537) на kafka.log.Cleaner.clean(LogCleaner.scala:511) на 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) на kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) Подавлено: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\0000000000000000000000.timeindex.clean -> C:\tmp\kafka-logs\__consumer_offsets-42\ 000000000000000000000000.timeindex.swap: Другая программа использует этот файл, и процесс недоступен.
на sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) на sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) на sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) на sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) на java.nio.file.Files.move(Files.java:1395) на org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) ... Ещё 20
3: Причина
Политика очистки журналов Kafka запускает то, что в окружении Windows нельзя переименовать файл при открытии журнала, который нужно очистить (это возможно в среде Linux), что приводит к сбою Kafka.
Самое распространённое решение в интернете — «опустошить лог-файлы Kafka и перезапустить Kafka», что явно нереалистично в производственной среде. Поэтому в начале я предложил следующие два решения для этой ситуации:
Решение 1: Изменить политику очистки журнала, чтобы изменить время очистки журнала на бесконечное (-1) для постоянного хранения данных Kafka Недостатки: (1) Пространство диска будет продолжать увеличиваться Вариант 2: Постройте виртуальную машину на Windows (docker такая же, но более проблематично), а затем развернуть Kafka в виртуальной машине Недостатки: (1) Персонал O&M должен знать некоторые знания по эксплуатации и машине Linux (2) Увеличить потребление памяти
Очевидно, что недостатки обоих вариантов были для меня невыносимы, поэтому я обратил внимание на сообщество Kafka за помощью.
Нажмите здесь, чтобы обсудить поклонение богам:Вход по гиперссылке виден.
Известно, что проблема с Кафкой под окном не так проста, как предполагалось.Официального решения пока нет。 Другими словами (Не используйте кафку под окном! )
Решение 3: Но даже так, необходимость использовать кафку под окном всё ещё существует, поэтому многие боги всё ещё обращают внимание и предлагают решения. Один из великих богов разработал исходный код Кафки для этой задачи. После тестирования его решение решило проблему под окном, сделав Кафку доступной под окном. Однако для этого решения автор Kafka отметил, что оно может быть небезопасным (то есть патч не может быть интегрирован в официальную версию).
4: Solve (в конце есть ссылка для скачивания скомпилированного пакета Kafka) Хотя представители Кафки утверждают, что нашивка не очень безопасна, до сих пор они ничего не предприняли. И спрос существует, поэтому, после некоторых раздумий, я всё ещё планирую использовать метод варианта 3, чтобы решить проблему раз и навсегда, поэтому мы вставим патч и перекомпилируем Kafka.
4.1: Скачать патч Kafka
Скачайте кафка-патч этого автора
Вход по гиперссылке виден.
4.2: Компиляция патча Kafka Поскольку компиляция Kafka осуществляется через gradle, сначала нужно настроить gradle
Чтобы узнать о том, как настроить gradle, вы можете ознакомиться с этой статьёй (перепечатана, нарушение будет удалено) Установка и настройка gradle в Windows:Вход по гиперссылке виден.
Для получения информации о том, как компилировать Kafka, вы можете обратиться на github------ Как скомпилировать Kafka с помощью Gradle:Вход по гиперссылке виден.
После компиляции можно получить пакет Kafka, который можно использовать в Windows.
В соответствии с концепцией «копировать-вставить» (в конце концов, компиляция исходного кода всё равно занимает много времени), вот ссылка для скачивания пакета Kafka, который я скомпилировал, и вы можете скачать его и использовать напрямую.
kafka_2.12-2.3.0_window Адрес для скачивания версии против простоя:
Вход по гиперссылке виден.
Оригинальная ссылка:Вход по гиперссылке виден.
|