Ich habe gerade ein neues Thema gemacht, habe noch keine Nachricht produziert. Eine Datei namens "0000000000000000000000.index" erstellt im Verzeichnis "/ tmp/kafka-logs-1/topicname-0 /", und die Größe dieser Datei ist wirklich groß. Ich öffnete diese binäre Datei in vi, und der Inhalt ist nur "0000 0000 0000 0000 ..." Was bedeutet das? Was ist die Indexdatei?Warum .index-Datei im Kafka-Log-Verzeichnis existiert?
Antwort
Jedes Segment eines Protokolls (die Dateien * .log) hat es entsprechende Index (die Dateien * .index) mit dem gleichen Namen wie sie repräsentieren die Basis Offset.
Zum Verständnis enthält die Protokolldatei die tatsächlichen Nachrichten in einem Nachrichtenformat strukturiert. Für jede Nachricht innerhalb dieser Datei beschreiben die ersten 64 Bits den inkrementierten Offset. Jetzt wird das Nachschlagen dieser Datei nach Nachrichten mit einem bestimmten Offset teuer, da Protokolldateien im Bereich von Gigabyte wachsen können. Und um Nachrichten produzieren zu können, muss der Broker solche Nachschlagevorgänge durchführen, um den neuesten Offset zu ermitteln und eingehende Nachrichten weiter korrekt zu inkrementieren.
diesem Grund gibt es eine Indexdatei ist. Zunächst einmal beschreibt die Struktur der Nachrichten innerhalb der Indexdatei nur zwei Felder, von denen jeder 32-Bit lang:
- 4 Bytes Relative
- 4 Bytes Offset: Physikalische Position
Wie Wie zuvor beschrieben, repräsentiert der Dateiname den Basisoffset. Im Gegensatz zu der Protokolldatei, in der der Offset für jede Nachricht erhöht wird, enthalten die Nachrichten in den Indexdateien relative Offsets zum Basisoffset. Das zweite Feld repräsentiert die physikalische Position der zugehörigen Protokollnachricht (Basisoffset + relativer Offset) und somit wird ein Nachschlagen von O (1) möglich.
Schließlich ist zu erwähnen, dass jede Nachricht nicht innerhalb einer Log hat es Nachricht innerhalb des Index ist entsprechend. Der Konfigurationsparameter index.interval.bytes, die standardmäßig 4096 Bytes ist, setzt ein Indexintervall, das im Prinzip beschreibt, wie häufig (nach dem, wie viele Bytes) ein Indexeintrag hinzugefügt werden.
In Bezug auf die Frage zur Größe der .index-Datei gibt es Folgendes zu sagen: Der Konfigurationsparameter segment.index.bytes, der standardmäßig 10 MB ist, beschreibt die Größe dieser Datei. Dieser Speicherplatz wird neu zugewiesen und wird erst nach dem Protokollieren von Rollen reduziert.
Jede Protokolldatei hat eine entsprechende Indexdatei. Der Zweck der Indexdatei wird verwendet, um logische Nachrichtenversätze in physische Positionen in der Datendatei zu übersetzen. wie gesehen here
EDIT:
Vom doc
Jede Partition ist eine geordnete, unveränderliche Folge von Datensätzen, die ständig angehängt wird zu einem protokollstrukturierten begehen.
In Kafka können die Themenpartitionen nicht auf mehrere Broker aufgeteilt werden. In Situationen, in denen Kafka nach Ablauf der Aufbewahrungsfrist einige Nachrichten von den Partitionen löschen muss, muss es die Partitionsdateien durchsuchen. Diese Operation wird sehr langsam sein, falls eine einzelne große Partition existiert. Um dies zu vermeiden, teilt Kafka die Partitionen in mehrere Segmente auf.
Neue Segmentdateien, die erstellt werden, wenn das aktuelle Segment (aktives Segment genannt) seine Größenbeschränkung erreicht hat (gesteuert durch die Eigenschaft log.segment.bytes
). Für jedes Segment gibt es eine log
Datei und eine index
Datei. Jetzt beginnt jedes Segment mit seinem Basis-Offset, der größer ist als der Offset in vorherigen Segmenten.
Die Protokolldatei z.B. 00000000005120942793.log
, wo Kafka tatsächlich die Nachrichten speichert zusammen mit allen Details Offset mag (sobald eine Nachricht in Kafka geschoben wird, wird es eine eindeutige laufende Nummer genannt Offset
gegeben.), Zeitstempel, Kompression, Nutzlast usw.
Die Indexdateien z 00000000005120942793.index
ordnen Sie die tatsächlichen Nachrichtenpositionen im Protokoll zu. Es besteht im Allgemeinen aus zwei Teilen mit jeweils 4 Byte. Der erste Teil speichert den Nachrichtenoffset (relativ zu seinem Basisoffset) und der spätere Teil speichert die Position der Nachricht. Index-Dateien sind Speicher-gemappt, und Kafka verwendet eine binäre Suche, um den nächsten Offset zu finden, der kleiner oder gleich dem Ziel-Offset ist.
Quelle:
http://kafka.apache.org/documentation.html#brokerconfigs http://supergsego.com/apache/kafka/0.8.2.0/scaladoc/kafka/log/OffsetIndex.html https://thehoard.blog/how-kafkas-storage-internals-work-3a29b02e026
Copy Paste obskuren Auszug aus docs und verknüpften Kommentar. – cevaris
wahrscheinlich verpasst Sie den Link mit der Antwort zur Verfügung gestellt – user2720864
Nö, sah die Quoren Link. Beide Antworten beantworten die OP-Frage nicht effektiv. – cevaris
- 1. Warum ... (drei Punkte) im Catch-Block existiert?
- 2. Indexdatei kleiner als
- 3. ng-view außerhalb der Indexdatei
- 4. Warum existiert Convert.ToInt32 (DateTime)?
- 5. Warum existiert `ScalaObject`?
- 6. Symbol existiert im Systray?
- 7. Warum indexof -1 zurückgibt, wenn Element im Text existiert
- 8. Warum existiert -0?
- 9. Warum existiert Console.Out.WriteLine?
- 10. Warum existiert Mingw?
- 11. Speichern Lucene-Indexdatei an entfernten Standort
- 12. Steuerelement existiert nicht im Namespace
- 13. Microsoft.Reporting existiert nicht im Namensraum
- 14. Warum existiert die Pop-Methode?
- 15. Array.Initialize - Warum existiert diese Methode?
- 16. git svn rebase Indexdatei fehlgeschlagen öffnen: Invalid argument
- 17. Warum bekomme ich Paket javax.crypto nicht existiert
- 18. <head> Tags Indexdatei bricht das Hinzufügen express Routing
- 19. Verwendung Live-Reload, wenn Indexdatei in einem Ordner
- 20. Nuget Paket ... existiert nicht im Projekt ... Paket ... existiert bereits im Ordner
- 21. Das Ziel "_CopyBinDeployableAssemblies" existiert nicht im Projekt
- 22. int [] existiert nicht im aktuellen Kontext
- 23. 'Web' existiert nicht im Namensraum 'System'
- 24. „ASP.global_asax existiert nicht im Namespace ASP“
- 25. CS0234: Mvc existiert nicht im Namespace System.Web
- 26. Steuerung von WPFToolkit existiert nicht im Namensraum
- 27. Klasse 'myClassName' existiert bereits im Paket 'myPackageName'
- 28. Identität existiert nicht im Namensraum 'Microsoft.AspNetCore'
- 29. Newtonsoft.Json [8.0.3, 'existiert nicht im Projekt
- 30. RewriteRule-Überprüfungsdatei im Rewrizen-Dateipfad existiert
Was meinen Sie mit "dieser Raum wird neu zugewiesen"? –
Ich habe festgestellt, dass es eine Datei mit dem Präfix * .timeindex * gibt. Wofür ist es ? –
Der Zeitindex bietet eine Möglichkeit, schnell auf eine Nachricht basierend auf dem Zeitstempel und nicht auf dem Offsetwert zuzugreifen. Mit der offsetsForTimes() -Methode können Sie sogar einen Offset nach Zeitmarken suchen –