2013-10-16 14 views
9

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

22

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:

  1. 4 Bytes Relative
  2. 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.

+0

Was meinen Sie mit "dieser Raum wird neu zugewiesen"? –

+2

Ich habe festgestellt, dass es eine Datei mit dem Präfix * .timeindex * gibt. Wofür ist es ? –

+0

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 –

-2

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

+0

Copy Paste obskuren Auszug aus docs und verknüpften Kommentar. – cevaris

+0

wahrscheinlich verpasst Sie den Link mit der Antwort zur Verfügung gestellt – user2720864

+0

Nö, sah die Quoren Link. Beide Antworten beantworten die OP-Frage nicht effektiv. – cevaris

Verwandte Themen