Ответ
Kafka хранит данные в виде распределенного, отказоустойчивого, append-only лога. Данные организованы в топики (topics), которые, в свою очередь, делятся на партиции (partitions).
Ключевые аспекты хранения:
Партиции (Partitions): Это основная единица параллелизма и хранения. Каждая партиция представляет собой упорядоченную, неизменяемую последовательность сообщений. Запись происходит только в конец лога.
Офсет (Offset): Каждое сообщение внутри партиции имеет уникальный последовательный номер, называемый офсетом. Офсет используется для идентификации сообщения и отслеживания позиции потребителей (consumers).
Сегменты (Segments): На физическом уровне каждая партиция представляет собой директорию на диске, содержащую файлы логов, называемые сегментами. Когда сегмент достигает определенного размера (например, 1 ГБ) или возраста, он закрывается для записи, и создается новый активный сегмент. Это упрощает удаление старых данных.
Индексные файлы: Для каждого файла сегмента (
.log
) создается соответствующий индексный файл (.index
). Индекс хранит соответствие между офсетом сообщения и его физической позицией в файле сегмента. Это позволяет Kafka быстро находить сообщения по офсету без необходимости сканировать весь файл.Репликация: Для отказоустойчивости каждая партиция реплицируется на несколько брокеров. Одна реплика является лидером (принимает запись), а остальные — последователями (копируют данные с лидера).
Политика хранения (Retention Policy): Kafka не хранит данные вечно. Старые сегменты удаляются на основе настроенной политики: либо по времени (например, хранить 7 дней), либо по размеру (например, когда размер топика превышает 50 ГБ).
// Пример конфигурации продюсера для гарантии сохранности данных
config := sarama.NewConfig()
// RequiredAcks = WaitForAll означает, что лидер будет ждать подтверждения
// от всех синхронизированных реплик, прежде чем ответить продюсеру.
// Это самая надежная, но и самая медленная настройка.
config.Producer.RequiredAcks = sarama.WaitForAll
// Включаем возвращение статуса отправки в канал Successes
config.Producer.Return.Successes = true