Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 14467|Відповідь: 1

Система Kafka Windows зависає після певного часу роботи

[Копіювати посилання]
Опубліковано 12.07.2021 10:57:01 | | | |
1: Передумови

Раніше я використовував Kafka у Linux-середовищі, і з самим Kafka проблем не було. Однак проєкт, над яким я зараз працюю, має бути сумісним з Windows і Linux, і коли я використовую Kafka у Windows, я виявив, що сама Kafka не так сумісна з Windows, як Linux.

2: Проблема

Під час тестування Kafka у Windows я виявив, що Kafka мала помилку після запуску протягом певного часу:

Інша програма використовує файл, і процес не може до нього отримати доступ.
Наступні рішення не повністю вирішують проблему і не рекомендуються

Windows Kafka ПОМИЛКА Не вдалося очистити журнал для __consumer_offsets
https://www.itsvse.com/thread-9980-1-1.html




[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)
        за адресою 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)
        за адресою 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\000000000000000000000000.timeindex.clean -> C:\tmp\kafka-logs\__consumer_offsets-42\ 000000000000000000000000000.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: Розв'язання (наприкінці є посилання на завантаження зібраного пакету Kafka)
Хоча представники Kafka кажуть, що нашивка не дуже безпечна, поки що він нічого не зробив. І попит існує, тож після деяких роздумів я все ще планую використати метод варіанту 3, щоб остаточно вирішити проблему, тож ми додамо патч і перекомпілюємо Kafka.

4.1: Завантажити версію патчу Kafka

Завантажте версію Kafka Patch цього автора

Вхід за гіперпосиланням видно.

4.2: Компіляція версії патчу Kafka
Оскільки компіляція Kafka здійснюється через gradle, спочатку потрібно налаштувати gradle

Для налаштування gradle можна звернутися до цієї статті (перевидано, порушення буде видалено) Встановлення та налаштування gradle у Windows:Вхід за гіперпосиланням видно.

Інформацію про компіляцію Kafka можна знайти на github------ Як компілювати Kafka за допомогою Gradle:Вхід за гіперпосиланням видно.

Після компіляції можна отримати пакет Kafka, який можна використовувати під Windows.

Відповідно до концепції «копіювання-вставлення» (адже компіляція вихідного коду все одно займає багато часу), ось посилання на завантаження пакету Kafka, який я скомпілював, і ви можете завантажити його та використовувати безпосередньо.

kafka_2.12-2.3.0_window Адреса завантаження для версії з анти-простоєм:

Вхід за гіперпосиланням видно.

Оригінальне посилання:Вхід за гіперпосиланням видно.







Попередній:MySQL робить запити до анотації таблиці бази даних
Наступний:Огляд розділених таблиць SQL Server
Опубліковано 12.07.2021 21:16:33 |
Бос форуму, який ще не грав, так глибоко обожнюється
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com