|
|
Yayınlandı 12.07.2021 10:57:01
|
|
|
|

1: Arka plan
Daha önce Linux ortamında kafka kullandım ve kafka'nın kendisinde bir sorun olmadı. Ancak şu anda üzerinde çalıştığım bir projenin Windows ve Linux ile uyumlu olması gerekiyor ve Kafka'yı Window ortamında kullandığımda, Kafka'nın kendisinin Windows ile Linux kadar uyumlu olmadığını gördüm.
2: Sorun
Kafka'yı Window altında test ederken, Kafka'nın bir süre başlatıldıktan sonra bir hata olduğunu gördüm:
Dosyayı başka bir program kullanıyor ve süreç ona erişemiyor.
[2021-07-06 09:06:10,800] HATA __consumer_offsets-42 için direksiyon C:\tmp\kafka-logs dosyasında IOException (kafka.server.LogDirFailureChannel) nedeniyle günlüğü temizlemek başarısız oldu
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) adresinde sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) adresinde sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) adresinde sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) adresinde java.nio.file.Files.move(Files.java:1395) adresinde org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) adresinde kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210) adresinde at kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) at kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79) at kafka.log.LazyIndex.renameTo(LazyIndex.scala:79) at 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) scala.collection.immutable.List.foreach(List.scala:333) adresinde at kafka.log.Log.replaceSegments(Log.scala:2402) at kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613) at kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538) at kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537) scala.collection.immutable.List.foreach(List.scala:333) adresinde kafka.log.Cleaner.doClean(LogCleaner.scala:537) adresinde. at kafka.log.Cleaner.clean(LogCleaner.scala:511) kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380) adresinde kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352) adresinde kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332) adresinde kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321) adresinde kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) adresinde Gizlendi: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\000000000000000000000000000000.timeindex.clean.clean.> C:\tmp\kafka-logs\__consumer_offsets-42\ 00000000000000000000000000.timeindex.swap: Başka bir program bu dosyayı kullanıyor ve süreç erişilemez.
sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) adresinde sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) adresinde sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) adresinde sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) adresinde java.nio.file.Files.move(Files.java:1395) adresinde org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:901) adresinde ... 20 tane daha
3: Neden
Kafka log temizleme politikası, Windows ortamında dosyanın yeniden adlandırılmasına izin verilmediğini tetikler; temizlenmesi gereken logu açarken (Linux ortamında bu mümkündür), bu da Kafka'nın çökmesine neden olur.
İnternette en yaygın çözüm, "kafka'nın log dosyalarını boşaltmak ve kafka'yı yeniden başlatmak"tır; bu ise üretim ortamında açıkça gerçekçi değildir. Başlangıçta, durum için şu iki çözümü buldum:
Çözüm 1: Günlük temizleme politikasını değiştirerek kafka veri günlüklerini kalıcı olarak saklamak için günlük temizleme süresini sonsuza (-1) indirmek Dezavantajlar: (1) Disk alanı artmaya devam edecek Seçenek 2: Windows'ta bir sanal makine inşa edin (docker aynı ama daha sorunlu), ardından Kafka'yı sanal makinede dağıtın Dezavantajlar: (1) O&M personelinin Linux O&M bilgisine sahip olması gerekir (2) Bellek tüketimini artırmak
Elbette, her iki seçeneğin eksiklikleri benim için dayanılmaz bir şeydi, bu yüzden yardım için dikkatimi Kafka topluluğuna çevirdim.
Tanrılara tapınma üzerine tartışma için buraya tıklayın:Bağlantı girişi görünür.
Kafka penceresinin altındaki sorununun hayal edildiği kadar kolay olmadığı anlaşılıyor.Şu ana kadar resmi bir çözüm yok。 Başka bir deyişle (Pencere altındaki kafka kullanma! )
Çözüm 3: Ama yine de, pencere altında kafka kullanma ihtiyacı hâlâ var, bu yüzden hâlâ dikkat eden ve bazı çözümler sunan birçok tanrı var. Büyük tanrılardan biri bu sorun için kafka kaynak kodunu geliştirmiştir. Test ettikten sonra, çözümü pencere altındaki sorunu çözdü ve kafka'yı pencere altında erişilebilir hale getirdi. Ancak bu çözüm için Kafka'nın katkıcısı, bunun güvenli olmayabileceğini (yani yamanın resmi sürüme entegre edilemeyeceğini) söyledi.
4: Çözümle (derlenmiş kafka paketi için indirme linki sonunda var) Kafka yetkilileri yamanın çok güvenli olmadığını söylese de, yetkilinin şimdiye kadar hiçbir şey yapmadığını belirtti. Ve talep var, bu yüzden biraz düşündükten sonra sorunu tamamen çözmek için 3. seçenek yöntemini kullanmayı planlıyorum, yamayı koyup kafka'yı yeniden derleyeceğiz.
4.1: Kafka patch version download
Bu yazarın kafka yaması versiyonunu indirin
Bağlantı girişi görünür.
4.2: Kafka yama versiyonunu derleyin Kafka derlemesi gradle üzerinden yapıldığı için önce gradle'i yapılandırmanız gerekiyor
Gradle nasıl yapılandırılır, bu makaleye bakabilirsiniz (yeniden basıldı, ihlal silinecek) Windows altında gradle kurulumu ve yapılandırması:Bağlantı girişi görünür.
Kafka'nın nasıl derleneceği hakkında bilgi için github'a bakabilirsiniz------ Kafka'yı Gradle kullanarak nasıl derlersiniz:Bağlantı girişi görünür.
Derledikten sonra, Windows altında kullanılabilen bir Kafka paketi alabilirsiniz.
"Kopyala-yapıştır" kavramına uygun olarak (sonuçta kaynak kodunu derlemek hâlâ oldukça zaman alıcı), işte derlediğim kafka paketi için bir indirme bağlantısı var, doğrudan indirip kullanabilirsiniz.
kafka_2.12-2.3.0_window Anti-Stop versiyonu için indirme adresi:
Bağlantı girişi görünür.
Orijinal bağlantı:Bağlantı girişi görünür.
|
Önceki:MySQL, bir veritabanı tablosunun açıklamalarını sorgularÖnümüzdeki:Sql Server Bölümlenmiş Tabloların Özeti
|