1: Ιστορικό
Χρησιμοποιούσα το kafka στο περιβάλλον Linux στο παρελθόν και δεν υπήρχε πρόβλημα με το ίδιο το kafka. Ωστόσο, ένα έργο στο οποίο εργάζομαι αυτήν τη στιγμή πρέπει να είναι συμβατό με τα Windows και το Linux και όταν χρησιμοποιώ το Kafka στο περιβάλλον των Windows, διαπίστωσα ότι το ίδιο το Kafka δεν είναι τόσο συμβατό με τα Windows όσο το Linux.
2: Πρόβλημα
Κατά τη δοκιμή του Kafka στο παράθυρο, διαπίστωσα ότι το 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) στο 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$προσαρμοσμένο(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\00000000000000000000000.timeindex.cleaned -> C:\tmp\kafka-logs\__consumer_offsets-42\ 0000000000000000000000000000.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 O&M (2) Αυξήστε την κατανάλωση μνήμης
Προφανώς, οι ελλείψεις και των δύο επιλογών ήταν αφόρητες για μένα, οπότε έστρεψα την προσοχή μου στην κοινότητα του Κάφκα για βοήθεια.
Κάντε κλικ εδώ για μια συζήτηση σχετικά με τη λατρεία των θεών:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Εννοείται ότι το πρόβλημα του Κάφκα κάτω από το παράθυρο δεν είναι τόσο εύκολο όσο φανταζόμασταν.Δεν υπάρχει επίσημη λύση μέχρι στιγμής。 Με άλλα λόγια (Μην χρησιμοποιείτε τον Κάφκα κάτω από το παράθυρο! )
Λύση 3: Αλλά ακόμα κι έτσι, η ανάγκη χρήσης του κάφκα κάτω από το παράθυρο εξακολουθεί να υπάρχει, επομένως υπάρχουν ακόμα πολλοί θεοί που δίνουν προσοχή και προτείνουν κάποιες λύσεις. Ένας από τους μεγάλους θεούς έχει αναπτύξει τον πηγαίο κώδικα του Κάφκα για αυτό το πρόβλημα. Μετά τη δοκιμή, η λύση του έλυσε το πρόβλημα κάτω από το παράθυρο, καθιστώντας τον κάφκα διαθέσιμο κάτω από το παράθυρο. Ωστόσο, για αυτή τη λύση, ο συνεργάτης του Κάφκα είπε ότι μπορεί να μην είναι ασφαλής (δηλαδή, το patch δεν μπορεί να ενσωματωθεί στην επίσημη έκδοση).
4: Επίλυση (υπάρχει ένας σύνδεσμος λήψης για το μεταγλωττισμένο πακέτο kafka στο τέλος) Αν και οι αξιωματούχοι του Κάφκα λένε ότι το έμπλαστρο δεν είναι πολύ ασφαλές, ο αξιωματούχος δεν έχει κάνει τίποτα μέχρι στιγμής. Και η ζήτηση υπάρχει, οπότε μετά από λίγη σκέψη, εξακολουθώ να σκοπεύω να χρησιμοποιήσω τη μέθοδο της επιλογής 3 για να λύσω το πρόβλημα μια για πάντα, οπότε θα βάλουμε το έμπλαστρο και θα μεταγλωττίσουμε ξανά τον Κάφκα.
4.1: Λήψη έκδοσης ενημέρωσης κώδικα Kafka
Κατεβάστε την έκδοση ενημέρωσης κώδικα kafka αυτού του συγγραφέα
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
4.2: Μεταγλώττιση της έκδοσης του Kafka patch Δεδομένου ότι η συλλογή kafka γίνεται μέσω gradle, πρέπει πρώτα να διαμορφώσετε το gradle
Για τον τρόπο διαμόρφωσης του gradle, μπορείτε να ανατρέξετε σε αυτό το άρθρο (ανατύπωση, η παραβίαση θα διαγραφεί) Εγκατάσταση και διαμόρφωση του gradle στα Windows:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Για πληροφορίες σχετικά με τον τρόπο μεταγλώττισης του Κάφκα, μπορείτε να ανατρέξετε στο github------ Πώς να μεταγλωττίσετε τον Κάφκα χρησιμοποιώντας το Gradle:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Μετά τη μεταγλώττιση, μπορείτε να λάβετε ένα πακέτο Kafka που μπορεί να χρησιμοποιηθεί στα Windows.
Σύμφωνα με την έννοια του "copy-paste" (εξάλλου, η μεταγλώττιση του πηγαίου κώδικα εξακολουθεί να είναι αρκετά χρονοβόρα), εδώ είναι ένας σύνδεσμος λήψης για το πακέτο kafka που συνέταξα και μπορείτε να το κατεβάσετε και να το χρησιμοποιήσετε απευθείας.
kafka_2.12-2.3.0_window Διεύθυνση λήψης για την έκδοση anti-downtime:
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Αρχικός σύνδεσμος:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
|