Я только что создал новую тему и еще не написал ни одного сообщения. Файл с именем 00000000000000000000.index
был создан в каталоге /tmp/kafka-logs-1/topicname-0/
, и размер этого файла действительно большой. Я открыл этот двоичный файл в vi, и его содержимое - только "0000 0000 0000 0000..." Что это значит? О чем этот индексный файл?
Почему файлы.index существуют в каталоге kafka-log?
Ответ 1
Каждый сегмент журнала (файлы *.log) имеет соответствующий индекс (файлы *.index) с тем же именем, что и base offset.
Для понимания, файл журнала содержит фактические сообщения, структурированные в формате сообщения. Для каждого сообщения в этом файле первые 64 бита описывают добавленное смещение. Теперь поиск этого файла для сообщений со специальным смещением становится дорогим, поскольку файлы журналов могут расти в диапазоне от гигабайт. Чтобы иметь возможность создавать сообщения, брокер фактически должен делать такие поисковые запросы, чтобы определить последнее смещение и иметь возможность дополнительно увеличивать входящие сообщения правильно.
Вот почему есть индексный файл. Прежде всего, структура сообщений в файле индекса описывает только 2 поля, каждый из которых длиной 32 бит:
- 4 байта: относительное смещение
- 4 байта: физическая позиция
Как описано выше, имя файла представляет собой базовое смещение. В отличие от файла журнала, где смещение увеличивается для каждого сообщения, сообщения в файлах индекса содержат относительные смещения к базовому смещению. Второе поле представляет физическое положение связанного сообщения журнала (смещение базы + относительное смещение), и, таким образом, возможен поиск O (1).
В конце концов, нужно отметить, что не каждое сообщение в журнале имеет соответствующее сообщение в индексе. Параметр конфигурации index.interval.bytes, который по умолчанию составляет 4096 байт, устанавливает индексный интервал, который в основном описывает, как часто (после того, сколько байтов) будет добавлена запись индекса.
Что касается вопроса о размере файла .index, можно сказать следующее: параметр конфигурации segment.index.bytes, который по умолчанию равен 10 МБ, описывает размер этого файла. Это пространство перераспределяется и будет сокращаться только после рулонов журнала.
Ответ 2
Каждый файл журнала имеет соответствующий индексный файл, цель индексного файла используется для перевода смещений логических сообщений на физические позиции в файле данных. как показано здесь
EDIT:
Из документа
Каждый раздел представляет собой упорядоченную неизменяемую последовательность записей, которая постоянно добавляется к -структурному журналу фиксации.
В Kafka разделы раздела не могут быть разделены между несколькими брокерами. Теперь в ситуациях, когда Kafka необходимо удалить некоторые сообщения из разделов после окончания периода хранения, необходимо выполнить сканирование файлов разделов. Эта операция будет очень медленной, если существует один большой файл раздела. Чтобы избежать этого, Kafka разбивает разделы на несколько сегментов.
Новые файлы сегментов, созданные, когда текущий (называемый активным сегментом) достиг своего предела размера (контролируется свойством log.segment.bytes
). Таким образом, для каждого сегмента есть файл log
и присутствует файл index
.
Теперь каждый сегмент начинается с смещения базы, которое больше смещения в предыдущих сегментах.
Файл журнала, например. 00000000005120942793.log
- это где Kafka фактически хранит сообщения вместе со всеми деталями, такими как offset (как только сообщение вставляется в Kafka, ему присваивается уникальный порядковый номер Offset
.), метка времени, сжатие, полезная нагрузка и т.д.
индексные файлы, например. 00000000005120942793.index
отобразить фактические позиции сообщений в журнале. Он обычно состоит из двух частей, каждый из которых имеет 4 байта. Первая часть сохраняет смещение сообщения (относительно его базового смещения), а затем сохраняет позицию сообщения. Индексные файлы сопоставляются с памятью, а Kafka использует двоичный поиск для нахождения ближайшего смещения, меньшего или равного целевому смещению.
Источник:
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