Что на самом деле означает «разделы Кафки неизменны»? - PullRequest
0 голосов
/ 03 октября 2019

Во всех уроках Kafka, которые я читал, все они упоминали "разделы Kafka неизменны". Однако я также читал с этого сайта https://towardsdatascience.com/log-compacted-topics-in-apache-kafka-b1aa1e4665a7, что время от времени Kafka удаляет старые сообщения в разделе (в зависимости от времени хранения, которое вы установили в команде log-compact). На приведенном ниже снимке экрана видно, что данные в разделе явно изменились после удаления дубликатов ключей в разделе:

enter image description here

Так что мой вопрос в том, чточто значит сказать "разделы Кафки неизменны"?

Ответы [ 3 ]

1 голос
/ 03 октября 2019

Разделы Tha Kafka определяются как «неизменяемые», ссылаясь на тот факт, что производитель может просто добавлять сообщения к самому разделу и не изменять значение для существующего (т. Е. С тем же ключом). Сам раздел является журналом фиксации, работающим только в режиме добавления с точки зрения производителя. Конечно, это означает, что без каких-либо механизмов, таких как удаление (по времени хранения) и сжатие, размер раздела может расти бесконечно. В этот момент вы можете подумать .. "так что это не является неизменным!"как вы упомянули. Ну, как я уже сказал, неизменность с точки зрения производителя. Удаление и уплотнение являются административными операциями. Например, удаление записей также возможно с использованием Admin Client API ... но мы всегда говорим о административных вещах, а не о материалах, связанных с производителем / потребителем.

Если вы думаете о сжатии и о том, как оно работает, производительпервоначально отправляет, например, сообщение с ключом = A и полезной нагрузкой = "Hello". Через некоторое время, чтобы «обновить» значение, он отправляет новое сообщение с тем же ключом = A и payload = «Hi» ... но на самом деле это действительно новое сообщение, добавляемое в конец журнала раздела;это будет поток сжатия в брокере, выполняющий работу по удалению старого сообщения с полезной нагрузкой «Hello», оставляя только новое. Таким же образом производитель может отправить сообщение с ключом = A и полезной нагрузкой = null. Это способ фактически удалить сообщение (ноль называется "надгробная плита"). В любом случае, производитель все еще добавляет новое сообщение в раздел;это всегда поток уплотнения, который удалит последнее сообщение с ключом = A, когда увидит надгробную плиту.

1 голос
/ 04 октября 2019

Данные в Kafka хранятся в темах, темы разбиты на разделы, каждый раздел далее делится на сегменты и, наконец, каждый сегмент имеет файл журнала для хранения фактического сообщения, файл индекса для хранения позициисообщения в файле журнала и в файле временного индекса, например:

$ ls -l /mnt/data/kafka/*consumer*/00000000004618814867*
-rw-r--r-- 1 kafka kafka 10485760 Oct  3 23:41 /mnt/data/kafka/__consumer_offsets-7/00000000004618814867.index
-rw-r--r-- 1 kafka kafka  8189913 Oct  3 23:41 /mnt/data/kafka/__consumer_offsets-7/00000000004618814867.log
-rw-r--r-- 1 kafka kafka 10485756 Oct  3 23:41 /mnt/data/kafka/__consumer_offsets-7/00000000004618814867.timeindex

В сценарии, где log.cleanup.policy (или cleanup.policy по определенной теме) установлен в удалить , происходит полное удалениенекоторые из сегментов журнала (один или несколько).

В сценарии, в котором для параметров установлено значение compact , сжатие выполняется в фоновом режиме путем периодического повторного копирования сегментов журнала: повторное копированиежурнал от начала до конца удаляет ключи, которые встречаются позже в журнале. Новые чистые сегменты немедленно добавляются в журнал, поэтому необходимое дополнительное дисковое пространство - это всего лишь один дополнительный сегмент журнала (а не полная копия журнала). Другими словами, старый сегмент заменяется новым уплотненным сегментом

Подробнее о распределенных журналах:

https://kafka.apache.org/documentation.html#compaction

https://medium.com/@durgaswaroop/a-practical-introduction-to-kafka-storage-internals-d5b544f6925f

https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying

https://bookkeeper.apache.org/distributedlog/docs/0.5.0/user_guide/architecture/main

https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-1-storage-mechanics/

1 голос
/ 03 октября 2019

Индивидуальные сообщения являются неизменяемыми.

При сжатии или сохранении сообщения будут отбрасываться. Не изменяет сообщения или смещения

...